將構件儲存在 Artifact Registry 中

本頁說明如何設定 Cloud Build,將建構的構件儲存在 Artifact Registry 存放區中。

事前準備

  1. 如果目標存放區不在 Artifact Registry 中,請建立新的存放區
  2. 如果 Cloud Build 和存放區位於不同的專案中,或是您使用使用者指定的服務帳戶執行建構作業,請將 Artifact Registry Writer 角色授予專案中存放區的建構服務帳戶。

    預設的 Cloud Build 服務帳戶可對同一個 Google Cloud 專案中的存放區執行下列動作:

設定 Docker 建構作業

授予目標存放區權限後,即可設定建構作業。

如要設定版本,請按照下列步驟操作:

  1. 在建構設定檔中新增建構及標記映像檔的步驟。

    steps:
    - name: 'gcr.io/cloud-builders/docker'
      args: [ 'build', '-t', '${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/${_IMAGE}', '.' ]
    images:
    - '${_LOCATION}-docker.pkg.dev/$PROJECT_ID/${_REPOSITORY}/${_IMAGE}'
    

    這個程式碼片段會使用 Cloud Build 替換項目。如果您想使用相同的建構設定檔,將映像檔推送至測試、測試環境或實際工作環境等不同環境的存放區,這麼做就很實用。

    • ${_LOCATION}${_REPOSITORY}${_IMAGE} 是用於使用者定義的替換值,用於儲存庫位置、儲存庫名稱和圖片。您可以在建構期間指定這些變數的值。
    • $PROJECT_ID 是 Cloud Build 會使用建構的 Google Cloud 專案 ID 解析的預設替代值

      • 如果您執行 gcloud builds submit 指令,Cloud Build 會使用 gcloud 工作階段中的有效專案 ID。
      • 如果您使用建構觸發條件,Cloud Build 會使用 Cloud Build 執行所在專案的 ID。

      或者,您也可以改用使用者定義的替代字元,而非 $PROJECT_ID,這樣就能在建構期間指定專案 ID。

  2. 準備執行建構作業時,請為使用者定義的替換項目指定值。例如,這個指令會替換:

    • us-east1 是存放區位置
    • my-repo 是存放區名稱
    • my-image 為圖片名稱
    gcloud builds submit --config=cloudbuild.yaml \
      --substitutions=_LOCATION="us-east1",_REPOSITORY="my-repo",_IMAGE="my-image" .
    

設定 Go 建構作業

授予目標存放區權限後,即可設定建構作業。以下說明如何設定建構作業,以便將 Go 模組上傳至 Go 存放區。

如要設定版本,請按照下列步驟操作:

  1. 如要將 Go 模組上傳至建構中的 Go 存放區,請在建構設定檔中新增下列步驟:

    steps:
    - name: gcr.io/cloud-builders/gcloud
    args:
    - 'artifacts'
    - 'go'
    - 'upload'
    - '--project=$PROJECT_ID'
    - '--location=${_LOCATION}'
    - '--repository=${_REPOSITORY}'
    - '--module-path=${_MODULE_PATH}'
    - '--version=$TAG_NAME'
    

    建構設定檔包含 Cloud Build 替代值。如果您想使用相同的建構設定檔,將套件上傳至不同環境的存放區 (例如測試、測試環境或正式上線環境),此方法就非常實用。

    • ${_LOCATION}${_REPOSITORY}${_MODULE_PATH} 是使用者定義的替代值,用於替換存放區位置、存放區名稱和模組路徑。您可以在建構期間指定這些變數的值。
    • $PROJECT_ID$TAG_NAME 是 Cloud Build 會替換為下列項目的預設替換項目

      • $PROJECT_ID 會替換為建構作業的 Google Cloud 專案 ID。

        • 如果您執行 gcloud builds submit 指令,Cloud Build 會使用 gcloud 工作階段中的有效專案 ID。
        • 如果您使用建構觸發條件,Cloud Build 會使用 Cloud Build 執行所在專案的 ID。

        或者,您也可以改用使用者定義的替代字元,而非 $PROJECT_ID,這樣就能在建構期間指定專案 ID。

      • $TAG_NAME 會替換成標記名稱,以支援 Go 慣例,也就是使用 Git 標記做為版本號碼。

  2. 如要從 Go 存放區安裝套件,請在建構設定檔中新增下列步驟:

    • .netrc 檔案中,將存放區位置新增至地區 Cloud Build 端點。
    • 執行憑證輔助程式工具,更新 OAuth 權杖。
    • 請執行 go run 指令。您也可以將其變更為 go build 來編譯模組、go test 來執行測試,或 go mod tidy 來下載依附元件。

    針對 go 指令步驟,GOPROXY 會設為代管私人依附元件的 Cloud Build 存放區。如果模組有公開依附元件,您可以將公開 Proxy 新增至以逗號分隔的 GOPROXY 清單。

    steps:
    - name: golang
      entrypoint: go
      args: ['run', 'github.com/GoogleCloudPlatform/artifact-registry-go-tools/cmd/auth@v0.1.0', 'add-locations', '--locations=${_LOCATION}']
      env:
      # Set GOPROXY to the public proxy to pull the credential helper tool
      - 'GOPROXY=https://proxy.golang.org'
    - name: golang
      entrypoint: go
      args: ['run', 'github.com/GoogleCloudPlatform/artifact-registry-go-tools/cmd/auth@v0.1.0', 'refresh']
      env:
      # Set GOPROXY to the public proxy to pull the credential helper tool
      - 'GOPROXY=https://proxy.golang.org'
    - name: golang
      entrypoint: go
      args: ['run', '.']
      env:
      - 'GOPROXY=https://${_LOCATION}-go.pkg.dev/${_PROJECT_ID}/${_REPOSITORY}'
    options:
      env:
      # Disable GO sumdb checks for private modules.
      - 'GONOSUMDB=${_MODULE_PATH}'
    
  3. 準備執行建構作業時,請為使用者定義的替換項目指定值。例如,這個指令會替換:

    • us-east1 是存放區位置
    • my-project 代表專案 ID
    • my-repo 是存放區名稱
    • example.com/greetings 是模組路徑
    gcloud builds submit --config=cloudbuild.yaml \
      --substitutions=_LOCATION="us-east1",_PROJECT_ID="my-project",_REPOSITORY="my-repo",_MODULE_PATH="example.com/greetings" .
    

設定 Java 建構作業

授予目標存放區權限後,即可設定建構作業。以下說明如何設定建構作業,將 Java 套件上傳至 Maven 存放區。

如要設定版本,請按照下列步驟操作:

  1. 為 Maven 設定驗證。請務必在 pom.xml 檔案中指定正確的目標專案和存放區。

  2. 在 Cloud Build 建構設定檔中,新增使用 Maven 上傳套件的步驟:

    steps:
    - name: gcr.io/cloud-builders/mvn
      args: ['deploy']
    
  3. 建構設定檔準備就緒後,請使用下列指令開始建構:

    gcloud builds submit
    

設定 Node.js 建構作業

授予目標存放區權限後,即可設定建構作業。以下說明如何設定建構作業,將 Node.js 套件上傳至 npm 存放區。

如要設定版本,請按照下列步驟操作:

  1. 將 Artifact Registry 存放區新增至 Node.js 專案中的 .npmrc 檔案。該檔案位於 package.json 檔案所在的目錄中。

    @SCOPE:registry=https://LOCATION-npm.pkg.dev/PROJECT_ID/REPOSITORY
    //LOCATION-npm.pkg.dev/PROJECT_ID/REPOSITORY/:always-auth=true
    
    • SCOPE-NAME 是與存放區建立關聯的 npm 範圍名稱。使用範圍可確保您一律從正確的存放區發布及安裝套件。
    • PROJECT_ID 是您的 Google Cloud 專案 ID。
    • LOCATION 是存放區的地區或多地區位置
    • REPOSITORY 是存放區的名稱。
  2. 在專案的 package.json 檔案中新增指令碼,以便重新整理存取權存證,用於存放區驗證。

    "scripts": {
     "artifactregistry-login": "npx google-artifactregistry-auth"
    }
    
  3. 在建構設定檔中,新增將套件上傳至存放區的步驟。

    steps:
    - name: gcr.io/cloud-builders/npm
      args: ['run', 'artifactregistry-login']
    - name: gcr.io/cloud-builders/npm
      args: ['publish', '${_PACKAGE}']
    

    ${_PACKAGE} 是 Cloud Build 替代值,代表 Node.js 專案目錄。您可以在執行指令時指定目錄,以便執行建構作業。

    舉例來說,下列指令會從名為 src 的目錄上傳套件:

    gcloud builds submit --config=cloudbuild.yaml \
        --substitutions=_PACKAGE="src" .
    

設定 Python 版本

授予目標存放區權限後,即可設定建構作業。以下說明如何設定建構作業,以便將 Python 套件上傳至 Python 存放區,並使用 pip 安裝套件。

如要建構及容器化 Python 應用程式,然後將其推送至 Docker 存放區,請參閱 Cloud Build 說明文件中的「建構 Python 應用程式」。

如要設定版本,請按照下列步驟操作:

  1. 在包含 Cloud Build 建構設定檔的目錄中,建立名為 requirements.txt 的檔案,並加入下列依附元件:

    twine
    keyrings.google-artifactregistry-auth
    
  2. 如要將 Python 套件上傳至建構中的 Python 存放區,請在建構設定檔中新增下列步驟:

    steps:
    - name: python
      entrypoint: pip
      args: ["install", "-r", "requirements.txt", "--user"]
    - name: python
      entrypoint: python
      args:
      - '-m'
      - 'twine'
      - 'upload'
      - '--repository-url'
      - 'https://${_LOCATION}-python.pkg.dev/$PROJECT_ID/${_REPOSITORY}/'
      - 'dist/*'
    

    在這個程式碼片段中,第一個步驟會安裝 Twine 和 Artifact Registry 鑰匙圈後端。第二個步驟會上傳 dist 子目錄中建構的 Python 檔案。如果 requirements.txt 和已建構的 Python 檔案路徑不符合程式碼片段,請調整路徑。

    存放區路徑包含 Cloud Build 替換值。如果您想使用相同的建構設定檔,將套件上傳至不同環境的存放區 (例如測試、測試環境或正式上線環境),此方法就非常實用。

    • ${_LOCATION}${_REPOSITORY} 是使用者定義的替代值,用於存放區位置、存放區名稱和套件名稱。您可以在建構時指定這些變數的值。
    • $PROJECT_ID 是 Cloud Build 會使用建構的 Google Cloud 專案 ID 解析的預設替代值

      • 如果您執行 gcloud builds submit 指令,Cloud Build 會使用 gcloud 工作階段中的有效專案 ID。
      • 如果您使用建構觸發條件,Cloud Build 會使用 Cloud Build 執行所在專案的 ID。

      或者,您也可以改用使用者定義的替代字元,而非 $PROJECT_ID,這樣就能在建構期間指定專案 ID。

  3. 如要從 Python 存放區安裝套件,請在建構設定檔中新增步驟,執行 pip install 指令。

      steps:
      - name: python
        entrypoint: pip
        args:
        - 'install'
        - '--index-url'
        - 'https://${_LOCATION}-python.pkg.dev/$PROJECT_ID/${_REPOSITORY}/simple/'
        - '${_PACKAGE}'
        - '--verbose'
    

    這個程式碼片段包含額外的 ${_PACKAGE} 替代套件名稱。

  4. 準備執行建構作業時,請為使用者定義的替換項目指定值。例如,這個指令會替換:

    • us-east1 是存放區位置
    • my-repo 是存放區名稱
    • my-package 是套件名稱
    gcloud builds submit --config=cloudbuild.yaml \
      --substitutions=_LOCATION="us-east1",_REPOSITORY="my-repo",_PACKAGE="my-package" .
    

使用自行簽署的憑證,在私人登錄檔中儲存構件

如果您有私人憑證授權單位,且需要在私人登錄檔中儲存構件,則可以設定建構設定檔,以便使用自行簽署的憑證。如要這樣做,請新增一個建構步驟,將憑證推送至主機系統,以便後續建構步驟使用該憑證。例如:

- name: gcr.io/cloud-builders/docker
  args:
    - run
    - --rm
    - --volume=/etc/docker/certs.d/:/etc/docker/certs.d/
    - --volume=certificates:/certificates
    - ubuntu
    - bash
    - -c
    - |
      cp /certificates/ca.crt /etc/docker/certs.d/quay.apps.cloud.inter
  volumes:
    - name: certificates
      path: /certificates

後續步驟