Как настроить одно задание Jenkins для создания процесса выпуска из магистрали или веток?
В настоящее время я улучшаю процесс выпуска наших проектов на Jenkins (1.430).
Текущие задания выпуска
Сегодня для одного конкретного проекта у нас есть одна работа, посвященная процессу выпуска.
Полная процедура следующая:
- Разработчик, который отвечает за выпуск, вручную изменяет версию всех файлов pom.xml(фактически используя
mvn versions:set -DnewVersion=2.0
), чтобы избавиться от -SNAPSHOT
.
- Затем он создает тег в SVN (http://my-svn-repo/project/tags/V_2_0, например).
- Как только этот тег был создан, он регистрируется на нашем сервере Jenkins и запускает сборку Release.
- Эта сборка спросит его, какой тег он хочет использовать для сборки. Задача сконфигурирована как сборка с параметрами, с тегами Subversion в списке параметров.
- Затем Jenkins построит артефакты из этого тега и развернет их в нашем экземпляре Nexus.
- Как только это будет сделано, разработчик установит версии pom.xml в новую версию разработки (т.е.
2.1-SNAPSHOT
).
Преимущество этого метода в том, что у меня есть только работа Jenkins, так как сборка будет полагаться только на тег.
Однако эта процедура включает слишком много человеческих interventiosns (изменения pom.xml, коммитов, тегов и т.д.).
Новые задания для отпуска
Теперь я использую плагин выпуска Maven.
Я создал задание, которое запрашивает три информации для пользователя, который запускает сборку:
- версия выпуска (параметр
releaseVersion
плагина выпуска);
- версия разработки после выпуска (параметр
developmentVersion
плагина выпуска);
- имя тега (параметр
tag
плагина выпуска).
Это задание отлично работает, за исключением одной точки: задание основано на соединительной линии или на ветке в SVN.
Это означает, что если у меня есть 2 ветки (в дополнение к багажнику), мне нужно будет создать 3 задания на выпуск: по одной ветки.
Одна идея сохранить лучшее из двух миров (т.е. использовать mvn-релиз, но сохранить 1 выпускное задание), чтобы добавить параметр сборки, который будет запрашивать у пользователя путь к соединительной линии/ветке.
Поэтому вместо настройки http://my-svn-repo/project/trunk
(или http://my-svn-repo/project/branches/BRANCH_V1
) в конфигурации задания я установлю http://my-svn-repo/project/$FROM_BRANCH
и попрошу пользователя ввести параметр FROM_BRANCH
.
Проблема с этим решением заключается в том, что пользователю придется вводить либо trunk
, либо branches/BRANCH_Vx
, что может привести к ошибкам.
В идеале, мне бы хотелось иметь параметр построения, который позволяет мне выбирать ветку (включая тубус), поскольку существуют теги Subversion для списка параметров для выбора тегов...
Итак, мой вопрос: есть ли лучший способ настроить работу one Дженкинса, которая может работать на всех ветвях?
Спасибо.
Изменить: я нашел Validating String плагин Jenkins, который может быть интересен, чтобы гарантировать, что значение, определенное пользователем, соответствует некоторому регулярному выражению. Это полезно в моем случае...
Ответы
Ответ 1
Вам нужна версия 1.32 плагина subversion. В этой версии была реализована проблема JENKINS-10678.
Затем вы указываете только свой URL-адрес проекта (который должен содержать сундук, ветки и теги), и он предложит вам соединительную линию вместе с вашими ветками.
Ответ 2
Просто добавьте примечания к Питеру, если вы не знакомы с дженкинсами.
Плагин subversion устанавливается по умолчанию в последних версиях (как и в сентябре 2015 г.).
Затем вы должны настроить свой проект следующим образом:
- check "Эта сборка параметризуется" (этот проект параметризуется в новейших версиях)
- выберите "Теги субверсии списка (и многое другое)"
- в поле имени укажите переменное имя, на которое можно ссылаться позже в URL-адресе svn. Я выбираю svnbranch здесь.
- в поле URL-адрес репозитория, укажите его URL-адрес проекта (который должен содержать соединительные линии, ветки и теги).
- заполнить другое поле в соответствии с вашими потребностями.
- в управлении исходным кодом, ссылайтесь на переменную, определенную ранее в вашем URL-адресе репозитория.
проверьте следующие скриншоты:
![введите описание изображения здесь]()
![введите описание изображения здесь]()