Поэтапное развертывание артефактов снимков с помощью Maven и Jenkins

описание проблемы

У нас есть несколько многомодульных проектов, которые зависят друг от друга. Что-то вроде этого:

  • обмен сообщениями
  • фреймворк
  • другой компонент

У них есть отдельный репозиторий системы управления версиями, и допустим, что подмодули внутри обмена сообщениями и другого компонента используют пакеты из подмодулей framework. Все проекты представляют собой многомодульные проекты maven на основе OSGI. Все они имеют серверную часть и часть с графическим интерфейсом из одного источника (Eclipse RAP+RCP). Таким образом, получается трехэтапная сборка на основе maven для всех этих многомодульных проектов (поскольку сборки Tycho нельзя смешивать со старыми простыми сборками Maven):

  • Построение серверной части
  • Построение графического интерфейса RAP
  • Создание части RCP GUI

И, наконец, есть многомодульный проект maven конечный продукт (давайте назовем его наш продукт), который использует обмен сообщениями, фреймворк и другой компонент. Номер версии проекта наш продукт отличается от номера версии трех других проектов, которые имеют общий номер версии.

Мы строим все это с помощью Jenkins, и задания запускают друг друга в зависимости от дерева зависимостей. Компания решила использовать моментальные снимки, чтобы получить более прямую и быструю обратную связь между разработчиками трех фреймворков и разработчиками нашего продукта. Это может быть хорошей идеей, однако есть большая проблема.

Если во время цепочки сборки что-то сломается, репозиторий снимков будет содержать снимки обмена сообщениями, фреймворка и другого компонента, которые не могут работать вместе. Таким образом, разработчикам нашего продукта приходится ждать рабочего набора снимков (иначе они какое-то время не могут даже скомпилировать). Другая проблема заключается в том, что во время сборки набор моментальных снимков также не согласован.

Идея

Для обмена сообщениями, фреймворка и другого компонента в Jenkins есть определенная конечная работа. Если это завершится, набор снимков должен работать, чтобы команда нашего продукта могла его использовать. Поэтому мне нужно было бы каким-то образом СОБИРАТЬ моментальные снимки, созданные цепочкой сборки, и развертывать их, только если вся цепочка сборки прошла успешно.

  • Есть ли какая-либо существующая возможность сделать это?

Моя идея состояла в том, чтобы просто изменить задания, чтобы сделать только установить, а не развернуть. Затем, в конце концов, я мог найти созданные снимки в локальном репозитории maven и развернуть их с помощью сценария.

  • Существует некоторая концепция Staging для Maven (возможно, только с Nexus pro). Там что-то сказано о моментальных снимках?

Любая идея приветствуется. Однако я не могу изменить факт использования снимков. Так что нет смысла убеждать меня использовать релизы, а не снимки.


person Gábor Lipták    schedule 23.05.2013    source источник
comment
Не уверен насчет части развертывания, но Jenkins Copy Artifact Plugin может помочь собрать соответствующие хорошие результаты сборки.   -  person oberlies    schedule 24.05.2013


Ответы (2)


Решение

Я нашел хороший обходной путь. Шаги, которые необходимо предпринять:

  1. Шаги сборки должны выполняться во временной папке вместо обычного целевого репозитория с использованием параметра altDeploymentRepository (см. http://maven.apache.org/plugins/maven-deploy-plugin/deploy-mojo.html)

    mvn deploy -DaltDeploymentRepository=stagingFolder::default::file:///c:/mytempfolder

  2. Выполните любое количество шагов сборки с этим параметром, и артефакты будут собраны в папке. Вы даже можете возобновить сборку без проблем. Вы можете перезаписать артефакты (однако я не рекомендую это делать)

  3. Вы должны выполнить следующую команду после завершения всех шагов сборки (см. http://mojo.codehaus.org/wagon-maven-plugin/copy-mojo.html). Это загружает все артефакты, которые были временно собраны в папку:

    mvn org.codehaus.mojo:wagon-maven-plugin:copy -Dwagon.source=file:///c:/mytempfolder -Dwagon.target=http://somerepository.com/repositories/snapshots -Dwagon.targetId=idreferredinsettingsxmlдля авторизации

Важная заметка

Вагон-гол надо запускать в папке, где нет pom-файла (поэтому надо запускать без проекта). В противном случае возникает странная ошибка с параметром fromDir.

Известные ограничения

  1. Шаги сборки должны выполняться с использованием одного и того же локального репозитория, поскольку, если шагам нужны артефакты, созданные другими артефактами, они могут найти их в локальном репозитории.
  2. Это решение не считывает POM, чтобы получить репозиторий, в который следует загрузить артефакты. Это передано сегодня в команду фургона. Но теперь я могу с этим жить :)
person Gábor Lipták    schedule 28.05.2013
comment
Вам не нужно совместно использовать один и тот же локальный репозиторий Maven, если вы добавите развернутый репозиторий файлов как repository, например. через settings.xml. - person oberlies; 28.05.2013
comment
Да, но может случиться так, что вы захотите сделать все это с динамическим именем временной папки, и в этом случае редактирование settings.xml на лету — это головная боль. - person Gábor Lipták; 28.05.2013

Jenkins позволяет собирать артефакты других сборок (если они отмечают их в своей конфигурации проекта). Ваши интеграционные тесты могут использовать эту конструкцию для сбора необходимых сборок из моментальных снимков и загружать набор пакетов в Nexus только после завершения интеграционных тестов. Вы можете начать с проверки манифестов из пакетов OSGI. Я предлагаю использовать jar-signing в качестве промежуточного маркера, потому что это легко для криминалистического анализа devops.

кстати Nexus Pro имеет концепцию постановки.

person bbaassssiiee    schedule 21.01.2014
comment
Спасибо за ответ. Сейчас я полностью доволен своим решением;) - person Gábor Lipták; 21.01.2014