1. Обзор
В предыдущей статье я обсуждал, как проект Maven может локально установить сторонний jar, который еще не был развернут в центральном Maven (или в любом из других больших и общедоступных репозиториев). Это решение следует применять только в небольших проектах, где установка, запуск и обслуживание полноценного сервера Nexus могут быть излишними. Однако по мере развития проекта Nexus быстро становится единственным реальным и зрелым вариантом для размещения сторонних артефактов, а также для повторного использования внутренних артефактов в потоках разработки. Эта статья покажет, как развернуть артефакты проекта в Nexus с помощью Maven .
2. Требования Nexus в пом
Чтобы Maven мог развернуть артефакты, которые он создает на этапе сборки пакета , ему необходимо определить информацию хранилища, в которой будут развернуты упакованные артефакты, с помощью элемента distributionManagement :
|
1
2
3
4
5
6
|
<distributionManagement> <snapshotRepository> <id>nexus-snapshots</id> </snapshotRepository></distributionManagement> |
Размещенный общедоступный репозиторий Snapshots поставляется из коробки на Nexus, поэтому нет необходимости создавать или настраивать что-либо еще. Nexus позволяет легко определять URL-адреса своих размещенных репозиториев — каждый репозиторий отображает точную запись, которая должна быть добавлена в <distributionManagement> проекта, на вкладке Сводка .
3. Плагины
По умолчанию Maven обрабатывает механизм развертывания через подключаемый модуль maven-deploy-plugin — это сопоставлено с фазой развертывания жизненного цикла Maven по умолчанию:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
|
<plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.7</version> <executions> <execution> <id>default-deploy</id> <phase>deploy</phase> <goals> <goal>deploy</goal> </goals> </execution> </executions></plugin> |
Плагин maven-deploy-plugin является жизнеспособным вариантом для решения задачи развертывания артефактов проекта в Nexus, но он не был создан, чтобы в полной мере воспользоваться тем, что может предложить Nexus. В связи с этим Sonatype создал специальный плагин для Nexus — nexus-staging-maven-plugin — который на самом деле предназначен для того, чтобы в полной мере воспользоваться более продвинутыми функциональными возможностями, которые может предложить Nexus — такими функциями, как постановка.
Хотя для простого процесса развертывания нам не требуется промежуточная функциональность, мы продолжим работу с этим нестандартным плагином Nexus, поскольку он был создан с явной целью хорошо общаться с Nexus. Единственная причина использовать maven-deploy-plugin — оставить возможность использовать альтернативу Nexus в будущем — например, хранилище Artifactory . Однако, в отличие от других компонентов, которые могут фактически меняться в течение жизненного цикла проекта, менеджер хранилища Maven вряд ли изменится, поэтому гибкость не требуется. Итак, первый шаг в использовании другого плагина развертывания на этапе развертывания — отключение существующего сопоставления по умолчанию:
|
1
2
3
4
5
6
7
8
|
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-deploy-plugin</artifactId> <version>${maven-deploy-plugin.version}</version> <configuration> <skip>true</skip> </configuration></plugin> |
Теперь мы можем определить:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
<plugin> <groupId>org.sonatype.plugins</groupId> <artifactId>nexus-staging-maven-plugin</artifactId> <version>1.3</version> <executions> <execution> <id>default-deploy</id> <phase>deploy</phase> <goals> <goal>deploy</goal> </goals> </execution> </executions> <configuration> <serverId>nexus</serverId> <skipStaging>true</skipStaging> </configuration></plugin> |
Цель развертывания плагина сопоставлена с фазой развертывания сборки Maven. Также обратите внимание, что, как уже говорилось, нам не нужна промежуточная функциональность при простом развертывании артефактов -SNAPSHOT в Nexus, так что он полностью отключается с помощью элемента <skipStaging> .
4. Глобальные настройки.xml
Развертывание на Nexus является защищенной операцией, и пользователь развертывания для этой цели существует из коробки на любом экземпляре Nexus. Настройка Maven с учетными данными этого пользователя развертывания , чтобы он мог правильно взаимодействовать с Nexus, не может быть выполнена в pom.xml проекта. Это связано с тем, что синтаксис pom этого не позволяет, не говоря уже о том, что pom может быть публичным артефактом, поэтому не очень хорошо подходит для хранения учетных данных.
Учетные данные сервера должны быть определены в глобальном Maven setting.xml :
|
1
2
3
4
5
6
7
|
<servers> <server> <id>nexus-snapshots</id> <username>deployment</username> <password>the_pass_for_the_deployment_user</password> </server></servers> |
Сервер также может быть настроен на использование безопасности на основе ключей вместо необработанных и незашифрованных учетных данных.
5. Процесс развертывания
Выполнение процесса развертывания является простой задачей:
|
1
|
mvn clean deploy -Dmaven.test.skip=true |
Пропуск тестов — это нормально в контексте задания на развертывание, потому что это задание должно быть последним заданием в трубопроводе развертывания для проекта. Типичным примером такого конвейера развертывания может быть последовательность заданий Jenkins, каждое из которых запускает следующее, только если оно успешно завершается. Таким образом, предыдущие задачи в конвейере несут ответственность за запуск всех наборов тестов из проекта — к моменту запуска задания развертывания все тесты уже должны пройти.
Если запускается одна команда, то тесты могут оставаться активными для запуска до выполнения этапа развертывания :
|
1
|
mvn clean deploy |
6. Заключение
Это простое, но очень эффективное решение для развертывания артефактов Maven на Nexus. Это также несколько противоречит — nexus-staging-maven-plugin используется вместо стандартного maven-deploy-plugin ; функциональность постановки отключена и т. д. — именно эти решения делают решение простым и практичным. Потенциальная активация полной функциональности постановки может быть темой будущей статьи. Наконец, мы обсудим процесс выпуска в следующей статье.