1

问题描述

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

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

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

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

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

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

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

主意

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

  • 有没有可能做到这一点?

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

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

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

4

2 回答 2

3

解决方案

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

  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 命令中。但我现在可以忍受了:)
于 2013-05-28T13:22:32.687 回答
1

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

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

于 2014-01-21T05:45:26.947 回答