maven的buildNumber元数据如何在多个构建代理之间变得不一致?

时间:2010-05-26 20:15:08

标签: maven-2 nexus bamboo maven-metadata

我们最近在构建环境中添加了第二台构建机器,并开始经历非常奇怪的偶尔构建失败。

我有两台独立的Maven构建机器, A B ,每台机器都运行Maven 2.2.1并与共享的Nexus 1.5.0存储库管理器进行通信。我的问题是, B 上的构建偶尔会失败,因为它拒绝下载以前由 acme-1.0.0-SNAPSHOT ” > A 并上传到Nexus。

在两台机器上查看本地存储库时,我注意到存储库元数据中存在一些奇怪之处。

机器 A 的极致\ 1.0.0-SNAPSHOT \ maven-metadata-nexus.xml:

<metadata>
  <groupId>acme</groupId>
  <artifactId>acme</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <versioning>
    <snapshot>
      <buildNumber>1</buildNumber>
    </snapshot>
    <lastUpdated>20100525173546</lastUpdated>
  </versioning>
</metadata>

机器 B 的极致\ 1.0.0-SNAPSHOT \ maven-metadata-nexus.xml:

<metadata>
  <groupId>acme</groupId>
  <artifactId>acme</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <versioning>
    <snapshot>
      <buildNumber>2</buildNumber>
    </snapshot>
    <lastUpdated>20100519232317</lastUpdated>
  </versioning>
</metadata>

在Nexus的acme / 1.0.0-SNAPSHOT / maven-metadata.xml中:

<metadata>
  <groupId>acme</groupId>
  <artifactId>acme</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <versioning />
</metadata>

如果我正确解释元数据文件(在线文档很少),则机器 B 认为它具有 acme 依赖关系的更新版本(基于buildNumber)尽管机器 A 最后在机器 B 后6天(基于时间戳)建立了它。 Nexus似乎也没有意识到普遍正确的buildNumber。

这种情况怎么可能出现?我可以做些什么来阻止我的构建因元数据不一致而失败?您是否经历过类似的事情?

重要说明:

  • 两台构建计算机都有settings.xml文件,其中up​​datePolicy为“always”。
  • Nexus确实拥有由 A 构建的极致的新版本。 B 只是拒绝下载。
  • A B 是唯一上传到Nexus的计算机。
  • 两台服务器共享相同的系统时间。
  • 所涉及的所有进程都具有对元数据文件的写权限,以便可以根据需要进行更新。
  • 我无法找到描述此行为的任何打开的Maven或Nexus问题。
  • 我们的CI服务器(Atlassian Bamboo)会阻止同一个工件的构建同时发生,因此上传到Nexus时的某些竞争条件是不太可能的。

2 个答案:

答案 0 :(得分:2)

看起来您从Nexus发布了错误的maven-metadata,这看起来像是acme文件夹中的那个而不是acme / 1.0-SNAPSHOT文件夹。 (它将具有内部版本号和时间戳)。

无论如何,您是否尝试在-maven构建命令中添加-U?你可能偶然发现了一些关于永远设置的maven bug,但我确定-U可行。

答案 1 :(得分:2)

我花了一段时间,但我找到了maven bug MNG-4142的潜在问题。

以下是发生的事情:

我的 acme-1.0-SNAPSHOT (版本1)安装在 A 上,并上传到Nexus。该项目接下来构建在 B 上,其中安装了新构建的 acme-1.0-SNAPSHOT (build 2)并上传到Nexus,覆盖了构建1。

然后,当 acme-1.0-SNAPSHOT 作为依赖项的 A 计算机上发生构建时,MNG-4142启动。存储库元数据包含“true “这阻止了 A 下载 acme-1.0-SNAPSHOT 的最新版本2,因此maven构建了我的项目来对抗导致构建失败的旧版本1。即使使用-U,情况仍然如此。

正如我在这个问题上提到的,我对这种行为感到非常惊讶,并且很难想到其他分布式构建环境如何在出现这个bug的情况下工作。我们目前有一些cron作业经常将“localCopy”元数据更改为false,以便得到我认为应该是默认和正确的行为。