Maven と Gradle に対する認証の設定

このページでは、Maven または Gradle を認証用に構成する方法について説明します。

サードパーティ アプリケーションを使用してリポジトリに接続する場合は、Artifact Registry で認証する必要があります。

Cloud Build や Google Kubernetes Engine などの Google Cloud サービスとの統合は、認証を必要としません。ただし、これらのサービスに代わって対応する ID に、リポジトリにアクセスするための権限が付与されていることを確認する必要があります。

パッケージ管理はアルファ版です。これはアルファ版のユーザーにのみご利用いただけます。コンテナ管理で利用できる機能がすべて含まれているとは限りません。アルファ版のお申し込みには、登録フォームをご利用ください。

始める前に

  1. ターゲット リポジトリが存在しない場合は、新しいリポジトリを作成します
  2. (省略可)gcloud コマンドのデフォルトを構成します

概要

Artifact Registry では、次の認証方法をサポートしています。

認証ヘルパーの使用
このオプションは非常に柔軟性に優れています。Maven または Gradle の構成にヘルパーを含めると、Artifact Registry で環境内のサービス アカウントの認証情報を検索します。
認証情報としてサービス アカウント キーを指定する
このオプションは、アプリケーションがアプリケーションのデフォルト認証情報に対応していないものの、ユーザー名とパスワードによる認証をサポートしている場合に使用します。

サービス アカウント キーは長期間有効な認証情報です。リポジトリへのアクセスを制限するには、次のガイドラインに従います。

  • リポジトリの操作用に専用のサービス アカウントを使用することを検討してください。
  • サービス アカウントに必要な最小限の Artifact Registry のロールを付与します。たとえば、アーティファクトのみをダウンロードするサービス アカウントに Artifact Registry の読み取り権を割り当てます。
  • 組織内のグループが特定のリポジトリに対する異なるレベルのアクセス権を必要とする場合は、プロジェクト レベルではなくリポジトリ レベルでアクセス権を付与します。
  • 認証情報管理のおすすめの方法に従います。

認証情報ヘルパーによる認証

Artifact Registry は、認証情報ヘルパーとして Maven ワゴンと Gradle プラグインを備えています。認証情報ヘルパーを使用すると、認証情報が Java プロジェクトに保存されません。代わりに Artifact Registry では次の順序で認証情報を検索します。

  1. アプリケーションのデフォルト認証情報(ADC): 次の順序で認証情報を検索する戦略です。

    1. GOOGLE_APPLICATION_CREDENTIALS 環境変数で定義された認証情報。

    2. Compute Engine、Google Kubernetes Engine、Cloud Run、App Engine、Cloud Functions のデフォルト サービス アカウントによって指定される認証情報。

  2. コマンド gcloud auth application-default login から取得するユーザー認証情報など、Cloud SDK によって指定される認証情報。

GOOGLE_APPLICATION_CREDENTIALS 変数を、認証ヘルパーで使用するサービス アカウント キーに設定します。ADC でデフォルトのサービス アカウントの認証情報を使用する場合、リポジトリへのアクセスはアカウントに付与されている権限によって異なります。

サービス アカウントを作成し、環境変数を使用して認証を設定するには:

  1. アプリケーションに代わって動作するサービス アカウントを作成するか、自動化に使用する既存のサービス アカウントを選択します。

    Artifact Registry で認証を設定するには、サービス アカウントのキーファイルの場所が必要です。既存のアカウントの場合は、[サービス アカウント] ページで鍵を表示し、新しい鍵を作成できます。

    [サービス アカウント] ページに移動

  2. 適切な Artifact Registry のロールをサービス アカウントに付与して、リポジトリへのアクセスを許可します。

  3. サービス アカウント キー ファイルの場所を変数 GOOGLE_APPLICATION_CREDENTIALS に割り当てて、Artifact Registry の認証情報ヘルパーがリポジトリとの接続時にキーを取得できるようにします。

    export GOOGLE_APPLICATION_CREDENTIALS=KEY-FILE
    

    KEY-FILE はサービス アカウント キーファイルのパスです。

  4. 次のコマンドを実行して、Java プロジェクトに追加するリポジトリ構成を出力します。

    Maven

    gcloud artifacts print-settings mvn [--project=PROJECT] [--repository=REPOSITORY] \
    [--location=LOCATION]
    

    ここで

    • PROJECT は、プロジェクト ID です。 このフラグを省略すると、現在のプロジェクトまたはデフォルトのプロジェクトが使用されます。
    • REPOSITORY はリポジトリの ID です。デフォルトの Artifact Registry リポジトリを構成した場合は、このフラグがコマンドから省略されている場合に使用されます。
    • LOCATION は、リポジトリのリージョンまたはマルチリージョンのロケーションです。

    Gradle

    gcloud artifacts print-settings gradle [--project=PROJECT] [--repository=REPOSITORY] \
    [--location=LOCATION]
    

    ここで

    • PROJECT は、プロジェクト ID です。
    • REPOSITORY は、リポジトリの ID または完全修飾 ID です。デフォルトの Artifact Registry リポジトリを構成した場合は、このフラグがコマンドから省略されている場合に使用されます。
  5. Java プロジェクトを構成します。

    Maven

    1. 返された設定を、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.1.1</version>
        </extension>
      </extensions>
    </build>
    

    <build> セクションは、Artifact Registry ワゴンを拡張機能として宣言します。Wagon の詳細については、Artifact Registry Maven ツールのドキュメントをご覧ください。

    1. pom.xml ファイルが <parent> 要素を持つ親プロジェクトを参照している場合は、コア拡張機能ファイルをプロジェクトに追加します。

    Maven はワゴンを適用する前に親関係を解決します。コア拡張機能のメカニズムにより、子プロジェクトで pom.xml ファイルでワゴンを適用する前に親の依存関係を解決できます。

    プロジェクトで、次の内容のファイル ${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.1.1</version>
      </extension>
    </extensions>
    

    Maven で Artifact Registry から親の依存関係を解決できるようになりました。

    Gradle

    1. リポジトリの設定を build.gradle ファイルに追加します。次の例は、出力されたセクションの相対的な場所を示しています。

      plugins {
        id "maven-publish"
        id "com.google.cloud.artifactregistry.gradle-plugin" version "2.1.1"
      }
      
      publishing {
        publications {
             mavenJava(MavenPublication) {
                groupId 'maven.example.id'
                from components.java
             }
        }
        repositories {
          maven {
            url "artifactregistry://LOCATION-maven.pkg.dev/PROJECT/REPOSITORY"
          }
        }
      }
      
      • plugins セクションでは、Artifact Registry プラグインを宣言します。プラグインの詳細については、Artifact Registry Maven ツールのドキュメントをご覧ください。

      • publishing セクションでは、アップロードするファイルと、対象の Artifact Registry リポジトリを宣言します。アップロードの準備ができたら、publications セクションでファイルリストを更新できます。公開設定の詳細については、Maven Publish プラグインのドキュメントをご覧ください。

    2. ビルドに依存関係が含まれている場合は、ビルド内で依存関係を宣言するようにしてください。

    3. 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.1.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.1.1"
        }
      }
      apply plugin: "com.google.cloud.artifactregistry.gradle-plugin"
      

パスワード認証の構成

Java アプリケーションで指定されたユーザー名とパスワードによる認証が必要な場合は、この方法を使用します。

サービス アカウントを作成して認証を構成するには:

  1. アプリケーションに代わって動作するサービス アカウントを作成するか、CI/CD の自動化に使用する既存のサービス アカウントを選択します。

  2. 適切な Artifact Registry のロールをサービス アカウントに付与して、リポジトリへのアクセスを許可します。

  3. 現在の Cloud SDK セッションでサービス アカウントを有効にする場合は、次のコマンドを実行します。

    gcloud auth activate-service-account ACCOUNT --key-file=KEY-FILE
    

    ここで

    • ACCOUNT はユーザーまたはサービス アカウントです。
    • KEY-FILE は、サービス アカウントの JSON キーファイルのパスです。
  4. 次のコマンドを実行して、Java プロジェクトに追加するリポジトリ構成を出力します。

    Maven

    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 キーファイルのパスです。

    Gradle

    gcloud artifacts print-settings gradle [--project=PROJECT] [--repository=REPOSITORY] \
    [--location=LOCATION] --json-key=KEY-FILE
    

    ここで

    • PROJECT は、プロジェクト ID です。
    • REPOSITORY は、リポジトリの ID または完全修飾 ID です。デフォルトの Artifact Registry リポジトリを構成した場合は、このフラグがコマンドから省略されている場合に使用されます。
    • KEY-FILE は、サービス アカウントの JSON キーファイルのパスです。サービス アカウントを有効にするコマンドを実行した場合は、このフラグを省略できます。
  5. このコマンドによって返される設定で Java プロジェクトを構成します。

    Maven

    1. 返された <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>
    
    1. 返された <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>
    

    Gradle

    1. 返された構成の次の行によって、artifactRegistryMavenSecret という名前の変数がサービス アカウント キーに定義されています。次の行を ~/.gradle/gradle.properties ファイルに追加して、ビルドまたはソース管理リポジトリに鍵が表示されないようにします。

      def artifactRegistryMavenSecret = "KEY"
      

      KEY は base64 でエンコードされたサービス アカウントのバージョンです。

    2. build.gradle でリポジトリ設定を指定します。

      plugins {
        id "maven-publish"
      }
      
      publishing {
        repositories {
          maven {
            url "https://LOCATION-maven.pkg.dev/PROJECT/REPOSITORY"
          }
        }
      }
      repositories {
        maven {
          url "https://LOCATION-maven.pkg.dev/PROJECT/REPOSITORY"
          credentials {
            username = "_json_key_base64"
            password = "$artifactRegistryMavenSecret"
          }
          authentication {
            basic(BasicAuthentication)
          }
        }
      }
      

    認証構成が完了しました。ファイルを公開する前に、アップロードするファイルが publishingpublications セクションで定義されていることを確認してください。例:

    publishing {
    publications {
         mavenJava(MavenPublication) {
            groupId 'maven.example.id'
            from components.java
         }
    }
    repositories {
    ...
    }
    }
    

    公開設定の詳細については、Maven Publish プラグインのドキュメントをご覧ください。

次のステップ