Mavenを用いたデプロイの上手な扱い方
私達が開発したコードはアーティファクトとしてパッケージ化され、他のソフトウェアコンポーネントを開発する際に依存先として利用されます。こうしたアーティファクト同士の依存に伴う複雑な課題を解決するには、JFrog Artifactoryのようなアーティファクト・リポジトリマネージャーが頼りになります。
Artifactoryは効果的なCI/CDパイプラインの一部として、大小を問わず多くの組織でバイナリを管理するための基盤となっています。
このブログ記事では開発チーム全体でのバイナリを管理する際の課題について、接続先情報を管理するためのセキュリティのベストプラクティスに焦点を当てて具体的に説明します。なお、Mavenを使用して構築されたJavaプロジェクトを例として扱いますが、どのようなプログラミング言語とパッケージタイプにも同じアプローチが適用できます。
JFrog CLIについて少しおさらい
具体的な課題と解決策を説明する前におさらいしましょう。JFrog CLIはJFrog製品へのアクセスを自動化するためのスマートクライアントとして、シンプルなインターフェースを提供します。チェックサムの最適化によるスマートなアップロードとダウンロード、File Specsのサポート、ビルド統合機能など、JFrogプラットフォームに関する多くの機能があります。また、Mavenなど人気のあるパッケージマネージャと統合し、JFrogプラットフォームと一緒に使用すると、より力を発揮します。
課題: リポジトリの接続先情報を安全に管理する
次のようなシナリオを考えてみましょう。あなたのアプリケーションはJavaで書かれており、Mavenを使ってビルド、パッケージ化されています。MavenはArtifactoryからプロジェクトの依存関係を解決し、アプリケーションのJARを作成します。これはローカルのsettings.xml内で設定されるため、開発者は依存関係がArtifactoryのMavenリポジトリから解決されていることに気付かないでしょう。プロジェクトはローカル環境でのビルド後、テストも実行されており、すべて正常に動作しています。
では、CI/CDパイプラインを見てみましょう。使用しているCIサーバー(Jenkins、CircleCI、またはJFrog Pipelinesなど)は継続的に(または定期的に)ソースコントロール・リポジトリをポーリングし、それに応じてコードをビルドしてテストするためにMavenを呼び出します。すべてが上手くいくと、新しいスナップショット・バージョンがバイナリ・リポジトリにデプロイされます。
しかし、Mavenはどのようにして新しいスナップショット・バージョンのデプロイ先を知るのでしょうか?
Mavenのデフォルトのデプロイプラグインを使用している場合、POMとsettings.xmlファイルにデプロイリポジトリへの接続先が含まれている必要があります。ほとんどの場合、開発者はビルドしたアーティファクトを直接デプロイすることはなく、デプロイリポジトリにアクセスすることもありません。つまり、CIサーバー専用のsettings.xmlファイルを維持する必要があるということです。また、POMで設定したサーバーIDがsettings.xmlのIDと一致している必要があります。
pom.xml
[...]
<distributionManagement>
<repository>
<id>internal.repo</id>
<name>MyCo Internal Repository</name>
<url>Host to Company Repository</url>
</repository>
</distributionManagement>
[...]
settings.xml
[...]
<server>
<id>internal.repo</id>
<username>maven</username>
<password>foobar</password>
</server>
[...]
この方法でデプロイメントターゲットを管理するのは不便です。異なる開発チームで管理され、異なるデプロイメントリポジトリを持つ複数のプロジェクトがある場合は、さらに厄介になります。
解決策: JFrog CLIを使用する
この問題を簡単に解決する方法を紹介します。MavenリポジトリをホストするのにJFrog Artifactoryを使用している場合に利用できる方法です。開発者の作業には変更を加えず、CIサーバー側を更新することで実現します。CIパイプラインが直接Mavenを呼び出すのではなく、Jfrog CLIを通してMavenを呼び出すのです。
1. JFrog CLIを使用してMavenのアーティファクトをビルド・デプロイする方法
以下のコマンドをローカルで実行し、CIパイプラインの一部として実装します。
- JFrog CLIをインストールします。
- Artifactoryサーバーの詳細設定を行います。
> jfrog rt c
- VCSからMavenプロジェクトをクローンし、プロジェクトのルートディレクトリに移動します。
> git clone https://github.com/jfrog/project-examples.git && cd project-examples/maven-example
- プロジェクトの依存関係の解決とデプロイ先のリポジトリ情報を設定します。
> jfrog rt mvnc
注: これで、プロジェクトのルートに新しい.jfrogディレクトリができました。このディレクトリには依存関係と配置の詳細が含まれています。必要であれば、.jfrogディレクトリをVCSにプッシュすることができます。そうすることで、CIパイプラインは毎回jfrog rt mvncを実行する必要がなくなります。また、以下のように、このディレクトリをプッシュせず、CIで毎回mvncコマンドを実行し、非対話モードで処理するオプションもあります。
> jfrog rt mvnc –server-id-resolve my-s-id –server-id-deploy my-s-id –repo-resolve-releases libs-release –repo-resolve-snapshots libs-snapshot –repo-deploy-releases libs-snapshot-local –repo-deploy-snapshots libs-release-local
2. コードのビルドとデプロイ
JFrog CLIを使用してコードをビルドすることは、1つの違いを除いて、Mavenを直接使用したビルドと似ています。Mavenのdeployプラグインを使用していないので、デプロイは「deploy」ではなく「install」を指定した場合に実行されます。
以下のコマンドを実行して、JFrog CLIでコードをビルドし、アーティファクトをデプロイします。
> jfrog rt mvn clean install
注: 上記コマンドには任意のMavenオプションを追加することができます。
最後に
これで完了です! Mavenリポジトリを簡単かつ安全に管理することができるようになりました。
MavenビルドにJFrog CLIとArtifactoryを使用することで、並列デプロイなどさらに多くの利点があります。それらについては今後のブログ記事で紹介します。
JFrog CLIをインストールして、CI/CDパイプラインへの組み込みを開始してください。
JFrog CLI開発チームは皆さまの声をお待ちしております。フィードバック、使いやすくするためのアイディア、コードのコントリビュートはいつでも大歓迎です。お気軽にGitHub Issuesへ投稿してください。