使用 Cloud Build 從 Git 存放區部署工作流程

您可以使用 Cloud Build 觸發條件,自動啟動建構作業,並從 Git 存放區部署工作流程。您可以設定觸發條件,在原始碼存放區發生任何變更時部署工作流程,或是只在變更符合特定條件時部署工作流程。

這個方法有助於管理部署生命週期。舉例來說,您可以在測試環境中部署工作流程的變更,針對該環境執行測試,然後逐步將這些變更推送至正式版環境。

事前準備

這些操作說明假設您在 Google Cloud 專案中具有 Cloud Build 編輯者角色 (roles/cloudbuild.builds.editor),因此可以建立觸發條件。您也需要在 GitHub 或 Bitbucket 等原始碼存放區中建立工作流程。

主控台

  1. 啟用 Cloud Build 和 Workflows API。

    啟用 API

  2. 工作流程管理員角色 (roles/workflows.admin) 授予 Cloud Build 服務帳戶:

    1. 前往 Google Cloud 控制台的「IAM」頁面。

      前往「IAM」頁面

    2. 選取專案。

    3. 在 Cloud Build 服務帳戶 (PROJECT_NUMBER@cloudbuild.gserviceaccount.com) 列中,按一下 「Edit principal」(編輯主體)

    4. 按一下 「Add another role」

    5. 在「Role」清單中,選取「Workflows Admin」角色。

    6. 按一下 [儲存]

  3. 將 Compute Engine 預設服務帳戶的 服務帳戶使用者角色 (roles/iam.serviceAccountUser) 授予 Cloud Build 服務帳戶。啟用 Compute Engine API 後,Compute Engine 的預設服務帳戶會是 PROJECT_NUMBER-compute@developer.gserviceaccount.com

    1. 前往 Google Cloud 控制台的「Service Accounts」(服務帳戶) 頁面。

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

    2. 選取專案。

    3. 按一下 Compute Engine 預設服務帳戶的電子郵件地址 (PROJECT_NUMBER-compute@developer.gserviceaccount.com)。

    4. 按一下「Permissions」(權限) 分頁標籤。

    5. 按一下 「授予存取權」按鈕。

    6. 如要新增主體,請輸入服務帳戶 (SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com) 的電子郵件地址。

    7. 在「Select a role」清單中,依序選取「Service Accounts」>「Service Account User」角色。

    8. 按一下 [儲存]

gcloud

  1. 啟用 Cloud Build 和 Workflows API。

    gcloud services enable cloudbuild.googleapis.com \
      workflows.googleapis.com
    
  2. 工作流程管理員角色 (roles/workflows.admin) 授予 Cloud Build 服務帳戶:

    PROJECT_NUMBER=$(gcloud projects describe PROJECT_ID --format='value(projectNumber)')
    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
      --role=roles/workflows.admin
    

    PROJECT_ID 替換為 Google Cloud專案的 ID。

  3. 將 Compute Engine 預設服務帳戶的 服務帳戶使用者角色 (roles/iam.serviceAccountUser) 授予 Cloud Build 服務帳戶。啟用 Compute Engine API 後,Compute Engine 的預設服務帳戶會是 PROJECT_NUMBER-compute@developer.gserviceaccount.com

    gcloud iam service-accounts add-iam-policy-binding \
      $PROJECT_NUMBER-compute@developer.gserviceaccount.com \
      --member=serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
      --role=roles/iam.serviceAccountUser
    

連結至來源存放區

您必須將 Cloud Build 連結至來源存放區,讓 Cloud Build 能夠自動執行建構作業,因應存放區中發生的事件。

如要連結至 GitHub 或 Bitbucket,請完成下列步驟:

  1. 在 Google Cloud 控制台中,前往 Cloud Build「Triggers」頁面:

    前往「Triggers」(觸發條件)

  2. 必要時,請選取專案並按一下「Open」

  3. 在「Region」(區域) 清單中,選取要建立觸發事件的區域。

  4. 按一下 [Connect repository] (連結存放區)

  5. 選取儲存原始碼的原始碼存放區。

    例如:GitHub (Cloud Build GitHub 應用程式)

  6. 按一下「繼續」

  7. 使用使用者名稱和密碼驗證來源存放區。

    如果您要登入 GitHub,系統會要求您授權 Google Cloud Build GitHub 應用程式存取您的 GitHub 帳戶,以便繼續操作。

  8. 從可用存放區清單中選取所需存放區,然後按一下「OK」

    對於 GitHub 和 Bitbucket 等外部存放區,您必須具備您正在使用的 Google Cloud 專案擁有者層級權限。

  9. 閱讀免責事項,然後勾選旁邊的核取方塊,表示您同意這些條款。

  10. 按一下「連線」

  11. 如要繼續建立自動建構觸發條件,以便自動建構存放區中的原始碼,請按一下「建立觸發條件」。否則請按一下「完成」

建立 Cloud Build 設定檔

建構設定檔會定義使用建構觸發事件啟動建構作業時所需的欄位。在專案根目錄中建立設定檔,並使用 YAML 或 JSON 編寫。

舉例來說,下列設定檔會部署及執行測試工作流程,然後使用指令碼檢查輸出內容。如果測試通過,系統就會部署工作流程:

steps:
# Deploy the test workflow with the commit sha
- id: 'deploy-test-workflow'
  name: 'gcr.io/cloud-builders/gcloud'
  args: ['workflows', 'deploy', '$_WORKFLOW_NAME-$BRANCH_NAME-$SHORT_SHA', '--source', 'gitops/workflow.yaml']

# Run the test workflow and capture the output
- id: 'run-test-workflow'
  name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  args: ['-c', 'gcloud workflows run $_WORKFLOW_NAME-$BRANCH_NAME-$SHORT_SHA > /workspace/testoutput.log']

# Delete the test workflow
- id: 'delete-test-workflow'
  name: 'gcr.io/cloud-builders/gcloud'
  args: ['workflows', 'delete', '$_WORKFLOW_NAME-$BRANCH_NAME-$SHORT_SHA', '--quiet']

# Check the test output
- id: 'check-test-workflow'
  name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  args: ['gitops/test-$BRANCH_NAME.sh']

# Deploy the workflow
- id: 'deploy-workflow'
  name: 'gcr.io/cloud-builders/gcloud'
  args: ['workflows', 'deploy', '$_WORKFLOW_NAME-$BRANCH_NAME', '--source', 'gitops/workflow.yaml']

從 Git 存放區觸發建構作業時,Cloud Build 會填入 $BRANCH_NAME$SHORT_SHA 替換變數。分別代表分支版本名稱,以及與建構相關聯的提交 ID 的前七個字元。

$_WORKFLOW_NAME 替代變數可讓您以不同的變數值重複使用設定檔。您可以在建立建構觸發事件時指定其值。

詳情請參閱「建立建構設定檔」。

建立版本觸發條件

您可以建立 Cloud Build 觸發條件,自動部署工作流程。

如要為上一節中的設定檔建立建構觸發條件,請按照下列步驟操作:

  1. 在 Google Cloud 控制台中,前往 Cloud Build 的「Triggers」(觸發條件) 頁面:

    前往「Triggers」(觸發條件)

  2. 按一下「建立觸發條件」

  3. 在「名稱」欄位中,輸入觸發事件的名稱。

  4. 針對「事件」,選取要叫用觸發條件的事件。

    例如:推送至分支版本

  5. 在「Source」 部分,選取存放區,以及啟動觸發條件的分支或標記名稱。您可以使用規則運算式指定要比對的分支版本或標記。

    例如:GoogleCloudPlatform/workflows-demos (存放區) 和 ^main$|^staging$ (符合 mainstaging 分支)

  6. 展開「顯示納入和忽略的檔案篩選器」部分,並將工作流程指定為納入檔案,這樣當工作流程發生變更時,系統就會叫用建構作業。

    例如:gitops/workflow.yaml

  7. 針對「Configuration」,請選取「Cloud Build 設定檔 (YAML 或 JSON)」做為類型,並選取「Repository」做為位置。

  8. 在「Cloud Build 設定檔位置」欄位中,指定檔案位置。

    例如:gitops/cloudbuild.yaml

  9. 如要新增替換變數,請按一下「新增變數」,然後指定鍵和值組合。

    例如:_WORKFLOW_NAME (變數) 和 workflows-gitops (值)

  10. 如要儲存建構觸發條件,請按一下「建立」

當任何變更推送至 Git 存放區指定分支版本中的工作流程時,系統會自動觸發 Cloud Build 部署工作流程。

詳情請參閱「建立及管理自動建構觸發條件」。

測試建構觸發條件

您可以測試先前各節中的建構觸發事件和設定檔。

  1. 在 Git 存放區的 staging 分支中,編輯 workflow.yaml,並將 Hello World 變更為 Bye World

    main:
      steps:
        - init:
            assign:
              - message: "Hello World"
        - returnResult:
            return: ${message}
  2. 將變更提交並推送至 staging 分支。

    git add workflow.yaml
    git commit -m "Update workflow.yaml in staging"
    git push
    

    Cloud Build 觸發條件會執行並啟動建構作業。

  3. 如要確認建構作業是否成功,請在 Google Cloud 控制台中前往「Build history」(建構歷史記錄) 頁面:

    前往「Build history」(版本記錄)

    建構完成後,Cloud Build 會提供建構作業和個別建構步驟的整體狀態。詳情請參閱「查看建構結果」。

  4. 如要確認已部署測試工作流程,請在 Google Cloud 控制台中前往「Workflows」頁面:

    前往「Workflows」頁面

    您應該會看到名為 workflows-gitops-staging 的工作流程。

  5. 如要將測試工作流程部署至正式環境,請將 staging 分支合併至 main 分支:

    git checkout main
    git merge staging
    git push
    

    請注意,由於 test-main.sh 預期工作流程的輸出內容為 Hello World,因此建構作業會失敗:

    RESULT_EXPECTED="result: '\"Hello World\"'"
    RESULT_ACTUAL=$(grep "result: " $FILE)
    if [[ $RESULT_EXPECTED == $RESULT_ACTUAL ]]; then
      echo "Result test passed"
    else
      echo "Result test failed. Expected: $RESULT_EXPECTED Actual: $RESULT_ACTUAL"; exit 1;
    fi
  6. 如要順利部署實際工作環境工作流程,請在 staging 分支中再次編輯 workflow.yaml,並將字串變更回 Hello World

  7. 將變更內容提交並推送至 staging 分支版本,然後將 staging 分支版本合併至 main 分支版本。

  8. 如要確認已部署正式版工作流程,請在 Google Cloud 控制台中前往「Workflows」頁面:

    前往「Workflows」頁面

    您應該會看到名為 workflows-gitops-main 的工作流程。

後續步驟