為 Maven 和 Gradle 設定 Artifact Registry 的驗證機制

使用第三方應用程式連線至 Artifact Registry 存放區時,必須向 Artifact Registry 驗證。本文件著重於 Maven 和 Gradle 的設定。

您不需要為 Cloud Build 或 Google Kubernetes Engine 和 Cloud Run 等執行階段環境設定驗證,但應確認已設定必要的權限。 Google Cloud詳情請參閱 Cloud Build 和 Google Cloud 執行階段環境的部署資訊。

事前準備

  1. Install the Google Cloud CLI. After installation, initialize the Google Cloud CLI by running the following command:

    gcloud init

    If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  2. (選用) 設定 gcloud 指令的預設值
  3. 如果您要使用標準存放區設定驗證,請確認版本政策,以便為可上傳的 Java 封裝類型正確設定 Maven 專案。

    控制台

    1. 在 Google Cloud 控制台中開啟「Repositories」(存放區) 頁面。

      開啟「存放區」頁面

    2. 按一下要驗證的存放區。

      「詳細資料」部分會顯示版本政策。如果存放區有快照版本政策,「允許覆寫快照」欄位會指出快照是否可以覆寫存放區中相符的快照版本。

    gcloud

    執行下列指令,查看存放區的說明。

    gcloud artifacts repositories describe REPOSITORY \
          --project=PROJECT \
          --location=LOCATION
    

    地點

    • REPOSITORY 是存放區的 ID。如果您已設定預設 Artifact Registry 存放區,則可省略指令中的這個旗標。
    • PROJECT 是專案 ID。如果省略這個旗標,系統會使用目前或預設專案
    • LOCATION 是存放區的區域或多區域位置

    指令的輸出內容會包含 mavenConfig 下的版本政策相關資訊。在本例中,存放區有快照版本政策,且快照無法覆寫存放區中的相同版本。

    Encryption: Google-owned and Google-managed encryption 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 Reader 角色。
  • 如果貴機構中的群組需要不同層級的特定存放區存取權,請在存放區層級而非專案層級授予存取權。
  • 遵循管理憑證的最佳做法

使用憑證輔助程式進行驗證

Artifact Registry 提供 Maven wagonGradle 外掛程式做為憑證輔助程式。使用憑證輔助程式時,憑證不會儲存在 Java 專案中。Artifact Registry 會依下列順序搜尋憑證:

  1. 應用程式預設憑證 (ADC),這項策略會依下列順序尋找憑證:

    1. GOOGLE_APPLICATION_CREDENTIALS 環境變數中定義的憑證。

    2. Compute Engine、Google Kubernetes Engine、Cloud Run、App Engine 或 Cloud Run 函式的預設服務帳戶提供的憑證。

  2. Google Cloud CLI 提供的憑證,包括來自 gcloud auth application-default login 指令的使用者憑證。

GOOGLE_APPLICATION_CREDENTIALS 變數會明確指出用於驗證的帳戶,方便進行疑難排解。如果未使用變數,請確認 ADC 可能使用的任何帳戶都具備必要的權限。舉例來說,Compute Engine VM、Google Kubernetes Engine 節點和 Cloud Run 修訂版本的預設服務帳戶,都具有存放區的唯讀存取權。如要使用預設服務帳戶從這些環境上傳,請務必修改權限。

為憑證輔助程式設定服務帳戶

如要建立服務帳戶並使用環境變數設定驗證,請按照下列步驟操作:

  1. 建立服務帳戶來代表應用程式執行動作,或選擇用於自動化的現有服務帳戶。

    您需要服務帳戶金鑰檔案的位置,才能設定 Artifact Registry 的驗證方式。如果是現有帳戶,您可以在「服務帳戶」頁面查看金鑰及建立新金鑰。

    前往「Service Accounts」(服務帳戶) 頁面

  2. 授予服務帳戶特定 Artifact Registry 角色,提供存放區存取權。

  3. 將服務帳戶金鑰檔案位置指派給 GOOGLE_APPLICATION_CREDENTIALS 變數,這樣 Artifact Registry 憑證輔助程式就能在連線至存放區時取得金鑰。

    export GOOGLE_APPLICATION_CREDENTIALS=KEY-FILE
    

    其中 KEY-FILE 是服務帳戶金鑰檔案的路徑。

設定 Maven

  1. 根據您使用的存放區類型設定 Maven。

    標準

    1. 執行下列指令,顯示要新增至 Java 專案的存放區設定。

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

      地點

      • PROJECT 是專案 ID。如果省略這個旗標,系統會使用目前或預設專案
      • REPOSITORY 是存放區的 ID。如果您設定了預設 Artifact Registry 存放區,則在指令中省略這個旗標時,系統會使用該存放區。
      • LOCATION 是存放區的區域或多區域位置
    2. 將傳回的設定新增至 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.5</version>
          </extension>
        </extensions>
      </build>
      

      <release><snapshot> 元素會指出存放區是否儲存發布套件、快照套件或兩者。這些設定應符合存放區的版本政策

      <build> 元素會將 Artifact Registry wagon 定義為擴充功能。如要瞭解 wagon,請參閱 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.5</version>
          </extension>
        </extensions>
      </build>
    </project>
    
    • <repositories> 區段會定義 Artifact Registry 存放區。如果是遠端存放區,<id> 元素必須設為 central。這項設定會覆寫從超級 POM 繼承的 central 存放區 ID 預設值。

    • <build> 區段會將 Artifact Registry wagon 設為擴充功能。如要瞭解 wagon,請參閱 Artifact Registry Maven 工具的說明文件。

    • 在本例中,<dependencies> 區段會將依附元件設為 Guava 套件版本 28.0-jre

  2. Maven 會先解析部分依附元件,再套用 pom.xml 中定義的 wagon,包括:

    • 子項 Maven 專案中,使用 <parent> 元素參照父項專案。
    • 儲存在 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.5</version>
      </extension>
    </extensions>
    

    Maven 現在可以從 Artifact Registry 解析上層或外掛程式依附元件。

驗證設定完成。

設定 Gradle

  1. 為您使用的存放區類型設定 Gradle。

    標準

    1. 執行下列指令,顯示要新增至 Java 專案的存放區設定。

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

      地點

      • PROJECT 是專案 ID。如果省略這個旗標,系統會使用目前或預設專案
      • REPOSITORY 是存放區的 ID。如果您設定了預設 Artifact Registry 存放區,則在指令中省略這個旗標時,系統會使用該存放區。
      • LOCATION 是存放區的區域或多區域位置
    2. build.gradle 檔案中新增存放區設定。以下範例顯示列印區段的相對位置。

      plugins {
        id "maven-publish"
        id "com.google.cloud.artifactregistry.gradle-plugin" version "2.2.5"
      }
      
      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.5"
      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 區段中定義套件的依附元件

  2. 如要在 init.gradlesettings.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.5"
      }
    }
    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.5"
      }
    }
    apply plugin: "com.google.cloud.artifactregistry.gradle-plugin"
    

驗證設定完成。

設定密碼驗證

如果 Java 應用程式需要使用指定的使用者名稱和密碼進行驗證,請採用這種做法。

設定服務帳戶以進行密碼驗證

建立服務帳戶的步驟如下:

  1. 建立服務帳戶來代表應用程式執行動作,或選擇用於自動化的現有服務帳戶。

    您需要服務帳戶金鑰檔案的位置,才能設定 Artifact Registry 的驗證方式。如果是現有帳戶,您可以在「服務帳戶」頁面查看金鑰及建立新金鑰。

    前往「Service Accounts」(服務帳戶) 頁面

  2. 如要在目前的 gcloud CLI 工作階段中啟用服務帳戶,請執行下列指令:

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

    地點

    • ACCOUNT 是使用者或服務帳戶。
    • KEY-FILE 是服務帳戶 JSON 金鑰檔案的路徑。

設定 Maven

  1. 根據您使用的存放區類型設定 Maven。

    標準

    1. 執行下列指令,顯示要新增至 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 金鑰檔案的路徑。

    這項指令會傳回要納入 Java 專案的設定,包括私密金鑰的 Base64 編碼版本。

    1. 在 Maven 專案的 pom.xml 檔案中,將傳回的存放區設定新增至 <project> 元素適當的區段。如要進一步瞭解檔案結構,請參閱 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> 元素表示存放區是否儲存發布套件、快照套件或兩者。這些設定應符合存放區的版本政策

    1. ~/.m2/settings.xml 檔案的 <servers> 部分,將傳回的驗證設定新增至 <settings> 元素。在下列範例中,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>
    

    遠端或虛擬

    1. 將存放區設定新增至 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。這項設定會覆寫從超級 POM 繼承的 central 存放區 ID 預設值。

    1. 使用下列指令,以 Base64 編碼方式編碼金鑰檔案。將 KEY-FILE 替換為金鑰檔案的名稱。

      base64 -w 0 KEY-FILE
      
    2. <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>
    
    1. 如果您使用 HTTP 端點,並想透過 Maven 原生連線進行驗證,可以在 settings.xml 中使用自訂 HTTP 標頭傳遞驗證標頭。

    範例:

    <settings>
    <servers>
      <server>
        <id>artifact-registry</id>
        <configuration>
          <httpHeaders>
            <property>
              <name>Authorization </name>
              <value>Bearer ${artifact.registry.token}</value>
            </property>
          </httpHeaders>
          <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>
      </server>
    </servers>
    </settings>
    

驗證設定完成。

設定 Gradle

  1. 為您使用的存放區類型設定 Gradle。

    標準

    1. 執行下列指令,顯示要新增至 Java 專案的存放區設定。

      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 金鑰檔案的路徑。如果您已執行指令來啟用服務帳戶,可以省略這個旗標。

      這項指令會傳回要納入 Java 專案的設定,包括私密金鑰的 Base64 編碼版本。

    2. 傳回的設定中,下列這行會為服務帳戶金鑰定義名為 artifactRegistryMavenSecret 的變數。在 ~/.gradle/gradle.properties 檔案中新增這行,這樣金鑰就不會顯示在建構作業或來源控制存放區中。

      artifactRegistryMavenSecret = KEY
      

      在這行中,KEY 是服務帳戶金鑰檔案中的私密金鑰。在 _json_key_base64 中,artifactRegistryMavenSecret 會設為以 Base64 編碼的金鑰做為密碼。

    3. 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 區段會設定存放區網址和驗證憑證。
      • publishing 區段會定義要上傳的檔案和目標 Artifact Registry 存放區。準備好上傳時,即可在「publications」部分更新檔案清單。如要瞭解發布設定,請參閱 Maven Publish 外掛程式說明文件。

    遠端或虛擬

    1. 使用下列指令,以 Base64 編碼方式編碼金鑰檔案。將 KEY-FILE 替換為金鑰檔案的名稱。

      base64 -w 0 KEY-FILE
      
    2. ~/.gradle/gradle.properties 檔案中新增下列程式碼,確保金鑰不會顯示在建構作業或來源控管存放區中。

      artifactRegistryMavenSecret = KEY
      

      在此行中,KEY 是 base64 編碼金鑰檔案的內容。

    3. 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 區段中定義套件的依附元件

驗證設定完成。

後續步驟