使用Maven和Jenkins分阶段部署快照工件

时间:2013-05-23 13:56:17

标签: maven jenkins snapshot staging tycho

问题描述

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

  • 消息
  • 框架
  • othercomponent

他们有单独的源代码控制存储库,可以说,消息传递其他组件中的子模块正在使用框架的子模块中的包。所有项目都是基于OSGI的多模块maven项目。它们都有一个服务器部分和一个源GUI部分(Eclipse RAP + RCP)。所以这最终是基于maven的三步构建,适用于所有这些多模块项目(因为Tycho构建不能与普通的旧Maven构建混合)

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

最后有一个最终产品多模块maven项目(我们称之为我们的产品),它使用消息框架其他组件。项目我们的产品的版本号与其他三个版本号不同,后者具有通用版本号。

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

如果在构建链中某些内容被破坏,则快照存储库包含消息传递框架其他组件的快照,这些快照无法一起工作。这样,我们的产品的开发人员必须等待工作快照集(否则他们甚至无法编译一段时间)。另一个问题是在构建期间,快照集也不一致。

对于消息框架其他组件,Jenkins中有一个明确的结束作业。如果完成,那么快照集必须正常工作,因此我们的产品团队可以使用它。 所以我需要以某种方式收集构建链创建的快照,并且只有在整个构建链成功时才部署它们。

  • 是否有可能这样做?

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

  • Maven有一些Staging Concept(可能只有Nexus pro)。是否有关于快照的内容?

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

2 个答案:

答案 0 :(得分:2)

解决方案

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

  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

  4. 重要提示

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

    已知限制

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

答案 1 :(得分:1)

Jenkins允许收集其他构建的工件(如果他们在项目配置中标记这些)。 您的集成测试可以使用该构造从快照构建中收集所需的构建,并且只有在完成集成测试后才将一组软件包上传到Nexus。您可以从检查OSGI包中的清单开始。我建议使用jar-signing作为登台标记,因为devops的取证分析很容易。

btw Nexus Pro有一个升级概念。