Maven スナップショットを使用する - CodeArtifact

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Maven スナップショットを使用する

Maven スナップショット は、最新のプロダクションブランチコードを参照する Maven パッケージの特別なバージョンです。これは最終リリース版に先行する開発版です。Maven パッケージのスナップショットバージョンは、パッケージバージョンに追加されているサフィックス SNAPSHOT で識別できます。例えば、バージョン 1.1 のスナップショットは 1.1-SNAPSHOT です。詳細については、Apache Maven プロジェクトウェブサイト上の スナップショットバージョンとは何ですか? を参照してください。

AWS CodeArtifact は、Maven スナップショットの公開と使用をサポートしています。時間ベースのバージョン番号を使用する一意のスナップショットは、サポートされている唯一のスナップショットです。Maven 2 CodeArtifact クライアントによって生成される一意でないスナップショットはサポートされていません。サポートされている Maven スナップショットは、任意の CodeArtifact リポジトリに公開できます。

でのスナップショットの公開 CodeArtifact

AWS CodeArtifact は、 などのクライアントがスナップショットの公開時にmvn使用するリクエストパターンをサポートします。そのため、Maven スナップショットの公開方法を詳しく理解していなくても、ビルドツールやパッケージマネージャーのドキュメントに従って操作することができます。より複雑な作業を行う場合、このセクションでは、 がスナップショット CodeArtifact を処理する方法について詳しく説明します。

Maven スナップショットが CodeArtifact リポジトリに公開されると、以前のバージョンはビルドと呼ばれる新しいバージョンに保持されます。Maven スナップショットが公開されるたびに、新しいビルドバージョンが作成されます。スナップショットの以前のバージョンはすべて、ビルドバージョンで保持されます。Maven スナップショットが公開されると、そのパッケージバージョンのステータスは Published に設定され、前のバージョンを含むビルドのステータスは Unlisted に設定されます。この動作は、パッケージバージョンに -SNAPSHOT サフィックスが付いている Maven パッケージバージョンのみに適用されます。

例えば、 という名前の Maven パッケージのスナップショットバージョンcom.mycompany.myapp:pkg-1は、 という名前の CodeArtifact リポジトリにアップロードされますmy-maven-repo。スナップショットバージョンは 1.0-SNAPSHOT です。この時点では、com.mycompany.myapp:pkg-1 のバージョンは公開されていません。まず、初期ビルドのアセットが以下のパスで公開されます。

PUT maven/my-maven-repo/com/mycompany/myapp/pkg-1/1.0-SNAPSHOT/pkg-1-1.0-20210728.194552-1.jar PUT maven/my-maven-repo/com/mycompany/myapp/pkg-1/1.0-SNAPSHOT/pkg-1-1.0-20210728.194552-1.pom

タイムスタンプ 20210728.194552-1 は、スナップショットビルドを公開するクライアントによって生成されることに注意してください。

.pom ファイルと.jar ファイルがアップロードされると、リポジトリに存在する唯一の com.mycompany.myapp:pkg-1 のバージョンは 1.0-20210728.194552-1 です。これは、前のパスで指定されたバージョンが 1.0-SNAPSHOT である場合でも同様です。この時点でのパッケージバージョンステータスは Unfinished です。

aws codeartifact list-package-versions --domain my-domain --repository \ my-maven-repo --package pkg-1 --namespace com.mycompany.myapp --format maven { "versions": [ { "version": "1.0-20210728.194552-1", "revision": "GipMW+599JmwTcTLaXo9YvDsVQ2bcrrk/02rWJhoKUU=", "status": "Unfinished" } ], "defaultDisplayVersion": null, "format": "maven", "package": "pkg-1", "namespace": "com.mycompany.myapp" }

次に、クライアントはパッケージバージョンの maven-metadata.xml ファイルをアップロードします。

PUT my-maven-repo/com/mycompany/myapp/pkg-1/1.0-SNAPSHOT/maven-metadata.xml

maven-metadata.xml ファイルが正常にアップロードされると、 は1.0-SNAPSHOTパッケージバージョン CodeArtifact を作成し、1.0-20210728.194552-1バージョンを に設定しますUnlisted

aws codeartifact list-package-versions --domain my-domain --repository \ my-maven-repo --package pkg-1 --namespace com.mycompany.myapp --format maven { "versions": [ { "version": "1.0-20210728.194552-1", "revision": "GipMW+599JmwTcTLaXo9YvDsVQ2bcrrk/02rWJhoKUU=", "status": "Unlisted" }, { "version": "1.0-SNAPSHOT", "revision": "tWu8n3IX5HR82vzVZQAxlwcvvA4U/+S80edWNAkil24=", "status": "Published" } ], "defaultDisplayVersion": "1.0-SNAPSHOT", "format": "maven", "package": "pkg-1", "namespace": "com.mycompany.myapp" }

この時点で、スナップショットバージョン 1.0-SNAPSHOT はビルドで使用できます。リポジトリ my-maven-repo には com.mycompany.myapp:pkg-1 の 2 つのバージョンが存在しますが、どちらも同じアセットを含んでいます。

aws codeartifact list-package-version-assets --domain my-domain --repository \ my-maven-repo --format maven --namespace com.mycompany.myapp \ --package pkg-1 --package-version 1.0-SNAPSHOT--query 'assets[*].name' [ "pkg-1-1.0-20210728.194552-1.jar", "pkg-1-1.0-20210728.194552-1.pom" ]

--package-version パラメータを 1.0-20210728.194552-1 に変更して上記と同じ list-package-version-assets コマンドを実行すると、同じ出力が得られます。

1.0-SNAPSHOT のビルドがリポジトリに追加されると、新しいビルドごとに新しい Unlisted パッケージバージョンが作成されます。バージョン 1.0-SNAPSHOT のアセットは毎回更新されるため、バージョンは常にそのバージョンの最新ビルドになります。1.0-SNAPSHOT を最新のアセットで更新するには、新しいビルドの maven-metadata.xml ファイルをアップロードします。

スナップショットバージョンを使用する

スナップショットをリクエストすると、ステータス Published を持つバージョンが返されます。これは常に Maven スナップショットの最新バージョンです。URL パス内のスナップショットバージョン (1.0-SNAPSHOT など) の代わりにビルドバージョン番号 (1.0-20210728.194552-1 など) を使用して、スナップショットの特定のビルドをリクエストすることもできます。Maven スナップショットのビルドバージョンを確認するには、ListPackageVersions 「 API CodeArtifact ガイド」の「 API」を使用して、 ステータスパラメータを に設定しますUnlisted

スナップショットバージョンを削除する

Maven スナップショットのすべてのビルドバージョンを削除するには、DeletePackageVersions削除するバージョンを指定して API を使用します。

curl を使用してスナップショットを公開する

Amazon Simple Storage Service (Amazon S3) または別のアーティファクトリポジトリ製品に保存されている既存のスナップショットバージョンがある場合は、 に再公開できます AWS CodeArtifact。が CodeArtifact Maven スナップショットをサポートするため (「」を参照でのスナップショットの公開 CodeArtifact)、 などの汎用 HTTP クライアントを使用してスナップショットを発行することは、 で説明されている Maven リリースバージョンを公開するよりも複雑curlですcurl で公開するmvngradle などの Maven クライアントでスナップショットバージョンをビルドしてデプロイする場合、このセクションの記載は適用されないことに注意してください。対象のクライアントのドキュメントに従ってください。

スナップショットバージョンを公開するには、スナップショットバージョンの 1 つ以上のビルドを公開する必要があります。では CodeArtifact、スナップショットバージョンのビルドが n つある場合、n + 1 CodeArtifact バージョンがあります。n つのビルドバージョンはすべて ステータスでUnlisted、1 つのスナップショットバージョン (最新の公開済みビルド) は ステータスですPublished。スナップショットバージョン (つまり、「-SNAPSHOT」を含むバージョン文字列を含むバージョン) には、最新の公開ビルドと同じアセットセットが含まれています。curl を使用してこの構造を作成する最も簡単な方法は次のとおりです。

  1. curl を使用して、すべてのビルドのすべてのアセットを公開します。

  2. curl を使用して、前のビルド (最新の日付/タイムスタンプが付いたビルド) の maven-metadata.xml ファイルを公開します。これにより、バージョン文字列に「-SNAPSHOT」を含み、正しいアセットセットを含むバージョンが作成されます。

  3. UpdatePackageVersionsStatus API を使用して、最新でないすべてのビルドバージョンのステータスを に設定しますUnlisted

以下の curl コマンドを使用して、com.mycompany.app:pkg-1 パッケージのスナップショットバージョン 1.0-SNAPSHOT 用のスナップショットアセット (.jar ファイルや.pom ファイルなど) を公開します。

curl --user "aws:$CODEARTIFACT_AUTH_TOKEN" -H "Content-Type: application/octet-stream" \ -X PUT https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/maven/my_maven_repo/com/mycompany/app/pkg-1/1.0-SNAPSHOT/pkg-1-1.0-20210729.171330-2.jar \ --data-binary @pkg-1-1.0-20210728.194552-1.jar
curl --user "aws:$CODEARTIFACT_AUTH_TOKEN" -H "Content-Type: application/octet-stream" \ -X PUT https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/maven/my_maven_repo/com/mycompany/app/pkg-1/1.0-SNAPSHOT/pkg-1-1.0-20210729.171330-2.pom \ --data-binary @pkg-1-1.0-20210728.194552-1.pom

これらの例を使用する場合:

  • my_domain を CodeArtifact ドメイン名に置き換えます。

  • 111122223333 を CodeArtifact ドメイン所有者の AWS アカウント ID に置き換えます。

  • us-west-2 を、 CodeArtifact ドメインがある AWS リージョン に置き換えます。

  • my_maven_repo を CodeArtifact リポジトリ名に置き換えます。

重要

--data-binary パラメータの値には @ 文字をプレフィックスとして付ける必要があります。値を引用符で囲む場合は、@ を引用符で囲む必要があります。

ビルドごとにアップロードするアセットが 3 つ以上ある場合があります。例えば、メインの JAR と pom.xml に加えて Javadoc ファイルとソース JAR ファイルがある場合があります。はアップロードされたアセットごとにチェックサムを自動的に生成するため CodeArtifact、パッケージバージョンアセットのチェックサムファイルを公開する必要はありません。アセットが正しくアップロードされたことを確認するには、list-package-version-assets コマンドを使用して生成されたチェックサムを取得し、元のチェックサムと比較します。が Maven チェックサム CodeArtifact を処理する方法の詳細については、「」を参照してください Maven チェックサムの使用

次の curl コマンドを使用して、最新のビルドバージョンの maven-metadata.xml ファイルを公開します。

curl --user "aws:$CODEARTIFACT_AUTH_TOKEN" -H "Content-Type: application/octet-stream" \ -X PUT https://my_domain-111122223333.d.codeartifact.us-west-2.amazonaws.com/maven/my_maven_repo/com/mycompany/app/pkg-1/1.0-SNAPSHOT/maven-metadata.xml \ --data-binary @maven-metadata.xml

maven-metadata.xml ファイルは、<snapshotVersions> エレメントの最新ビルドバージョンのアセットを少なくとも 1 つ参照している必要があります。また <timestamp> 値があり、アセットファイル名のタイムスタンプと一致している必要があります。例えば、以前に公開された 20210729.171330-2 ビルドの場合、maven-metadata.xml の内容は次のようになります。

<?xml version="1.0" encoding="UTF-8"?> <metadata> <groupId>com.mycompany.app</groupId> <artifactId>pkg-1</artifactId> <version>1.0-SNAPSHOT</version> <versioning> <snapshot> <timestamp>20210729.171330</timestamp> <buildNumber>2</buildNumber> </snapshot> <lastUpdated>20210729171330</lastUpdated> <snapshotVersions> <snapshotVersion> <extension>jar</extension> <value>1.0-20210729.171330-2</value> <updated>20210729171330</updated> </snapshotVersion> <snapshotVersion> <extension>pom</extension> <value>1.0-20210729.171330-2</value> <updated>20210729171330</updated> </snapshotVersion> </snapshotVersions> </versioning> </metadata>

maven-metadata.xml を公開した後の最後のステップは、他のすべてのビルドバージョン (最新のビルド以外のすべてのビルドバージョン) のパッケージバージョンステータスを Unlisted に設定することです。例えば、1.0-SNAPSHOT バージョンに 2 つのビルドがあり、最初のビルドが 20210728.194552-1 の場合、そのビルドを設定するコマンドは Unlisted になります。

aws codeartifact update-package-versions-status --domain my-domain --domain-owner 111122223333 \ --repository my-maven-repo --format maven --namespace com.mycompany.app --package pkg-1 \ --versions 1.0-20210728.194552-1 --target-status Unlisted

スナップショットと外部接続

Maven スナップショットは、外部接続を介して Maven パブリックリポジトリから取得することはできません。 は Maven リリースバージョンのインポート AWS CodeArtifact のみをサポートします。

スナップショットとアップストリームリポジトリ

一般的に、Maven スナップショットをアップストリームリポジトリで使用すると Maven リリースバージョンと同じように機能します。例えば、 AWS CodeArtifact ドメインに と の 2 つのリポジトリがあるとRします。ここでUUは のアップストリームですR。このような状況では、特定のパッケージ (com.mycompany.app:pkg-11.0-SNAPSHOT など) のスナップショットビルドを RU の両方に自由に公開できます。ただし、R (ダウンストリームリポジトリ) からスナップショットビルドを使用する際は、理解しておくべき重要ないくつかの動作があります。

Maven スナップショットの仕組みを示す図。
  1. 1.0-SNAPSHOTR にある場合、R からパッケージを取得するように設定されたパッケージマネージャーで取得できるのは 1.0-SNAPSHOTR アセットのみです。R を介して 1.0-SNAPSHOTU アセットを取得することはできません。これは、U のスナップショットバージョンが R のバージョンによって不可視となるためです。この動作は Maven リリースバージョンや他のパッケージフォーマットの動作と同様です。この図では、/maven/R/com/mycompany/myapp/pkg-1/1.0-SNAPSHOT/pkg-1-1.0-20221231.002230-3.jarGET は 200 (OK) HTTP レスポンスコードを返しますが、/maven/R/com/mycompany/myapp/pkg-1/1.0-SNAPSHOT/pkg-1-1.0-20221220.150959-1.jarGET は 404 (Not Found) HTTP レスポンスコードを返します。

  2. 1.0-SNAPSHOTU にあり R にない場合、R から 1.0-SNAPSHOT のアセットをプルできます。これにより、リリースバージョンと同様に 1.0-SNAPSHOTR で保持されます。

  3. 1.0-SNAPSHOTR で保持された後、ユーザーは U の追加のビルドを 1.0-SNAPSHOT に公開できます。ただし、ポイント (1) で説明した動作により、これらは R からアクセスすることはできません。つまり、スナップショットバージョンを使用する標準的な理由 (特定のスナップショットバージョンを通じて依存関係の最新ビルドを利用する理由) は、アップストリームの関係では期待どおりには機能しません。1.0-SNAPSHOT の新しいビルドが U に公開されても、コンシューマーは R にある 1.0-SNAPSHOT の最新ビルドにはアクセスできません。この問題を回避するには、R にあるバージョン 1.0-SNAPSHOT を定期的に削除するか、U から 1.0-SNAPSHOT のバージョンを取得するようにクライアントを設定してください。

  4. Unlisted スナップショットのビルドバージョンは、ダウンストリームリポジトリからアクセスできます。この図では、/maven/R/com/mycompany/myapp/pkg-1/1.0-20221220.150959-1/pkg-1-1.0-20221220.150959-1.jarGET は 200 (OK) レスポンスコードを返します。これはアップストリームリポジトリにあるアセットを要求しますが、バージョンはビルドバージョン文字列 (1.0-20221220.150959-1) を使用して指定されるため、アセットはダウンストリームリポジトリから取得できます。また、GET によりバージョン 1.0-20221220.150959-1R で保持され、パッケージバージョンのステータスは Unlisted になります。