建構及測試 Go 應用程式

本頁說明如何使用 Cloud Build 建構及測試 Go 應用程式、將成果上傳至 Artifact Registry、產生來源資訊,以及將測試記錄儲存在 Cloud Storage 中。

事前準備

本頁說明假設您已熟悉 Go。此外:

  • Enable the Cloud Build, Cloud Run, and Artifact Registry APIs.

    Enable the APIs

  • 如要執行本頁的 gcloud 指令,請安裝 Google Cloud CLI
  • 請準備好您的 Go 專案。
  • 在 Artifact Registry 中建立 Go 存放區。如果沒有,請建立新的存放區
  • 如要將測試記錄儲存在 Cloud Storage 中,請在 Cloud Storage 中建立值區

設定服務帳戶

本文件中的範例使用使用者指定的服務帳戶。如要建立 Cloud Build 使用的服務帳戶,請在 Google Cloud CLI 中執行下列指令:

gcloud iam service-accounts create cloud-build-go \
--description="Build and test Go applications" \
--display-name="Cloud Build Go" \
--project="PROJECT_ID"

預設的 Compute 服務帳戶 (由 Cloud Run 使用) 需要具備擔任新服務帳戶的權限。首先,請決定專案中的運算服務帳戶名稱:

gcloud iam service-accounts list --filter="email:-compute@developer.gserviceaccount.com"

接著,授予服務帳戶使用者 (roles/iam.serviceAccountUser) 角色:

gcloud iam service-accounts add-iam-policy-binding \
COMPUTE_SERVICE_ACCOUNT_EMAIL  \
--member="serviceAccount:cloud-build-go@PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser"

COMPUTE_SERVICE_ACCOUNT_EMAIL 替換為上一個指令顯示的預設運算服務帳戶電子郵件地址。

設定 IAM 權限

確認您已具備所需權限:

如要取得在 Cloud Build 中執行建構作業所需的權限,請要求管理員為您的建構服務帳戶授予 Cloud Build 服務帳戶 (roles/cloudbuild.builds.builder) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

您或許還可透過自訂角色或其他預先定義的角色取得必要權限。

如要取得在 Artifact Registry 中儲存已建構的構件所需的權限,請要求管理員授予您建構服務帳戶的 Artifact Registry Writer (roles/artifactregistry.writer) IAM 角色。

如要取得儲存測試記錄所需的權限,請要求管理員為您授予建構服務帳戶的 Storage 物件建立者 (roles/storage.objectCreator) IAM 角色。

如要取得將應用程式部署至 Cloud Run 所需的權限,請要求管理員授予您建構服務帳戶的 Cloud Run 開發人員 (roles/run.developer) IAM 角色。

設定 Go 建構

Docker Hub 提供的公開 golang 映像檔支援使用 Go 模組進行建構作業。您可以將這個映像檔做為 Cloud Build 設定檔中的建構步驟,在映像檔中叫用 go 指令。系統會將傳送至這個建構步驟的引數直接傳送至 golang 工具,讓您能夠在這個映像檔中執行任何 go 指令。

本節說明如何從 cloud-build-samples Git 存放區,為 Go 應用程式建立範例建構設定檔。建構設定檔包含建構應用程式、新增單元測試,以及在測試通過後部署應用程式的步驟。

如要建構 Go 應用程式範例,請按照下列步驟操作:

  1. 設定單元測試:如果您已在應用程式中定義單元測試,可以在建構步驟中新增下列欄位,設定 Cloud Build 執行測試:

    • name:將這個欄位的值設為 golang,即可在工作中使用 Docker Hub 的 golang 映像檔。
    • entrypoint:將這個欄位的值設為 /bin/bash。這樣一來,您就能直接從建構步驟執行多行 bash 指令
    • args:建構步驟的 args 欄位會取得引數清單,並將其傳送至 name 欄位參照的圖片。在以下範例中,args 欄位會採用下列項目的引數:

      • 執行測試記錄格式化工具,下載測試記錄輸出內容。
      • 列印記錄輸出內容。
      • sponge.log 中儲存測試結果。
      • sponge.log 中的結果輸出至 JUNIT XML 檔案。JUnit XML 檔案的名稱會使用與建構相關聯的提交 ID 的短版本建構而成。後續的建構步驟會將此檔案中的記錄儲存至 Cloud Storage。

        steps:
          # Run tests and save to file
          - name: golang:1.23
            entrypoint: /bin/bash
            args:
              - -c
              - |
                go install github.com/jstemmer/go-junit-report/v2@latest
                2>&1 go test -timeout 1m -v ./... | /go/bin/go-junit-report -set-exit-code -iocopy -out ${SHORT_SHA}_test_log.xml
        
  2. 上傳至 Artifact Registry:在設定檔中使用 goModules 欄位,指定應用程式路徑和 Artifact Registry 中的 Go 存放區:

    # Upload Go module to artifact registry
    artifacts:
      goModules:
        repositoryName: 'repositoryName'
        repositoryLocation: 'location'
        repositoryProjectId: 'projectId'
        sourcePath: 'sourcePath'
        modulePath: 'appPath'
        moduleVersion: 'version'
    

    替換下列值:

    • repositoryName:Artifact Registry 中的 Go 存放區名稱。
    • location:Artifact Registry 中存放庫的位置
    • projectId:包含 Artifact Registry 存放區的 Google Cloud 專案 ID。
    • sourcePath:建構工作區中 go.mod 檔案的路徑。
    • appPath:封裝應用程式的路徑。
    • version:應用程式的版本號碼,以數字和點格式呈現,例如 v1.0.1
  3. 選用:啟用來源產生功能

    Cloud Build 可產生可驗證的軟體構件供應鏈級別 (SLSA) 建構來源中繼資料,協助保護持續整合管道。

    如要啟用來源產生功能,請在設定檔的 options 部分中新增 requestedVerifyOption: VERIFIED

    建構作業完成後,您可以在 Artifact Registry 中查看存放區詳細資料

    您也可以查看建構來源資訊中繼資料驗證來源資訊

  4. 將測試記錄儲存至 Cloud Storage:您可以指定現有的值區位置和測試記錄路徑,藉此設定 Cloud Build 將任何測試記錄儲存在 Cloud Storage 中。

    以下建構步驟會將您儲存在 JUNIT XML 檔案中的測試記錄儲存至 Cloud Storage 值區:

    # Save test logs to Google Cloud Storage
    artifacts:
      objects:
        location: gs://$_BUCKET_NAME/
        paths:
          - ${SHORT_SHA}_test_log.xml
    

    以下程式碼片段顯示上述步驟的完整建構設定檔:

      steps:
        # Run tests and save to file
        - name: golang:1.23
          entrypoint: /bin/bash
          args:
            - -c
            - |
              go install github.com/jstemmer/go-junit-report/v2@latest
              2>&1 go test -timeout 1m -v ./... | /go/bin/go-junit-report -set-exit-code -iocopy -out ${SHORT_SHA}_test_log.xml
    
      # Store golang modules in Google Artifact Registry
      artifacts:
        goModules:
          repositoryName: 'repositoryName'
          repositoryLocation: 'location'
          repositoryProject_id: 'projectId'
          sourcePath: 'sourcePath'
          modulePath: 'appPath'
          moduleVersion: 'version'
    
  5. 使用 gcloud CLI 啟動建構作業,或建立建構觸發條件

Google Cloud CLI

 gcloud builds submit --region=us-west2 --config=cloudbuild.yaml \
     --substitutions=_AR_REPO_NAME="AR_REPO_NAME"

自動建構觸發條件

請按照「建立建構觸發事件」一文中的步驟操作。在「Substitution variables」欄位中,您也必須提供 Artifact Registry 存放區的名稱,以及測試記錄的 Cloud Storage 值區名稱。

後續步驟