«1. Обзор

В предыдущей статье я обсуждал, как проект Maven может локально установить сторонний jar-файл, который еще не был развернут в Maven Central (или в любом другом крупном и общедоступном репозитории).

Это решение следует применять только в небольших проектах, где установка, запуск и обслуживание полноценного сервера Nexus могут оказаться излишними. Однако по мере роста проекта

Nexus быстро становится единственным реальным и зрелым вариантом для размещения сторонних артефактов, а также для повторного использования внутренних артефактов в потоках разработки.

В этой статье показано, как развернуть артефакты проекта на Nexus с помощью Maven.

2. Требования Nexus в pom.xml

Чтобы Maven мог развертывать артефакты, которые он создает на этапе сборки пакета, ему необходимо определить информацию о репозитории, в котором будут развернуты упакованные артефакты. , с помощью элемента DistributionManagement:

<distributionManagement>
   <snapshotRepository>
      <id>nexus-snapshots</id>
      <url>http://localhost:8081/nexus/content/repositories/snapshots</url>
   </snapshotRepository>
</distributionManagement>

Размещенный общедоступный репозиторий моментальных снимков поставляется на Nexus по умолчанию, поэтому нет необходимости создавать или настраивать что-либо дополнительно. Nexus упрощает определение URL-адресов своих размещенных репозиториев — каждый репозиторий отображает точную запись, которую нужно добавить в \u003cdistributionManagement\u003e pom проекта на вкладке «Сводка».

3. Плагины

По умолчанию Maven обрабатывает механизм развертывания через maven-deploy-plugin — это соответствует фазе развертывания жизненного цикла Maven по умолчанию:

<plugin>
   <artifactId>maven-deploy-plugin</artifactId>
   <version>2.8.1</version>
   <executions>
      <execution>
         <id>default-deploy</id>
         <phase>deploy</phase>
         <goals>
            <goal>deploy</goal>
         </goals>
      </execution>
   </executions>
</plugin>

maven-deploy- Плагин является жизнеспособным вариантом для решения задачи развертывания артефактов проекта в Nexus, но он не был создан для того, чтобы в полной мере использовать то, что может предложить Nexus. Из-за этого Sonatype создала специальный плагин для Nexus — nexus-staging-maven-plugin — который на самом деле разработан, чтобы в полной мере использовать более продвинутые функции, которые может предложить Nexus, такие как staging. .

Хотя для простого процесса развертывания нам не требуется промежуточная функциональность, мы продолжим работу с этим настраиваемым подключаемым модулем Nexus, поскольку он был создан с четкой целью хорошо взаимодействовать с Nexus.

Единственная причина для использования плагина maven-deploy-plugin — сохранить возможность использования альтернативы Nexus в будущем — например, репозитория Artifactory. Однако, в отличие от других компонентов, которые могут измениться на протяжении жизненного цикла проекта, маловероятно, что Maven Repository Manager изменится, поэтому гибкость не требуется.

Итак, первым шагом в использовании другого подключаемого модуля развертывания на этапе развертывания является отключение существующего сопоставления по умолчанию:

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-deploy-plugin</artifactId>
   <version>${maven-deploy-plugin.version}</version>
   <configuration>
      <skip>true</skip>
   </configuration>
</plugin>

Теперь мы можем определить:

<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</serverId>
      <nexusUrl>http://localhost:8081/nexus/</nexusUrl>
      <skipStaging>true</skipStaging>
   </configuration>
</plugin>

Цель развертывания подключаемого модуля сопоставляется с этапом развертывания сборки Maven.

Также обратите внимание, что, как уже говорилось, нам не нужна промежуточная функциональность при простом развертывании артефактов -SNAPSHOT в Nexus, поэтому она полностью отключается с помощью элемента \u003cskipStaging\u003e.

По умолчанию цель развертывания включает промежуточный рабочий процесс, который рекомендуется для выпускных сборок.

4. Глобальные настройки.xml

Развертывание в Nexus — это защищенная операция, и для этой цели в любом экземпляре Nexus существует готовый пользователь развертывания.

Настройка Maven с учетными данными этого пользователя развертывания, чтобы он мог правильно взаимодействовать с Nexus, не может быть выполнена в pom.xml проекта. Это связано с тем, что синтаксис pom не позволяет этого, не говоря уже о том, что pom может быть общедоступным артефактом, поэтому он не очень подходит для хранения учетных данных.

Учетные данные сервера должны быть определены в глобальном файле Maven settings.xml:

<servers>
   <server>
      <id>nexus-snapshots</id>
      <username>deployment</username>
      <password>the_pass_for_the_deployment_user</password>
   </server>
</servers>

Сервер также можно настроить для использования безопасности на основе ключа вместо необработанных и открытых учетных данных.

5. Процесс развертывания

Выполнение процесса развертывания — простая задача:

mvn clean deploy -Dmaven.test.skip=true

Пропуск тестов допустим в контексте задания развертывания, поскольку это задание должно быть последним заданием из конвейера развертывания для проект.

«Типичным примером такого конвейера развертывания может быть последовательность заданий Jenkins, каждое из которых запускает следующее только в случае успешного завершения. Таким образом, предыдущие задания в конвейере несут ответственность за выполнение всех наборов тестов из проекта — к моменту запуска задания развертывания все тесты уже должны быть пройдены.

Если запущена одна команда, то тесты могут оставаться активными для запуска до выполнения фазы развертывания:

mvn clean deploy

6. Заключение

Это простое, но очень эффективное решение для развертывания артефактов Maven для Нексус.

Это также несколько самоуверенно — nexus-staging-maven-plugin используется вместо maven-deploy-plugin по умолчанию; промежуточная функциональность отключена и т. д. — именно эти варианты делают решение простым и практичным.

Потенциальная активация полной промежуточной функциональности может быть предметом будущей статьи.

Наконец, мы обсудим процесс выпуска в следующей статье.