4

我有一个存储在 Git 中的 Maven 3 多模块项目(约 50 个模块)。多个开发人员正在处理并构建此代码,我们还有自动构建机器,每次推送时都会运行冷构建。

大多数单独的更改日志会在相当少的模块中更改代码,因此每次更改都重新构建整个源代码树是浪费时间。但是,我仍然希望运行父项目构建的最终结果与构建整个代码库相同。而且我不想开始手动对模块进行版本控制,因为这将成为交叉版本更新的噩梦。

我想做的是添加一个插件,它拦截构建或安装中的某个步骤,并获取模块内容的哈希(理想情况下从 Git 中提取),然后在共享二进制存储库中查找存储在该哈希下的工件。如果找到了,它会使用该工件,甚至不执行完整的构建。如果它在缓存中找不到任何内容,它会正常执行构建,然后将其工件存储在缓存中。重建任何具有依赖项(直接或临时)的模块也很好,这些模块本身就有缓存未命中。

有没有什么东西已经做了这样的事情了?如果没有,将它添加到 Maven 的最干净的方法是什么?似乎插件可能能够完成它,但是对于几件我很难找到正确的方式来附加到 Maven。具体来说:

  1. 您如何拦截“安装”目标以检查缓存,并且仅在缓存未命中时调用模块的“本机”安装目标?
  2. 插件应该如何将状态从一个模块传递到另一个模块,以通过更改强制重建依赖关系?

我也愿意接受完全不同的方法来实现相同的最终结果(更少的冗余构建),尽管解决方案越激烈,它在短期内对我的价值就越小。

4

2 回答 2

1

我之前已经实现了一个更复杂的解决方案,其中包含工件版本操作和部署到私有 Maven 存储库。但是,我认为这会更好地满足您的需求,并且更简单:

  1. 将您的构建拆分为多个构建(例如,使用 maven-pl参数为每​​个模块构建一个构建)。
  2. 在这些构建之间设置父子关系。(Bamboo 甚至还支持找出 Maven 依赖项,但我不确定它是如何工作的。)
  3. 配置 Maven settings.xml 以使用不同的本地存储库位置 - 在构建工作目录中指定一个新目录。请参阅文档:https ://maven.apache.org/guides/mini/guide-configuring-maven.html
  4. 使用mvn install目标确保将新构建的工件添加到本地存储库
  5. 使用 Bamboo 工件共享从本地存储库公开构建的工件 - 您可能应该过滤它以仅包含您感兴趣的包
  6. 设置依赖构建以从父构建下载所有工件并将它们放入本地存储库的适当子目录中(定制为在工作目录中)

由于 Bamboo 处理分支构建的父子关系的方式,这甚至应该适用于功能分支构建。

请注意,这意味着 Maven 将重新下载所有其他依赖项,因此您应该使用本地网络上的代理私有 Maven 存储库,例如 Artifactory 或 Nexus。

如果您愿意,我还可以描述我已经实现的更复杂的场景,包括修改工件版本和部署到私有 Maven 存储库。

于 2016-05-12T10:52:15.493 回答
0

Jenkins 插件允许您管理/最小化依赖构建

  • 每当构建 SNAPSHOT 依赖项时(由 Maven 确定)
  • 在构建其他项目之后(通过 Jenkins 作业手动)

而且,如果您执行“mvn deploy”以将构建保存到您的公司 Maven 存储库中,那么当构建在从属 Jenkins 机器上运行时,您不必担心依赖关系。结果是,除非模块或其依赖项之一发生更改,否则不会构建任何模块。

希望您可以将这些原则应用到 Bamboo 的解决方案中。

于 2014-06-04T00:08:06.320 回答