在Maven中使用缓存工件来避免冗余构建?

时间:2013-10-30 23:56:53

标签: java maven maven-3

我有一个存储在Git中的Maven 3多模块项目(~50个模块)。多个开发人员正在研究这个代码并构建它,我们还有自动构建机器,可以在每次推送时运行冷构建。

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

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

那里有什么东西可以做这样的事吗?如果没有,将最简单的方法添加到Maven会是什么?看起来插件可能能够实现它,但是对于一些部件我找不到合适的方式来连接到Maven。具体做法是:

  1. 如何拦截“安装”目标以检查缓存,并仅在缓存未命中时调用模块的“本机”安装目标?
  2. 插件如何将状态从一个模块传递到另一个模块,以确定是否发生了缓存未命中以强制重建依赖项并进行更改?
  3. 我也采用完全不同的方式来实现相同的最终结果(更少的冗余构建),尽管解决方案越激烈,它在短期内对我的价值就越小。

2 个答案:

答案 0 :(得分: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. 设置依赖构建以从父构建中下载所有构件,并将它们放入本地存储库的适当子目录中(可以自定义在工作目录中)
  7. 这应该适用于功能分支构建,这要归功于Bamboo处理分支构建的父子关系的方式。

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

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

答案 1 :(得分:0)

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

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

如果您执行'mvn deploy'将构建保存到公司Maven仓库中,那么当构建在从属Jenkins机器上运行时,您不必担心依赖性。结果是除非它或其中一个依赖项发生了变化,否则不会构建任何模块。

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