Недавно мы добавили второй сборочный компьютер в нашу среду сборки и начали испытывать очень странные случайные сбои сборки.
У меня есть две отдельные машины сборки Maven, A и B , каждая из которых работает под управлением Maven 2.2.1 и общается с общим менеджером репозитория Nexus 1.5.0. Моя проблема заключается в том, что сборка на B иногда дает сбой, потому что она отказывается загружать более новую версию общей зависимости ' acme-1.0.0-SNAPSHOT ', ранее созданную A и загружен на Nexus.
Просматривая локальные репозитории на обеих машинах, я заметил некоторые странности в метаданных репозитория.
Machine 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>
Machine 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 в последний раз строила его через 6 дней после того, как машина B делала (на основе метки времени). Nexus также, похоже, не знает об универсально правильном buildNumber.
Как эта ситуация может возникнуть? Что я могу сделать, чтобы предотвратить сбой моих сборок из-за несовместимых метаданных? Испытывали ли вы что-нибудь подобное?
Важные примечания:
- На обеих сборочных машинах есть файлы settings.xml, где updatePolicy имеет значение «Always».
- Nexus действительно имеет более новую версию acme , созданную A . B просто отказывается его скачивать.
- A и B - единственные машины, загружаемые в Nexus.
- Оба сервера используют одинаковое системное время.
- Все участвующие процессы имеют права на запись в файлы метаданных, чтобы их можно было обновлять по мере необходимости.
- Мне не удалось найти какие-либо открытые проблемы Maven или Nexus, описывающие это поведение.
- Наш CI-сервер (Atlassian Bamboo) предотвращает одновременную сборку одного и того же артефакта, поэтому некоторые условия гонки при загрузке в Nexus довольно маловероятны.