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 ; функциональность постановки отключена и т. д. — именно эти решения делают решение простым и практичным. Потенциальная активация полной функциональности постановки может быть темой будущей статьи. Наконец, мы обсудим процесс выпуска в следующей статье.