我们最近在我们的构建环境中添加了第二台构建机器,并且开始遇到非常奇怪的偶尔构建失败。
我有两个单独的 Maven 构建机器A和B,每个都运行 Maven 2.2.1 并与共享的 Nexus 1.5.0 存储库管理器通信。我的问题是,在B上构建偶尔会失败,因为它拒绝下载以前由A构建并上传到 Nexus的常见依赖项“ acme-1.0.0-SNAPSHOT ”的较新版本。
查看两台机器上的本地存储库,我注意到存储库元数据中有一些奇怪之处。
机器A的 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>
如果我正确解释元数据文件(在线文档很少),机器B似乎认为它具有更新版本的acme依赖项(基于 buildNumber),尽管机器A上次构建它是在机器B 6 天后完成的(基于时间戳)。Nexus 似乎也不知道普遍正确的 buildNumber。
这种情况怎么可能出现?我可以做些什么来防止我的构建由于元数据不一致而失败?你有过类似的经历吗?
重要笔记:
- 两台构建机器都有 settings.xml 文件,其中 updatePolicy 是“始终”。
- Nexus 确实具有由A构建的更新版本的acme。B只是拒绝下载它。
- A和B是唯一上传到 Nexus 的机器。
- 两台服务器共享相同的系统时间。
- 所有涉及的进程都具有对元数据文件的写入权限,以便可以根据需要对其进行更新。
- 我找不到任何描述此行为的开放 Maven 或 Nexus 问题。
- 我们的 CI 服务器 (Atlassian Bamboo) 防止构建相同的工件同时发生,因此在上传到 Nexus 时出现一些竞争条件是不太可能的。