Implantação do Maven no Nexus

Implantação do Maven no Nexus

*1. Visão geral *

No um artigo anterior, discuti como um projeto Maven pode instalar localmente um jar de terceiros que ainda não foi implantado no Maven Central (ou em qualquer outro e repositórios hospedados publicamente).

Essa solução deve ser aplicada apenas em pequenos projetos nos quais a instalação, execução e manutenção de um servidor Nexus completo pode ser um exagero. No entanto, à medida que um projeto cresce,

O Nexus rapidamente se torna a única opção real e madura para hospedar artefatos de terceiros, bem como para reutilizar artefatos internos em fluxos de desenvolvimento.

Este artigo mostrará como implantar os artefatos de um projeto* no Nexus, com o Maven *.

*2. Requisitos de nexo no pom.xml *

Para que o Maven possa implantar os artefatos criados na fase package da construção, ele precisa definir as informações do repositório onde os artefatos empacotados serão implantados, através do elemento distributionManagement* *: + * *

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

Um repositório público Snapshots hospedado é disponibilizado no Nexus, portanto, não há necessidade de criar ou configurar mais nada. O Nexus facilita a determinação dos URLs de seus repositórios hospedados - cada repositório exibe a entrada exata a ser adicionada no _ <distributionManagement> _ do pom do projeto, na guia Summary.

===* 3. Plugins *

Por padrão, o Maven lida com o mecanismo de implantação por meio do maven-deploy-plugin - mapeado para a fase deployment do ciclo de vida padrão do 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>

O maven-deploy-plugin é uma opção viável para lidar com a tarefa de implantar artefatos de um projeto no Nexus, mas não foi desenvolvido para aproveitar ao máximo o que o Nexus tem a oferecer. Por esse motivo, o Sonatype criou um plug-in específico do Nexus - o nexus-staging-maven-plugin - que foi projetado para tirar o máximo proveito das funcionalidades mais avançadas que o Nexus tem a oferecer - funcionalidades como estadiamento.

Embora, para um processo simples de implantação, não exijamos a funcionalidade de preparação, continuaremos com este plug-in personalizado do Nexus, pois ele foi criado com o objetivo claro de conversar bem com o Nexus.

O único motivo para usar o maven-deploy-plugin é manter aberta a opção de usar uma alternativa ao Nexus no futuro - por exemplo, um https://www.jfrog.com/open-source/#os-arti [ Artifactory] repositório. No entanto, diferentemente de outros componentes que podem realmente mudar ao longo do ciclo de vida de um projeto, é altamente improvável que o Maven Repository Manager mude, de modo que a flexibilidade não é necessária.

Portanto, a primeira etapa do uso de outro plug-in de implantação na fase de implantação é desativar o mapeamento padrão existente:

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

Agora, podemos definir:

<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>

O objetivo deploy do plug-in é mapeado para a fase deploy da compilação do Maven.

Observe também que, conforme discutido, não precisamos da funcionalidade de temporariedade em uma implantação simples de artefatos -SNAPSHOT no Nexus, para que seja totalmente desativado por meio do elemento _ <skipStaging> _.

Por padrão, a meta de implantação inclui o fluxo de trabalho de temporariedade, recomendado para compilações de release.

===* 4. O Global settings.xml *

A implantação no Nexus é uma* operação segura *- e um usuário deployment existe para esse fim imediatamente em qualquer instância do Nexus.

A configuração do Maven com as credenciais desse usuário deployment, para que ele possa interagir corretamente com o Nexus, não pode ser feita no pom.xml do projeto. Isso ocorre porque a sintaxe do pom não permite isso, sem mencionar o fato de que o pom pode ser um artefato público, portanto, não é adequado para armazenar informações de credenciais.

As credenciais do servidor devem ser definidas no global Maven setting.xml:

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

O servidor também pode ser configurado para usar segurança baseada em chave em vez de credenciais em bruto e em texto sem formatação.

===* 5. O processo de implantação *

Executar o processo de implantação é uma tarefa simples:

mvn clean deploy -Dmaven.test.skip=true

Ignorar testes é bom no contexto de um trabalho de implantação, porque esse trabalho deve ser o último trabalho de um* pipeline de implantação *para o projeto.

Um exemplo comum de um pipeline de implantação seria uma sucessão de trabalhos Jenkins, cada um acionando o próximo apenas se for concluído com êxito. Como tal, é responsabilidade dos trabalhos anteriores no pipeline executar todos os conjuntos de testes do projeto - no momento em que o trabalho de implantação é executado, todos os testes já devem passar.

Se executou um único comando, os testes podem ser mantidos ativos para serem executados antes da fase deployment ser executada:

mvn clean deploy

===* 6. Conclusão*

Esta é uma solução simples, mas altamente eficaz para implantar artefatos do Maven no Nexus.

Também é um pouco opinativo - nexus-staging-maven-plugin é usado em vez do maven-deploy-plugin padrão; a funcionalidade de armazenamento temporário está desativada etc. - são essas opções que tornam a solução simples e prática.

A ativação potencial da funcionalidade de preparo completo pode ser o assunto de um artigo futuro.

Por fim, discutiremos o processo de lançamento no próximo artigo.