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

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

事前準備

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

  • 啟用 Cloud Build、Cloud Run 和 Artifact Registry API。

    啟用 API 時所需的角色

    如要啟用 API,您需要服務使用情形管理員 IAM 角色 (roles/serviceusage.serviceUsageAdmin),其中包含 serviceusage.services.enable 權限。瞭解如何授予角色

    啟用 API

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

必要 IAM 權限

如需授予這些角色的操作說明,請參閱「使用 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.26-trixie
          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.26-trixie
        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 存放區的名稱。

後續步驟