建構、測試及容器化 Go 應用程式

本頁說明如何使用 Cloud Build 建構、測試、容器化及部署 Go 應用程式,以及如何將測試記錄儲存在 Cloud Storage 中。

事前準備

本頁的操作說明假設您熟悉 Go。此外,您還需要:

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

    Enable the APIs

  • 如要在本頁面執行 gcloud 指令,請安裝 Google Cloud CLI
  • 準備好 Go 專案。
  • 如要使用 Cloud Build 將 Go 應用程式容器化,您需要 Dockerfile 和原始碼。
  • 如要將建構的容器儲存在 Artifact Registry 中,請在 Artifact Registry 中建立 Docker 存放區
  • 如要在 Cloud Storage 中儲存測試記錄,請在 Cloud Storage 中建立值區

必要 IAM 權限

  • 如要在 Cloud Logging 中儲存測試記錄,請將 Cloud Storage bucket 的「Storage 物件建立者 (roles/storage.objectCreator)」角色授予建構服務帳戶。

  • 如要在 Artifact Registry 中儲存建構的映像檔,請將Artifact Registry 寫入者 (roles/artifactregistry.writer) 角色授予建構服務帳戶。

如需授予這些角色的操作說明,請參閱「使用 IAM 頁面授予角色」。

設定 Go 建構作業

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

本節將逐步說明 Go 應用程式的範例建構設定檔。這個檔案包含建構應用程式的建構步驟、新增單元測試,以及在測試通過後,將應用程式容器化並部署。

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

  1. 在專案根目錄中,建立名為 cloudbuild.yamlCloud Build 設定檔

  2. 建構及測試:如果您已在應用程式中定義單元測試,可以透過在建構步驟中新增下列欄位,設定 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.24
          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
  3. 將應用程式容器化:新增建構步驟,確保測試通過後,即可建構應用程式。Cloud Build 提供預先建構的 Docker 映像檔,可用於將 Go 應用程式容器化。如要將應用程式容器化,請在建構步驟中新增下列欄位:

    • name:將這個欄位的值設為 gcr.io/cloud-builders/docker,即可使用預先建構的 Docker 映像檔執行工作。
    • args:將 docker build 指令的引數新增為這個欄位的值。

    下列建構步驟會建構 myimage 映像檔,並以提交 ID 的簡短版本標記該映像檔。建構步驟會使用專案 ID、存放區名稱和簡短 SHA 值的替代值,因此系統會在建構時自動替代這些值。請注意,您需要建立或擁有Artifact Registry 中的 Docker 存放區,才能儲存映像檔。

    # Docker Build
    - name: 'gcr.io/cloud-builders/docker'
      args: ['build', '-t', 
             'us-central1-docker.pkg.dev/$PROJECT_ID/$_AR_REPO_NAME/myimage:$SHORT_SHA', '.']
  4. 將容器推送至 Artifact Registry:您可以將建構的容器儲存在 Artifact Registry 中,這項 Google Cloud 服務可用來儲存、管理及保護建構構件。如要執行這項操作,您必須在 Artifact Registry 中建立現有的 Docker 存放區。如要設定 Cloud Build 將映像檔儲存在 Artifact Registry Docker 存放區中,請新增具有下列欄位的建構步驟:

    • name:將這個欄位的值設為 gcr.io/cloud-builders/docker,即可為工作使用官方 docker 建構工具映像檔。
    • args:將 docker push 指令的引數新增為這個欄位的值。在目的地網址中,輸入要儲存映像檔的 Artifact Registry Docker 存放區。

    下列建構步驟會將上一步建構的映像檔推送至 Artifact Registry:

    # Docker push to Google Artifact Registry
    - name: 'gcr.io/cloud-builders/docker'
      args: ['push', 'us-central1-docker.pkg.dev/$PROJECT_ID/$_AR_REPO_NAME/myimage:$SHORT_SHA']
  5. 將容器部署至 Cloud Run:如要在 Cloud Run 上部署映像檔,請新增具有下列欄位的建構步驟:

    • name:將這個欄位的值設為 google/cloud-sdk,即可使用 gcloud CLI 映像檔叫用 gcloud 指令,在 Cloud Run 上部署映像檔。
    • args:將 gcloud run deploy 指令的引數新增為這個欄位的值。

    下列建構步驟會將先前建構的映像檔部署至 Cloud Run:

    # Deploy to Cloud Run
    - name: 'gcr.io/cloud-builders/gcloud'
      args: ['run', 'deploy', 'helloworld-${SHORT_SHA}', 
             '--image=us-central1-docker.pkg.dev/$PROJECT_ID/$_AR_REPO_NAME/myimage:$SHORT_SHA', 
             '--region', 'us-central1', '--platform', 'managed']
  6. 將測試記錄儲存至 Cloud Storage:您可以指定現有值區位置和測試記錄路徑,設定 Cloud Build 將所有測試記錄儲存至 Cloud Storage。

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

    # 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.24
        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
    
      # Docker Build
      - name: 'gcr.io/cloud-builders/docker'
        args: ['build', '-t', 
               'us-central1-docker.pkg.dev/$PROJECT_ID/$_AR_REPO_NAME/myimage:$SHORT_SHA', '.']
    
      # Docker push to Google Artifact Registry
      - name: 'gcr.io/cloud-builders/docker'
        args: ['push', 'us-central1-docker.pkg.dev/$PROJECT_ID/$_AR_REPO_NAME/myimage:$SHORT_SHA']
    
      # Deploy to Cloud Run
      - name: 'gcr.io/cloud-builders/gcloud'
        args: ['run', 'deploy', 'helloworld-${SHORT_SHA}', 
               '--image=us-central1-docker.pkg.dev/$PROJECT_ID/$_AR_REPO_NAME/myimage:$SHORT_SHA', 
               '--region', 'us-central1', '--platform', 'managed']
    
    # Save test logs to Google Cloud Storage
    artifacts:
      objects:
        location: gs://$_BUCKET_NAME/
        paths:
          - ${SHORT_SHA}_test_log.xml
    # Store images in Google Artifact Registry
    images:
      - us-central1-docker.pkg.dev/$PROJECT_ID/$_AR_REPO_NAME/myimage:$SHORT_SHA
  7. 使用 gcloud CLI建構觸發條件啟動建構作業。啟動建構作業時,您必須指定 Artifact Registry 存放區名稱。

    如要使用 gcloud CLI 啟動建構時指定 Artifact Registry 存放區,請執行下列操作:

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

    AR_REPO_NAME 替換為 Artifact Registry 存放區的名稱。

    如要在使用建構觸發程序建構時指定 Artifact Registry 存放區,請在建立建構觸發程序時,於「替代變數」欄位中指定 Artifact Registry 存放區的名稱。

後續步驟