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.