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

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

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

事前準備

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

主控台

  1. 啟用 Cloud Build 和 Workflows API。

    啟用 API

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

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

      前往「IAM」頁面

    2. 選取專案。

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

    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. Workflows 管理員角色 (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 替換為專案 ID。 Google Cloud

  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」(觸發條件)

  2. 如有需要,請選取專案並按一下「開啟」

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

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

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

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

  6. 按一下「繼續」

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

    登入 GitHub 時,系統會要求您授權 Google Cloud Build GitHub 應用程式存取 GitHub 帳戶,才能繼續操作。

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

    對於 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」(Cloud Build 觸發條件) 頁面:

    前往「Triggers」(觸發條件)

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

  3. 在「Name」(名稱) 欄位中,輸入觸發條件的名稱。

  4. 在「Event」(事件) 中,選取要叫用觸發條件的事件。

    例如:推送至分支版本

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

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

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

    例如:gitops/workflow.yaml

  7. 在「Configuration」(設定) 中,選取「Cloud Build configuration file (YAML or JSON)」(Cloud Build 設定檔 (YAML 或 JSON)) 做為類型,並選取「Repository」(存放區) 做為位置。

  8. 在「Cloud Build configuration file location」(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」(建構記錄)

    建構完成後,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」的工作流程。

後續步驟