サードパーティのアプリケーションを使用して Artifact Registry リポジトリに接続する場合は、Artifact Registry に対して認証する必要があります。このドキュメントでは、Maven と Gradle の構成について説明します。
Cloud Build または Google Cloud ランタイム環境(Google Kubernetes Engine、Cloud Run など)に対する認証を構成する必要はありませんが、必要な権限が構成されていることを確認する必要があります。詳細については、Cloud Build と Google Cloud ランタイム環境へのデプロイに関する情報を参照してください。
始める前に
-
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
- (省略可)gcloud コマンドのデフォルトを構成します。
標準リポジトリを使用して認証を構成する場合は、バージョン ポリシーを確認し、アップロードできる Java パッケージの種類に対して Maven プロジェクトを正しく構成できるようにします。
コンソール
Google Cloud コンソールで [リポジトリ] ページを開きます。
認証するリポジトリをクリックします。
[詳細] セクションにバージョン ポリシーが表示されます。リポジトリにスナップショットのバージョン ポリシーがある場合、[スナップショットの上書きを許可] フィールドは、スナップショットがリポジトリ内の一致するスナップショットのバージョンを上書きできるかどうかを示します。
gcloud
次のコマンドを実行して、リポジトリの説明を表示します。
gcloud artifacts repositories describe REPOSITORY \ --project=PROJECT \ --location=LOCATION
ここで
- REPOSITORY はリポジトリの ID です。デフォルトの Artifact Registry リポジトリを構成した場合、このフラグがコマンドから省略されると使用されます。
- PROJECT は、プロジェクト ID です。このフラグを省略すると、現在のプロジェクトまたはデフォルトのプロジェクトが使用されます。
- LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションです。
コマンドの出力では、バージョン ポリシーに関する情報が
mavenConfig
の下に含まれています。この例では、リポジトリにスナップショットのバージョン ポリシーがあり、スナップショットはリポジトリ内の同じバージョンを上書きできません。Encryption: Google-managed key createTime: '2021-10-04T19:39:10.897404Z' format: MAVEN mavenConfig: allowSnapshotOverwrites: false versionPolicy: SNAPSHOT
リポジトリにバージョン ポリシーがない場合、
mavenConfig
の値は{}
です。
概要
Artifact Registry では、次の認証方法がサポートされています。
- 認証ヘルパーの使用
- このオプションは非常に柔軟性に優れています。Maven または Gradle の構成にヘルパーを含めると、Artifact Registry で環境内のサービス アカウントの認証情報を検索します。
- 認証情報としてサービス アカウント キーを指定
- このオプションは、アプリケーションがアプリケーションのデフォルト認証情報に対応していないものの、ユーザー名とパスワードによる認証をサポートしている場合に使用します。
サービス アカウント キーは有効期間の長い認証情報です。次のガイドラインを使用して、リポジトリへのアクセスを制限してください。
- リポジトリの操作には、専用のサービス アカウントの使用を検討してください。
- サービス アカウントに必要な最小限の Artifact Registry のロールを付与します。たとえば、アーティファクトのみをダウンロードするサービス アカウントに Artifact Registry の読み取り権を割り当てます。
- 組織内のグループが特定のリポジトリに対する異なるレベルのアクセス権を必要とする場合は、プロジェクト レベルではなくリポジトリ レベルでアクセス権を付与します。
- 認証情報管理のおすすめの方法に従います。
認証情報ヘルパーによる認証
Artifact Registry は、認証情報ヘルパーとして Maven ワゴンと Gradle プラグインを備えています。認証情報ヘルパーを使用すると、認証情報が Java プロジェクトに保存されません。代わりに Artifact Registry では次の順序で認証情報を検索します。
アプリケーションのデフォルト認証情報(ADC)。次の順序で認証情報を検索する戦略です。
GOOGLE_APPLICATION_CREDENTIALS
環境変数で定義された認証情報。Compute Engine、Google Kubernetes Engine、Cloud Run、App Engine、Cloud Run 関数のデフォルト サービス アカウントによって指定される認証情報。
コマンド
gcloud auth application-default login
からのユーザー認証情報など、Google Cloud CLI によって提供される認証情報。
GOOGLE_APPLICATION_CREDENTIALS
変数によって、アカウントの認証が明示的になるため、トラブルシューティングが容易になります。この変数を使用しない場合は、ADC が使用するアカウントに必要な権限があることを確認します。たとえば、Compute Engine VM、Google Kubernetes Engine ノード、Cloud Run リビジョン用のデフォルトのサービス アカウントには、リポジトリへの読み取り専用権限が付与されています。デフォルトのサービス アカウントを使用して、これらの環境からアップロードする場合は、権限を変更する必要があります。
認証情報ヘルパーのサービス アカウントを設定する
サービス アカウントを作成し、環境変数を使用して認証を設定する手順は次のとおりです。
アプリケーションに代わって動作するサービス アカウントを作成するか、自動化に使用する既存のサービス アカウントを選択します。
Artifact Registry で認証を設定するには、サービス アカウントのキーファイルの場所が必要です。既存のアカウントの場合は、[サービス アカウント] ページで鍵を表示し、新しい鍵を作成できます。
適切な Artifact Registry のロールをサービス アカウントに付与して、リポジトリへのアクセスを許可します。
サービス アカウント キー ファイルの場所を変数
GOOGLE_APPLICATION_CREDENTIALS
に割り当てて、Artifact Registry の認証情報ヘルパーがリポジトリとの接続時にキーを取得できるようにします。export GOOGLE_APPLICATION_CREDENTIALS=KEY-FILE
KEY-FILE はサービス アカウント キーファイルのパスです。
Maven を構成する
使用しているリポジトリのタイプに合わせて Maven を構成します。
スタンダード
次のコマンドを実行して、Java プロジェクトに追加するリポジトリ構成を出力します。
gcloud artifacts print-settings mvn \ --project=PROJECT \ --repository=REPOSITORY \ --location=LOCATION
ここで
- PROJECT は、プロジェクト ID です。このフラグを省略すると、現在のプロジェクトまたはデフォルトのプロジェクトが使用されます。
- REPOSITORY はリポジトリの ID です。デフォルトの Artifact Registry リポジトリを構成した場合、このフラグがコマンドから省略されると使用されます。
- LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションです。
返された設定を、Maven プロジェクト用の
pom.xml
ファイル内の適切なセクションに追加します。ファイルの構造の詳細については、Maven の POM リファレンスをご覧ください。次の例では、スナップショットとリリースの両方のバージョンを保存するリポジトリの設定を示します。
<distributionManagement> <snapshotRepository> <id>artifact-registry</id> <url>artifactregistry://LOCATION-maven.pkg.dev/PROJECT/REPOSITORY</url> </snapshotRepository> <repository> <id>artifact-registry</id> <url>artifactregistry://LOCATION-maven.pkg.dev/PROJECT/REPOSITORY</url> </repository> </distributionManagement> <repositories> <repository> <id>artifact-registry</id> <url>artifactregistry://LOCATION-maven.pkg.dev/PROJECT/REPOSITORY</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <build> <extensions> <extension> <groupId>com.google.cloud.artifactregistry</groupId> <artifactId>artifactregistry-maven-wagon</artifactId> <version>2.2.1</version> </extension> </extensions> </build>
<release>
要素と<snapshot>
要素は、リポジトリがリリース パッケージ、スナップショット パッケージ、またはその両方を保存するかどうかを示します。これらの設定は、リポジトリのバージョン ポリシーに対応している必要があります。<build>
要素は、Artifact Registry ワゴンを拡張機能として定義します。ワゴンについては、Artifact Registry Maven ツールのドキュメントをご覧ください。
リモートまたは仮想
プロジェクトの
pom.xml
ファイルを編集します。ファイルの構造の詳細については、Maven の POM リファレンスをご覧ください。次の例では、スナップショットとリリースの両方のバージョンを保存するリモート リポジトリの設定を示します。この例では、プロジェクトに Guava パッケージのバージョンに対する依存関係があります。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.google.hello</groupId> <artifactId>repo-config</artifactId> <version>4.1-SNAPSHOT</version> <description>version 1 release</description> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>28.0-jre</version> </dependency> </dependencies> <repositories> <repository> <id>central</id> <name>Maven Central remote repository</name> <url>artifactregistry://LOCATION-maven.pkg.dev/PROJECT_ID/REMOTE-REPOSITORY-NAME</url> <layout>default</layout> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <build> <extensions> <extension> <groupId>com.google.cloud.artifactregistry</groupId> <artifactId>artifactregistry-maven-wagon</artifactId> <version>2.2.1</version> </extension> </extensions> </build> </project>
<repositories>
セクションでは、Artifact Registry リポジトリを定義します。リモート リポジトリの場合は、<id>
要素をcentral
に設定する必要があります。この設定は、Super POM から継承されたcentral
リポジトリ ID のデフォルト値をオーバーライドします。<build>
セクションでは、Artifact Registry ワゴンを拡張機能として設定します。ワゴンについては、Artifact Registry Maven ツールのドキュメントをご覧ください。この例で、
<dependencies>
セクションは、Guava パッケージ バージョン28.0-jre
への依存関係を設定します。
Maven は、
pom.xml
で定義されているワゴンを適用する前に、次のような依存関係を解決します。<parent>
要素を使用した、子 Maven プロジェクト内の親プロジェクトへの参照。- Artifact Registry に保存されているプラグインの依存関係。
プロジェクトでこれらの依存関係を解決する必要がある場合は、コア拡張機能メカニズムを使用して、Maven が親 POM ファイルとプラグインを見つけることができるようにする必要があります。
プロジェクトで、次の内容を含むファイル
${maven.projectBasedir}/.mvn/extensions.xml
を作成します。<extension>
要素はワゴンを定義します。<extensions xmlns="http://maven.apache.org/EXTENSIONS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/EXTENSIONS/1.0.0 http://maven.apache.org/xsd/core-extensions-1.0.0.xsd"> <extension> <groupId>com.google.cloud.artifactregistry</groupId> <artifactId>artifactregistry-maven-wagon</artifactId> <version>2.2.1</version> </extension> </extensions>
以上により、Maven で、Artifact Registry から親またはプラグインの依存関係を解決できるようになりました。
認証構成は完了しました。
Gradle を構成する
使用しているリポジトリのタイプに合わせて Gradle を構成します。
スタンダード
次のコマンドを実行して、Java プロジェクトに追加するリポジトリ構成を出力します。
gcloud artifacts print-settings gradle \ --project=PROJECT \ --repository=REPOSITORY \ --location=LOCATION
ここで
- PROJECT は、プロジェクト ID です。このフラグを省略すると、現在のプロジェクトまたはデフォルトのプロジェクトが使用されます。
- REPOSITORY はリポジトリの ID です。デフォルトの Artifact Registry リポジトリを構成した場合、このフラグがコマンドから省略されると使用されます。
- LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションです。
リポジトリ設定を
build.gradle
ファイルに追加します。次の例は、出力されたセクションの相対的な位置を示しています。plugins { id "maven-publish" id "com.google.cloud.artifactregistry.gradle-plugin" version "2.2.1" } publishing { publications { mavenJava(MavenPublication) { groupId 'maven.example.id' from components.java } } repositories { maven { url "artifactregistry://LOCATION-maven.pkg.dev/PROJECT/REPOSITORY" } } } repositories { maven { url "artifactregistry://LOCATION-maven.pkg.dev/PROJECT/REPOSITORY" } }
plugins
セクションでは、Artifact Registry プラグインを宣言します。プラグインについては、Artifact Registry Maven ツールのドキュメントをご覧ください。publishing
セクションでは、アップロードするファイルとターゲットの Artifact Registry リポジトリを定義します。アップロードする準備ができたら、publications
セクション内のファイルリストを更新できます。公開設定の詳細については、Maven Publish プラグインのドキュメントをご覧ください。
リモートまたは仮想
リポジトリ設定を
build.gradle
ファイルに追加します。次の例では、リモート リポジトリの設定を示します。この例では、プロジェクトに Guava パッケージのバージョンに対する依存関係があります。
plugins { id 'java' id "maven-publish" id "com.google.cloud.artifactregistry.gradle-plugin" version "2.2.1" id 'maven' } repositories { maven { url "artifactregistry://LOCATION-maven.pkg.dev /PROJECT_ID/REMOTE-REPOSITORY-NAME" } } dependencies { compile "com.google.guava:guava:31.1-jre" }
plugins
セクションでは、Artifact Registry プラグインを宣言します。プラグインについては、Artifact Registry Maven ツールのドキュメントをご覧ください。repositories
セクションでは、Artifact Registry リポジトリを定義します。この例で、
dependencies
セクションは、Guava パッケージ バージョン31.1-jre
への依存関係を設定します。
dependencies
セクションで、パッケージの依存関係を定義します。init.gradle
ファイルまたはsettings.gradle
ファイルでリポジトリを使用する必要がある場合は、プラグイン構成をそれらのファイルに追加できます。init.gradle
で、次の構成を追加します。initscript { repositories { maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath "gradle.plugin.com.google.cloud.artifactregistry:artifactregistry-gradle-plugin:2.2.1" } } apply plugin: com.google.cloud.artifactregistry.gradle.plugin.ArtifactRegistryGradlePlugin
settings.gradle には、次の構成を追加します。
buildscript { repositories { maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath "gradle.plugin.com.google.cloud.artifactregistry:artifactregistry-gradle-plugin:2.2.1" } } apply plugin: "com.google.cloud.artifactregistry.gradle-plugin"
認証構成は完了しました。
パスワード認証の構成
Java アプリケーションで指定されたユーザー名とパスワードによる認証が必要な場合は、この方法を使用します。
パスワード認証用のサービス アカウントを設定する
サービス アカウントの作成:
アプリケーションに代わって動作するサービス アカウントを作成するか、自動化に使用する既存のサービス アカウントを選択します。
Artifact Registry で認証を設定するには、サービス アカウントのキーファイルの場所が必要です。既存のアカウントの場合は、[サービス アカウント] ページで鍵を表示し、新しい鍵を作成できます。
現在の gcloud CLI セッションでサービス アカウントを有効にする場合は、次のコマンドを実行します。
gcloud auth activate-service-account ACCOUNT --key-file=KEY-FILE
ここで
- ACCOUNT は、ユーザーまたはサービス アカウントです。
- KEY-FILE はサービス アカウントの JSON キーファイルのパスです。
Maven を構成する
使用しているリポジトリのタイプに合わせて Maven を構成します。
スタンダード
次のコマンドを実行して、Java プロジェクトに追加するリポジトリ構成を出力します。
gcloud artifacts print-settings mvn \ --project=PROJECT \ --repository=REPOSITORY \ --location=LOCATION \ --json-key=KEY-FILE
ここで
- PROJECT は、プロジェクト ID です。このフラグを省略すると、現在のプロジェクトまたはデフォルトのプロジェクトが使用されます。
- REPOSITORY はリポジトリの ID です。デフォルトの Artifact Registry リポジトリを構成した場合、このフラグがコマンドから省略されると使用されます。
- LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションです。
- KEY-FILE はサービス アカウントの JSON キーファイルのパスです。
このコマンドは、秘密鍵の base64 でエンコードされたバージョンを含む、Java プロジェクトに含める設定を返します。
- 返された
<project>
要素内のリポジトリ設定を、Maven プロジェクト用のpom.xml
ファイルの適切なセクションに追加します。ファイルの構造の詳細については、Maven の POM リファレンスをご覧ください。
<project> <distributionManagement> <snapshotRepository> <id>artifact-registry</id> <url>https://LOCATION-maven.pkg.dev/PROJECT/REPOSITORY</url> </snapshotRepository> <repository> <id>artifact-registry</id> <url>https://LOCATION-maven.pkg.dev/PROJECT/REPOSITORY</url> </repository> </distributionManagement> <repositories> <repository> <id>artifact-registry</id> <url>https://LOCATION-maven.pkg.dev/PROJECT/REPOSITORY</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> </project>
<release>
要素と<snapshot>
要素は、リポジトリがリリース パッケージ、スナップショット パッケージ、またはその両方を保存するかどうかを指定します。これらの設定は、リポジトリのバージョン ポリシーに対応している必要があります。- 返された
<settings>
要素内の認証設定を~/.m2/settings.xml
ファイルの<servers>
セクションに追加します。次の例では、KEY
はキーファイルの base64 でエンコードされた鍵です。
詳細については、Maven 設定リファレンスをご覧ください。
<settings> <servers> <server> <id>artifact-registry</id> <configuration> <httpConfiguration> <get> <usePreemptive>true</usePreemptive> </get> <head> <usePreemptive>true</usePreemptive> </head> <put> <params> <property> <name>http.protocol.expect-continue</name> <value>false</value> </property> </params> </put> </httpConfiguration> </configuration> <username>_json_key_base64</username> <password>KEY</password> </server> </servers> </settings>
リモートまたは仮想
リポジトリ設定を、Maven プロジェクトの
pom.xml
ファイルの適切なセクションに追加します。ファイルの構造の詳細については、Maven の POM リファレンスをご覧ください。<repositories> <repository> <id>central</id> <name>Maven Central remote repository</name> <url>artifactregistry://LOCATION-maven.pkg.dev/PROJECT_ID/REMOTE-REPOSITORY-NAME</url> <layout>default</layout> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories>
<repositories>
セクションでは、Artifact Registry リポジトリを定義します。リモート リポジトリの場合は、<id>
要素をcentral
に設定する必要があります。この設定は、Super POM から継承されたcentral
リポジトリ ID のデフォルト値をオーバーライドします。次のコマンドを使用して、キーファイルを base64 でエンコードします。KEY-FILE は、鍵ファイルの名前に置き換えます。
base64 -w 0 KEY-FILE
<settings>
要素内の認証設定を、~/.m2/settings.xml
ファイルの<servers>
セクションに追加します。
詳細については、Maven 設定リファレンスをご覧ください。
<settings> <servers> <server> <id>artifact-registry</id> <configuration> <httpConfiguration> <get> <usePreemptive>true</usePreemptive> </get> <head> <usePreemptive>true</usePreemptive> </head> <put> <params> <property> <name>http.protocol.expect-continue</name> <value>false</value> </property> </params> </put> </httpConfiguration> </configuration> <username>_json_key_base64</username> <password>KEY</password> </server> </servers> </settings>
認証構成は完了しました。
Gradle を構成する
使用しているリポジトリのタイプに合わせて Gradle を構成します。
スタンダード
次のコマンドを実行して、Java プロジェクトに追加するリポジトリ構成を出力します。
gcloud artifacts print-settings gradle \ --project=PROJECT \ --repository=REPOSITORY \ --location=LOCATION \ --json-key=KEY-FILE
ここで
- PROJECT は、プロジェクト ID です。
- REPOSITORY は、リポジトリの ID または完全修飾識別子です。デフォルトの Artifact Registry リポジトリを構成した場合、このフラグがコマンドから省略されると使用されます。
- KEY-FILE はサービス アカウントの JSON キーファイルのパスです。コマンドを実行してサービス アカウントを有効にした場合、このフラグは省略できます。
このコマンドは、秘密鍵の base64 でエンコードされたバージョンを含む、Java プロジェクトに含める設定を返します。
返された構成の次の行は、サービス アカウント キーの
artifactRegistryMavenSecret
という名前の変数を定義します。この行を~/.gradle/gradle.properties
ファイルに追加して、ビルドやソース管理リポジトリに鍵が表示されないようにします。artifactRegistryMavenSecret = KEY
この行では、KEY はサービスのサービス アカウント キーファイル内の秘密鍵です。
_json_key_base64
の場合、artifactRegistryMavenSecret
は、パスワードとして base64 でエンコードされた鍵に設定されます。build.gradle
で、リポジトリ設定を指定します。plugins { id "maven-publish" } publishing { publications { mavenJava(MavenPublication) { groupId 'maven.example.id' from components.java } } repositories { maven { url "https://LOCATION-maven.pkg.dev/PROJECT/REPOSITORY" credentials { username = "_json_key_base64" password = "$artifactRegistryMavenSecret" } authentication { basic(BasicAuthentication) } } } } repositories { maven { url "https://LOCATION-maven.pkg.dev/PROJECT/REPOSITORY" credentials { username = "_json_key_base64" password = "$artifactRegistryMavenSecret" } authentication { basic(BasicAuthentication) } } }
repositories
セクションでは、認証用のリポジトリ URL と認証情報を設定します。publishing
セクションでは、アップロードするファイルとターゲットの Artifact Registry リポジトリを定義します。アップロードする準備ができたら、publications
セクション内のファイルリストを更新できます。公開設定の詳細については、Maven Publish プラグインのドキュメントをご覧ください。
リモートまたは仮想
次のコマンドを使用して、鍵ファイルを Base64 エンコードします。KEY-FILE は、キーファイルの名前に置き換えます。
base64 -w 0 KEY-FILE
~/.gradle/gradle.properties
ファイルに次の行を追加して、ビルドやソース管理リポジトリに鍵が表示されないようにします。artifactRegistryMavenSecret = KEY
この行の KEY は、base64 エンコードされた鍵ファイルの内容です。
リポジトリ設定を
build.gradle
ファイルに追加します。
次の例では、リモート リポジトリの構成を示します。
plugins { id 'java' id "maven-publish" id 'maven' } repositories { maven { url "artifactregistry://LOCATION-maven.pkg.dev /PROJECT_ID/REMOTE-REPOSITORY-NAME" credentials { username = "_json_key_base64" password = "$artifactRegistryMavenSecret" } authentication { basic(BasicAuthentication) } dependencies { compile "com.google.guava:guava:31.1-jre" }
repositories
セクションでは、Artifact Registry リポジトリを定義します。この例で、
dependencies
セクションは、Guava パッケージ バージョン31.1-jre
への依存関係を設定します。
dependencies
セクションで、パッケージの依存関係を定義します。
認証構成は完了しました。