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

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

查看两台机器上的本地存储库,我注意到存储库元数据中有一些奇怪的地方。

机器 一个 的 acme\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 的 acme\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>

如果我正确地解释了元数据文件(在线文档很少),看起来 machine B 相信它有一个较新版本的 acme 依赖项(基于 buildNumber),尽管事实上 machine A 最后构建了它机器 B 执行后 6 天(基于时间戳)。 Nexus 似乎也不知道普遍正确的 buildNumber。

怎么会出现这种情况?我该怎么做才能防止我的构建因元数据不一致而失败?你有没有经历过类似的事情?

重要笔记:
  • 两台构建机器都有 settings.xml 文件,其中 updatePolicy 为“始终”。
  • Nexus 确实有更新版本的 acme A 构建。 B 只是拒绝下载它。
  • A B 是唯一上传到 Nexus 的机器。
  • 两台服务器共享相同的系统时间。
  • 涉及的所有进程都具有对元数据文件的写入权限,以便可以根据需要对其进行更新。
  • 我找不到任何描述此行为的 Unresolved Maven 或 Nexus 问题。
  • 我们的 CI 服务器 (Atlassian Bamboo) 可防止同一工件的构建同时发生,因此在上传到 Nexus 时不太可能出现某些竞争条件。
  • 最佳答案

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

    无论如何,您是否尝试将 -U 添加到 Maven 构建命令中?您可能偶然发现了一些尊重始终设置的 Maven 错误,但我确信 -U 有效。

    关于maven-2 - maven 的 buildNumber 元数据如何在多个构建代理之间变得不一致?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2916426/

    10-16 13:46