Как метаданные buildNumber maven могут стать несовместимыми между несколькими агентами сборки? - PullRequest
3 голосов
/ 27 мая 2010

Недавно мы добавили второй сборочный компьютер в нашу среду сборки и начали испытывать очень странные случайные сбои сборки.

У меня есть две отдельные машины сборки 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 довольно маловероятны.

Ответы [ 2 ]

2 голосов
/ 07 июня 2010

Это заняло у меня некоторое время, но я нашел причину ошибки в maven bug MNG-4142 .

Вот что случилось:

Мой acme-1.0-SNAPSHOT (сборка 1) был установлен на A и загружен в Nexus. Затем проект был построен на B , где недавно установленный acme-1.0-SNAPSHOT (сборка 2) был установлен и загружен в Nexus, переопределяя сборку 1.

Затем, когда на компьютере A , который имел acme-1.0-SNAPSHOT в качестве зависимости, произошла сборка, MNG-4142 включился. Метаданные репозитория содержали "true", который A не смог загрузить более свежую сборку 2 acme-1.0-SNAPSHOT , и поэтому maven построил мой проект против более старой сборки 1, что привело к сбоям сборки. Это было все еще так, даже когда был использован -U.

Как я уже упоминал по этому вопросу, я весьма удивлен таким поведением и пытаюсь подумать о том, как другие распределенные среды сборки работают при наличии этой ошибки. В настоящее время у нас есть несколько заданий cron, которые часто меняют метаданные localCopy на false, чтобы получить поведение, которое, по моему мнению, должно быть по умолчанию и корректное.

2 голосов
/ 06 июня 2010

Похоже, вы отправили неверные метаданные maven из Nexus, похоже, что они находятся в папке acme, а не в acme / 1.0-SNAPSHOT. (там будет номер сборки и метка времени).

В любом случае, вы пытались добавить -U к командам сборки maven? Возможно, вы наткнулись на какую-то ошибку maven в отношении настройки всегда, но я уверен - у вас все работает.

...