Статьи

Maven Deploy to Nexus

1. Обзор

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

Эта статья покажет, как развернуть артефакты проекта в Nexus с помощью Maven .

2. Требования Nexus в пом

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

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

Размещенный общедоступный репозиторий Snapshots поставляется из коробки на Nexus, поэтому нет необходимости создавать или настраивать что-либо еще. Nexus позволяет легко определять URL-адреса своих размещенных репозиториев — каждый репозиторий отображает точную запись, которая будет добавлена ​​в <distributionManagement> проекта, на вкладке Сводка .

3. Плагины

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

<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-плагин является жизнеспособным вариантом для Hanldle задачу развертывания артефактов проекта по Nexus, но он не был построен , чтобы в полной мере воспользоваться , что Nexus может предложить. В связи с этим Sonatype создал специальный плагин для Nexus — nexus-staging-maven-plugin — который на самом деле предназначен для того, чтобы в полной мере воспользоваться более продвинутыми функциональными возможностями, которые может предложить Nexus — такими функциями, как постановка.

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

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

<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.3</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>

The deploy goal of the plugin is mapped to the deploy phase of the Maven build.

Also notice that, as discussed, we do not need staging functionality in a simple deployment of -SNAPSHOT artifacts to Nexus, so that is fully disabled via the <skipStaging> element.

4. The Global settings.xml

Deployment to Nexus is a secured operation – and a deployment user exists for this purpose out of the box on any Nexus instance.

Configuring Maven with the credentials of this deployment user, so that it can interact correctly with Nexus, cannot be done in the pom.xml of the project. This is because the syntax of the pom doesn’t allow it, not to mention the fact that the pom may be a public artifact, so not well suited to hold credential information.

The credentials of the server has to be defined in the global Maven setting.xml:

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

The server can also be convigured to use key based security instead of raw and plaintext credentials.

5. The deployment process

Performing the deployment process is a simple task:

mvn clean deploy -Dmaven.test.skip=true

Skipping tests is OK in the context of a deployment job, because this job should be the last job from a deployment pipline for the project. A common example of such a deployment pipeline would be a succession of Jenkins jobs, each triggering the next only if it completletes succesfully. As such, it is the responsibility of the previous jobs in the pipeline to run all tests suites from the project – by the time the deployment job runs, all tests should already pass.

If ran a a single command, then tests can be kept active to run before the deployment phase executes:

mvn clean deploy

6. Conclusion

This is a simple, yet highly effective solution to deploying to Maven artifacts to Nexus. It is also somewhat oppinionated – nexus-staging-maven-plugin is used instead of the default maven-deploy-plugin; staging functionality is disabled, etc – it is these choices that make the solution simple and practical.

Potentially activating the full staging functionality can be the subject of a future article.

Finally, we’ll discuss the Release Process in the next article.