【问题标题】:How to handle concurrent Maven builds on Jenkins?如何在 Jenkins 上处理并发 Maven 构建?
【发布时间】:2013-10-13 16:50:21
【问题描述】:

我经常使用 Jenkins,并且在集群上运行了许多不同的作业。时不时地有一个工作因一些模糊的错误而失败,我已经能够调试这个事实,即工作 A 正在使用工件 X,而工作 B 刚刚下载或构建了它的新版本(使用 maven) .

作业 A 因 java.lang.NoClassDefFoundError 或 ZIP 文件损坏或 Java 正在使用的某些 ZIP 实现的段错误而失败。

因此,显而易见的解决方案是使用私有本地 maven 存储库来完成作业,但这是相当昂贵的磁盘和互联网解决方案。这意味着每个作业的 maven 都会下载整个互联网。

在某些情况下,从损坏的 JAR 文件中急切加载类文件通常有助于我们限制损坏,但不想对所有内容都这样做。

还有其他解决方案吗?存储库的某种改进锁定?

【问题讨论】:

  • 您是否探索过“在构建上游/下游项目时锁定构建”选项?
  • 是的,使用它,但这几乎可以在任何依赖项下发生,所以如果我将插件用于所有事情,我一次只能使用 maven 运行一项工作:(

标签: java maven jenkins


【解决方案1】:

是的,看起来 maven 不喜欢并发访问单个本地存储库(最近打开了一个 issue,就在 7 年前)。为每项工作创建 repo 可能非常庞大。但是,有一个变量$EXECUTOR_NUMBER,所以也许您可以使用它为每个 Jenkins 执行程序创建 maven 本地 repo。

【讨论】:

  • 最好使用 Jenkins 中的配置选项,让每个 Job 或 executor 都有一个存储库。
  • @khmarbaise 是的,好点。执行器依赖的 repo 位置可以通过 jenkins 全局配置来配置。
  • @kan 该问题目前已关闭,没有实际修复,使用 $EXECUTOR_NUMBER 对于他们正在处理相同组件的大型团队来说并不是一个真正的解决方案,目前我在 Jenkins 上遇到了这个问题多分支管道。有没有其他方法可以避免这个问题?
  • @khmarbaise using repo per project 对磁盘使用并不友好,尤其是在您使用多分支时。我不确定这个库是否对Concurrent Safe Local Repository Access 有帮助,因为它存在未解决的问题并且多年未维护。这是一个很烦人的问题,
  • @MK83 您不需要为每个构建提供专用的 Maven 存储库。每个执行者都需要 repo。执行器的数量是固定的,由服务器硬件定义 - 可用的内存和 cpu 核心。通常不超过 10 个。
猜你喜欢
  • 2015-12-08
  • 2014-07-11
  • 2020-09-04
  • 2017-07-12
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 2017-07-21
相关资源
最近更新 更多