最近、ビルド環境に 2 台目のビルド マシンを追加したところ、非常に奇妙なビルド エラーが時々発生するようになりました。
AとBの2 つの別個の Maven ビルド マシンがあり、それぞれ Maven 2.2.1 を実行し、共有の Nexus 1.5.0 リポジトリ マネージャーと通信しています。私の問題は、以前にAによってビルドされ、Nexus にアップロードされた共通の依存関係 ' acme-1.0.0-SNAPSHOT 'の新しいバージョンのダウンロードを拒否するため、 Bでのビルドが失敗することがあるということです。
両方のマシンのローカル リポジトリを調べたところ、リポジトリ メタデータに奇妙な点がいくつかありました。
マシン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 は、マシン Bがビルドしてから 6 日後にマシンAが最後にビルドしたという事実にもかかわらず、(buildNumber に基づいて) acme依存関係の新しいバージョンがあると信じているようです。(タイムスタンプに基づく)。また、Nexus は一般的に正しい buildNumber を認識していないようです。
このような状況がどのように発生する可能性がありますか? 一貫性のないメタデータが原因でビルドが失敗しないようにするにはどうすればよいですか? 似たような経験はありませんか?
重要事項:
- 両方のビルド マシンには、updatePolicy が「常に」である settings.xml ファイルがあります。
- Nexus には、 Aによってビルドされた新しいバージョンのacmeが実際にあります。Bは単にダウンロードを拒否します。
- Nexus にアップロードするマシンはAとBだけです。
- 両方のサーバーが同じシステム時間を共有します。
- 関連するすべてのプロセスには、必要に応じて更新できるように、メタデータ ファイルへの書き込み権限があります。
- この動作を説明する未解決の Maven または Nexus の問題は見つかりませんでした。
- 私たちの CI サーバー (Atlassian Bamboo) は、同じアーティファクトのビルドが同時に発生するのを防ぎます。そのため、Nexus へのアップロード中に競合状態が発生する可能性はほとんどありません。