maven 的 buildNumber 元数据如何在多个构建代理之间变得不一致?
-
04-10-2019 - |
题
我们最近在构建环境中添加了第二台构建机器,并开始遇到非常奇怪的偶尔构建失败。
我有两台独立的 Maven 构建机器, A 和 乙, ,每个都运行 Maven 2.2.1 并与共享的 Nexus 1.5.0 存储库管理器通信。我的问题是建立在 乙 有时会失败,因为它拒绝下载常见依赖项的较新版本'acme-1.0.0-快照' 以前由 A 并上传至 Nexus。
查看两台机器上的本地存储库,我注意到存储库元数据中有一些奇怪的地方。
机器 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>
机器 乙的 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>
如果我正确解释元数据文件(在线文档很少),它会出现机器 乙 相信它有更新版本 极致 依赖关系(基于 buildNumber),尽管机器 A 最后一次建造是在机器安装后 6 天 乙 做了(基于时间戳)。Nexus 似乎也不知道普遍正确的 buildNumber。
怎么可能出现这种情况呢?我可以采取什么措施来防止我的构建因元数据不一致而失败?你有经历过类似的事情吗?
重要笔记:
- 两台构建机器都有 settings.xml 文件,其中 updatePolicy 为“always”。
- Nexus 确实有更新版本 极致 那是由 A. 乙 只是拒绝下载它。
- A 和 乙 是唯一上传到 Nexus 的机器。
- 两台服务器共享相同的系统时间。
- 所有涉及的进程都具有元数据文件的写入权限,以便可以根据需要更新它们。
- 我无法找到任何描述此行为的公开 Maven 或 Nexus 问题。
- 我们的 CI 服务器 (Atlassian Bamboo) 可以防止同一工件的构建同时发生,因此上传到 Nexus 时不太可能出现一些竞争情况。
解决方案 2
我花了一段时间,但我找到了 Maven bug 的根本问题 MNG-4142.
事情是这样的:
我的 acme-1.0-快照 (版本 1)安装在 A 并上传至 Nexus。该项目接下来建立在 乙 哪里新建的 acme-1.0-快照 (构建 2)已安装并上传到 Nexus,覆盖构建 1。
然后,当构建发生在 A 机器有 acme-1.0-快照 作为依赖项,MNG-4142 开始发挥作用。存储库元数据包含“true”,这阻止了 A 下载最新版本 2 acme-1.0-快照, ,所以 maven 针对旧的 build 1 构建了我的项目,这导致了构建失败。即使使用 -U 时情况仍然如此。
正如我在这个问题上提到的,我对这种行为感到非常惊讶,并且很难想象其他分布式构建环境在存在此错误的情况下如何工作。目前,我们有一些 cron 作业经常将“localCopy”元数据更改为 false,以获得我认为应该是默认且正确的行为。
其他提示
看来您从 Nexus 发布了错误的 maven-metadata,这看起来像是 acme 文件夹中的元数据,而不是 acme/1.0-SNAPSHOT 文件夹中的元数据。(其中会有内部版本号和时间戳)。
无论如何,您是否尝试过将 -U 添加到 Maven 构建命令中?您可能偶然发现了一些关于始终设置的 Maven 错误,但我确信 -U 有效。