【问题标题】:Staged deployment of snapshot artifacts with Maven and Jenkins使用 Maven 和 Jenkins 分阶段部署快照工件
【发布时间】:2013-05-18 22:13:42
【问题描述】:

问题描述

我们有几个相互依赖的多模块项目。所以是这样的:

  • 消息传递
  • 框架
  • 其他组件

他们有单独的源代码控制库,可以说,messagingothercomponent 中的子模块正在使用来自 framework 子模块的捆绑包。所有项目都是基于 OSGI 的多模块 Maven 项目。它们都有一个服务器部分和一个单一来源的 GUI 部分(Eclipse RAP+RCP)。因此,所有这些多模块项目都以基于 maven 的三步构建结束(因为 Tycho 构建不能与普通的旧 Maven 构建混合)

  • 构建服务器部分
  • 构建 RAP GUI 部分
  • 构建 RCP GUI 部分

最后还有一个 end product 多模块 maven 项目(我们称之为 ourproduct),它使用 messaging框架其他组件ourproduct 项目的版本号与其他三个不同的版本号相同。

我们使用 Jenkins 构建整个事物,作业根据依赖关系树相互触发。该公司决定使用快照在 3 个框架项目开发人员和 ourproduct 开发人员之间获得更直接、更快速的反馈。这可能是个好主意,但是有一个大问题。

如果在构建链中出现问题,则快照存储库包含 messagingframeworkothercomponent 的快照,它们不能一起工作.这样,ourproduct 的开发人员必须等待一个工作快照集(否则他们甚至无法编译一些时间)。另一个问题是,在构建过程中,快照集也不一致。

想法

对于 messagingframeworkothercomponent,Jenkins 有明确的最终任务。如果这完成了,那么这组快照必须工作,所以 ourproduct 团队可以使用它。 所以我需要以某种方式收集构建链创建的快照,并仅在整个构建链成功时部署它们。

  • 是否有现成的可能性?

我的想法是简单地将作业更改为仅 install 而不是 deploy。然后最后我可以在本地 maven repo 中查找构建的快照,并通过脚本部署它们。

  • Maven 有一些暂存概念(可能仅适用于 Nexus pro)。它有关于快照的内容吗?

欢迎任何想法。但是我无法改变使用快照的事实。所以说服我使用版本而不使用快照是没有用的。

【问题讨论】:

  • 不确定部署部分,但 Jenkins Copy Artifact Plugin 可能有助于收集匹配的“良好”构建结果。

标签: maven jenkins snapshot staging tycho


【解决方案1】:

解决方案

我找到了一个很好的解决方法。采取的步骤:

  1. 构建步骤必须使用 altDeploymentRepository 参数部署到临时文件夹而不是普通目标存储库(请参阅http://maven.apache.org/plugins/maven-deploy-plugin/deploy-mojo.html

    mvn deploy -DaltDeploymentRepository=stagingFolder::default::file:///c:/mytempfolder

  2. 使用此设置运行任意数量的构建步骤,工件将收集在文件夹中。您甚至可以毫无问题地恢复构建。您可以覆盖工件(但我不推荐)

  3. 您必须在完成所有构建步骤后运行以下命令(请参阅http://mojo.codehaus.org/wagon-maven-plugin/copy-mojo.html)。这会上传临时收集在文件夹中的所有工件:

    mvn org.codehaus.mojo:wagon-maven-plugin:copy -Dwagon.source=file:///c:/mytempfolder -Dwagon.target=http://somerepository.com/repositories/snapshots -Dwagon.targetId=idreferredinsettingsxmltogetauthorization

重要提示

wagon 目标应该在没有 pom 文件的文件夹中运行(因此它必须在没有项目的情况下运行)。否则 fromDir 参数会出现奇怪的错误。

已知限制

  1. 构建步骤应该使用相同的本地存储库运行,因为如果 这些步骤需要其他工件产生的工件,它们可以 在本地存储库中找到它。
  2. 此解决方案不会读取 POM 来获取应将工件上传到的存储库。今天,这已连接到 wagon 命令中。但我现在可以忍受了:)

【讨论】:

  • 如果将部署到的文件存储库添加为repository,则无需共享同一个本地Maven存储库,例如通过settings.xml
  • 是的,但它可能会发生,你想用动态临时文件夹名称来做整个事情,在这种情况下,动态编辑 settings.xml 是一件很痛苦的事情。
【解决方案2】:

Jenkins 允许收集其他构建的工件(如果他们在项目配置中标记了这些)。 您的集成测试可以使用该构造从快照构建中收集所需的内容,并且仅在集成测试完成后将一组捆绑包上传到 Nexus。您可以从检查 OSGI 包中的清单开始。我建议使用 jar 签名作为暂存标记,因为它很容易通过 devops 进行取证分析。

顺便说一句,Nexus Pro 有一个分段概念。

【讨论】:

  • 感谢您的回答。现在我对我的解决方案非常满意;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 2016-10-19
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
相关资源
最近更新 更多