1. 概要

以前の記事で、MavenプロジェクトがMaven Central(または他の大規模で公的にホストされているリポジトリ)にまだデプロイされていないサードパーティのjarをローカルにインストールする方法について説明しました。

このソリューションは、完全なNexusサーバーのインストール、実行、および保守がやり過ぎになる可能性がある小規模なプロジェクトにのみ適用する必要があります。 ただし、プロジェクトが成長するにつれて、

Nexusはすぐに、サードパーティのアーティファクトをホストしたり、開発ストリーム全体で内部アーティファクトを再利用したりするための唯一の現実的で成熟したオプションになります。

この記事では、Mavenを使用してプロジェクトのアーティファクトをNexusにデプロイする方法を示します。

2. pom.xmlのNexus要件

Mavenがビルドのpackageフェーズで作成したアーティファクトをデプロイできるようにするには、 distributionManagement を介して、パッケージ化されたアーティファクトがデプロイされるリポジトリ情報を定義する必要があります。 ]要素

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

ホストされたパブリックSnapshotsリポジトリは、Nexusですぐに使用できるため、これ以上作成または構成する必要はありません。 Nexusを使用すると、ホストされているリポジトリのURLを簡単に判別できます。各リポジトリには、追加する正確なエントリが表示されます。 プロジェクトpomの概要タブ。

3. プラグイン

デフォルトでは、Mavenはmaven-deploy-pluginを介してデプロイメントメカニズムを処理します。これはデフォルトのMavenライフサイクルのdeploymentフェーズにマップされます。

<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-plugin は、プロジェクトのアーティファクトへのデプロイのタスクを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.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>

プラグインのdeployゴールは、Mavenビルドのdeployフェーズにマップされます。

また、説明したように、の単純な展開ではステージング機能は必要ないことに注意してください。 -スナップショット Nexusのアーティファクト。これは、 エレメント。

デフォルトでは、デプロイの目標には、リリースビルドに推奨されるステージングワークフローが含まれています。

4. グローバルsettings.xml

Nexusへの展開は、保護された操作であり、展開ユーザーは、この目的のために、Nexusインスタンスにすぐに存在します。

このdeploymentユーザーのクレデンシャルを使用して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ジョブであり、それぞれが正常に完了した場合にのみ次のジョブをトリガーします。 そのため、プロジェクトからすべてのテストスイートを実行するのは、パイプライン内の前のジョブの責任です。展開ジョブが実行されるまでに、すべてのテストはすでに合格しているはずです。

単一のコマンドを実行した場合、 deployation フェーズが実行される前に、テストをアクティブにして実行することができます。

mvn clean deploy

6. 結論

これは、MavenアーティファクトをNexusにデプロイするためのシンプルでありながら非常に効果的なソリューションです。

また、多少の意見もあります。デフォルトのmaven-deploy-pluginの代わりにnexus-staging-maven-pluginが使用されます。 ステージング機能が無効になっているなど、ソリューションをシンプルかつ実用的にするのはこれらの選択です。

完全なステージング機能をアクティブ化する可能性は、将来の記事の主題になる可能性があります。

最後に、次の記事でリリースプロセスについて説明します。