1. Обзор
В предыдущей статье этой серии мы настроили процесс развертывания с Maven на Nexus . В этой статье мы настроим процесс выпуска с помощью Maven — как в pom
проекта, так и в задании Jenkins.
2. Репозиторий в пом
Чтобы Maven мог выпустить релиз на сервер репозитория Nexus, нам нужно определить информацию о репозитории с помощью элемента DistributionManagement :
<distributionManagement>
<repository>
<id>nexus-releases</id>
<url>http://localhost:8081/nexus/content/repositories/releases</url>
</repository>
</distributionManagement>
Размещенный репозиторий релизов поставляется в Nexus по умолчанию, поэтому нет необходимости создавать его явно.
3. SCM в Maven pom
Процесс Release будет взаимодействовать с системой управления версиями проекта — это означает, что нам сначала нужно определить элемент <scm>
в нашем pom.xml
:
<scm>
<connection>scm:git:https://github.com/user/project.git</connection>
<url>http://github.com/user/project</url>
<developerConnection>scm:git:https://github.com/user/project.git</developerConnection>
</scm>
Или, используя протокол git:
<scm>
<connection>scm:git:git@github.com:user/project.git</connection>
<url>scm:git:git@github.com:user/project.git</url>
<developerConnection>scm:git:git@github.com:user/project.git</developerConnection>
</scm>
4. Плагин выпуска
Стандартный подключаемый модуль Maven, используемый процессом выпуска, — это maven-release-plugin
— конфигурация для этого подключаемого модуля минимальна:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.4.2</version>
<configuration>
<tagNameFormat>v@{project.version}</tagNameFormat>
<autoVersionSubmodules>true</autoVersionSubmodules>
<releaseProfiles>releases</releaseProfiles>
</configuration>
</plugin>
Здесь важно то, что конфигурация releaseProfiles
фактически заставит профиль Maven — профиль релизов
— стать активным во время процесса выпуска.
Именно в этом процессе плагин nexus-staging-maven-plugin
используется для выполнения развертывания в репозиторий Nexus nexus-releases :
<profiles>
<profile>
<id>releases</id>
<build>
<plugins>
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.5.1</version>
<executions>
<execution>
<id>default-deploy</id>
<phase>deploy</phase>
<goals>
<goal>deploy</goal>
</goals>
</execution>
</executions>
<configuration>
<serverId>nexus-releases</serverId>
<nexusUrl>http://localhost:8081/nexus/</nexusUrl>
<skipStaging>true</skipStaging>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
Плагин настроен на выполнение процесса Release без промежуточного механизма , как и ранее , для процесса Deployment ( skipStaging=true
).
Как и в случае с процессом развертывания, выпуск в Nexus — это защищенная операция , поэтому мы снова будем использовать пользовательскую форму Nexus для развертывания «из коробки».
Нам также необходимо настроить учетные данные для сервера nexus-releases
в глобальном файле settings.xml
( %USER_HOME%/.m2/settings.xml
):
<servers>
<server>
<id>nexus-releases</id>
<username>deployment</username>
<password>the_pass_for_the_deployment_user</password>
</server>
</servers>
Это полная конфигурация
5. Процесс выпуска
Давайте разобьем процесс релиза на маленькие и целенаправленные шаги. Мы выполняем выпуск, когда текущая версия проекта является версией SNAPSHOT, скажем, 0.1-SNAPSHOT
.
5.1. Релиз: Чистый
Очистка релиза :
- удалить дескриптор выпуска (
release.properties
) - удалите все резервные файлы POM
5.2. выпуск: подготовить
Следующая часть процесса релиза — подготовка релиза ; это будет:
- выполнить некоторые проверки — не должно быть незафиксированных изменений, и проект не должен зависеть ни от каких зависимостей SNAPSHOT
- изменить версию проекта в файле pom на полный номер релиза (убрать суффикс SNAPSHOT) — в нашем примере —
0.1
- запустить наборы тестов проекта
- зафиксировать и отправить изменения
- создать тег из этого версионного кода, отличного от SNAPSHOT
- увеличьте версию проекта в pom — в нашем примере —
0.2-SNAPSHOT
- зафиксировать и отправить изменения
5.3. релиз:выполнить
Последней частью процесса выпуска является выполнение выпуска ; это будет:
- Тег выпуска оформления заказа из SCM
- сборка и развертывание выпущенного кода
Этот второй шаг процесса зависит от выходных данных шага Prepare — release.properties
.
6. О Дженкинсе
Jenkins может выполнить процесс выпуска одним из двух способов: он может либо использовать собственные подключаемые модули выпуска, либо просто выполнить выпуск с помощью стандартного задания maven, выполняющего правильные шаги выпуска.
Существующие плагины Jenkins, ориентированные на процесс выпуска:
Однако, поскольку команда Maven для выполнения выпуска достаточно проста, мы можем просто определить стандартное задание Jenkins для выполнения операции — никаких плагинов не требуется.
Итак, для нового задания Jenkins (сборка проекта maven2/3) мы определим 2 параметра String: releaseVersion=0.1
и developmentVersion=0.2-SNAPSHOT
.
В разделе конфигурации сборки
мы можем просто настроить запуск следующей команды Maven:
Release:Clean release:prepare release:perform
-DreleaseVersion=${releaseVersion} -DdevelopmentVersion=${developmentVersion}
При запуске параметризованного задания Jenkins предложит пользователю указать значения этих параметров, поэтому каждый раз, когда мы запускаем задание, нам нужно вводить правильные значения для releaseVersion
и developmentVersion
.
Кроме того, стоит использовать плагин очистки рабочей области и установить флажок « Удалить рабочую область перед запуском сборки
» для этой сборки. Однако имейте в виду, что шаг выполнения
Release обязательно должен запускаться той же командой, что и шаг подготовки
, потому что последний шаг выполнения
будет использовать файл release.properties
, созданный с помощью prepare
. Это означает, что у нас не может быть одно задание Jenkins, работающее подготовкой
, и другое выполнение
.
7. Заключение
В этой статье показано, как реализовать процесс выпуска проекта Maven с помощью Jenkins или без него. Подобно Deployment , этот процесс использует nexus-staging-maven-plugin
для взаимодействия с Nexus и фокусируется на проекте git.