設定 GitHub 問題通知

Cloud Build 可以透過所選管道傳送通知,讓您掌握建構作業的最新動態。本頁說明如何使用 GitHub Issues 通知程式設定通知。

事前準備

  • Enable the Cloud Build, Compute Engine, Cloud Run, Pub/Sub, and Secret Manager APIs.

    Enable the APIs

設定 GitHub 問題通知

下一節說明如何使用 GitHub Issues 通知程式手動設定 GitHub Issue 通知。如要自動化處理設定,請參閱「自動化處理通知設定」。

如要設定 GitHub 問題,請按照下列步驟操作:

  1. 建立 GitHub 個人存取權杖

    1. 前往 GitHub 設定建立新權杖。
    2. 選取 repo 範圍。

    3. 按一下「產生權杖」

  2. 將 GitHub 權杖儲存在 Secret Manager 中:

    1. 在 Google Cloud 控制台中開啟「Secret Manager」頁面:

      開啟 Secret Manager 頁面

    2. 按一下「建立密鑰」

    3. 輸入密鑰名稱。

    4. 在「Secret value」(密碼值) 下方,新增 GitHub 權杖。

    5. 如要儲存密鑰,請按一下「建立密鑰」

  3. 雖然 Cloud Run 服務帳戶可能具備專案的「編輯者」角色,但「編輯者」角色不足以存取 Secret Manager 中的密鑰。如要授予 Cloud Run 服務帳戶存取密鑰的權限,請按照下列步驟操作:

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

      開啟 IAM 頁面

    2. 找出與專案相關聯的 Compute Engine 預設服務帳戶

      您的 Compute Engine 預設服務帳戶會類似於下列項目:

      project-number-compute@developer.gserviceaccount.com
      

      記下 Compute Engine 預設服務帳戶

    3. 在 Google Cloud 控制台中開啟「Secret Manager」頁面:

      開啟 Secret Manager 頁面

    4. 按一下包含 GitHub 權杖密鑰的密鑰名稱。

    5. 在「權限」分頁中,按一下「新增成員」

    6. 將與專案相關聯的 Compute Engine 預設服務帳戶新增為成員。

    7. 將角色設為「Secret Manager Secret Accessor」(Secret Manager 密鑰存取者) 權限。

    8. 按一下 [儲存]

  4. 授予 Cloud Run 服務帳戶從 Cloud Storage 值區讀取的權限:

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

      開啟 IAM 頁面

    2. 找出與專案相關聯的 Compute Engine 預設服務帳戶

      您的 Compute Engine 預設服務帳戶會類似於下列項目:

      project-number-compute@developer.gserviceaccount.com
      
    3. 在包含 Compute Engine 預設服務帳戶的資料列中,按一下「鉛筆」圖示。 您會看到「編輯權限」分頁。

    4. 按一下 [Add another role] (新增其他角色)

    5. 新增下列角色:

      • Storage 物件檢視者
    6. 按一下 [儲存]

  5. 編寫範本設定檔,說明建立的 GitHub 問題應採用的格式:

    在下列範例範本設定檔中,titlebody 欄位會使用建構作業的替代變數:

    {
        "title": "Build {{.Build.BuildTriggerId}}: {{.Build.Status}}",
        "body": "[{{.Build.ProjectId}}] {{.Build.BuildTriggerId}} status: **{{.Build.Status}}**\n\n[View Logs]({{.Build.LogUrl}})"
    }
    

    如要查看範例,請參閱 GitHub Issues 通知程式的範本設定檔

    您可以從建立問題的 GitHub API 端點,設定可用的主體參數,藉此設定其他欄位。

  6. 編寫通知程式設定檔,設定 GitHub 問題通知程式並篩選建構事件:

    在下列範例的通知程式設定檔中,filter 欄位會使用 Common Expression Language 和可用變數 build,篩選出狀態為 SUCCESS 的建構事件:

    apiVersion: cloud-build-notifiers/v1
    kind: GitHubIssuesNotifier
    metadata:
      name: example-githubissues-notifier
    spec:
      notification:
        filter: build.status == Build.Status.FAILURE
        template:
          type: golang
          uri: gs://bucket_name/template-file-name
        delivery:
          githubToken:
            secretRef: github-token
          githubRepo: myuser/myrepo
      secrets:
      - name: github-token
        value: projects/project-id/secrets/secret-name/versions/latest
    

    其中:

    • githubToken 是本範例中使用的設定變數,用於參照 Secret Manager 中儲存的 GitHub 權杖。您在此指定的變數名稱應與 secrets 下的 name 欄位相符。
    • bucket-name 是值區名稱。
    • template-file-name 是範本檔案的名稱。
    • myuser/myrepo 是要建立問題的存放區名稱。
    • project-id 是 Google Cloud 專案 ID。
    • secret-name 是包含 GitHub 權杖的密碼名稱。

    如要查看範例,請參閱 GitHub Issues 通知程式的通知程式設定檔

    如需其他可做為篩選依據的欄位,請參閱「建構」資源。如需其他篩選範例,請參閱「使用 CEL 篩選建構事件」。

  7. 將通知程式設定檔和範本檔案上傳至 Cloud Storage bucket:

    1. 如果沒有 Cloud Storage bucket,請執行下列指令來建立 bucket,其中 bucket-name 是您要授予 bucket 的名稱,必須遵守命名規定

      gcloud storage buckets create gs://bucket-name/
      
    2. 將通知程式設定檔和範本檔案上傳至值區:

      gcloud storage cp config-file-name gs://bucket-name/config-file-name
      
      gcloud storage cp template-file-name gs://bucket-name/template-file-name
      

      其中:

      • bucket-name 是值區名稱。
      • config-file-name 是設定檔的名稱。
      • template-file-name 是範本檔案的名稱。
  8. 將通知程式部署至 Cloud Run:

     gcloud run deploy service-name \
       --image=us-east1-docker.pkg.dev/gcb-release/cloud-build-notifiers/slack:latest \
       --no-allow-unauthenticated \
       --update-env-vars=CONFIG_PATH=config-path,PROJECT_ID=project-id
    

    其中:

    • service-name 是您要部署映像檔的 Cloud Run 服務名稱。
    • config-path 是 Slack 通知程式 (gs://bucket-name/config-file-name) 的通知程式設定檔路徑。
    • project-id 是 Google Cloud 專案 ID。

    gcloud run deploy 指令會從 Cloud Build 擁有的 Artifact Registry 提取最新版本的代管映像檔。Cloud Build 支援通知程式映像檔九個月。九個月後,Cloud Build 會刪除映像檔版本。如要使用先前的映像檔版本,請在 gcloud run deploy 指令的 image 屬性中,指定映像檔標記的完整語意版本。您可以在 Artifact Registry 中找到先前的映像檔版本和標記。

  9. 授予 Pub/Sub 權限,在 Google Cloud 專案中建立驗證權杖:

     gcloud projects add-iam-policy-binding project-id \
       --member=serviceAccount:service-project-number@gcp-sa-pubsub.iam.gserviceaccount.com \
       --role=roles/iam.serviceAccountTokenCreator
    

    其中:

    • project-id 是 Google Cloud 專案 ID。
    • project-number 是您的 Google Cloud 專案編號。
  10. 建立服務帳戶,代表您的 Pub/Sub 訂閱身分:

    gcloud iam service-accounts create cloud-run-pubsub-invoker \
      --display-name "Cloud Run Pub/Sub Invoker"
    

    您可以使用 cloud-run-pubsub-invoker,或將其改成不同於專案中其他服務帳戶的名稱。 Google Cloud

  11. 將 Cloud Run Invoker 權限授予 cloud-run-pubsub-invoker 服務帳戶:

    gcloud run services add-iam-policy-binding service-name \
       --member=serviceAccount:cloud-run-pubsub-invoker@project-id.iam.gserviceaccount.com \
       --role=roles/run.invoker
    

    其中:

    • service-name 是您要部署映像檔的 Cloud Run 服務名稱。

    • project-id 是 Google Cloud 專案 ID。

  12. 建立 cloud-builds 主題,接收通知程式的建構更新訊息:

    gcloud pubsub topics create cloud-builds
    

    您也可以在建構設定檔中定義自訂主題名稱,這樣訊息就會改為傳送至自訂主題。在這種情況下,您會建立具有相同自訂主題名稱的主題:

    gcloud pubsub topics create topic-name
    

    詳情請參閱要接收建構作業通知的 Pub/Sub 主題

  13. 為通知程式建立 Pub/Sub 推送訂閱者:

     gcloud pubsub subscriptions create subscriber-id \
       --topic=cloud-builds \
       --push-endpoint=service-url \
       --push-auth-service-account=cloud-run-pubsub-invoker@project-id.iam.gserviceaccount.com
    

    其中:

    • subscriber-id 是您要為訂閱項目指定的名稱。
    • service-url 是 Cloud Run 為新服務產生的網址。
    • project-id 是 Google Cloud 專案 ID。

Cloud Build 專案的通知現已設定完成。下次叫用建構作業時,如果建構作業符合您設定的篩選條件,系統就會針對定義的 GitHub 存放區建立問題。

使用 CEL 篩選建構事件

Cloud Build 會在 Build 資源中列出的欄位上,使用 CEL 和變數 build,存取與建構事件相關聯的欄位,例如觸發條件 ID、映像檔清單或替代值。您可以使用 filter 字串,透過 Build 資源中列出的任何欄位,在建構設定檔中篩選建構事件。如要瞭解與欄位相關聯的確切語法,請參閱 cloudbuild.proto 檔案。

依觸發條件 ID 篩選

如要依觸發條件 ID 篩選,請使用 build.build_trigger_idfilter 欄位中指定觸發條件 ID 的值,其中 trigger-id 是觸發條件 ID (字串):

filter: build.build_trigger_id == trigger-id

依狀態篩選

如要依狀態篩選,請使用 build.statusfilter 欄位中指定要篩選的建構狀態。

以下範例說明如何使用 filter 欄位,依 SUCCESS 狀態篩選建構事件:

filter: build.status == Build.Status.SUCCESS

您也可以篩選不同狀態的建構作業。以下範例說明如何使用 filter 欄位,篩選出狀態為 SUCCESSFAILURETIMEOUT 的建構事件:

filter: build.status in [Build.Status.SUCCESS, Build.Status.FAILURE, Build.Status.TIMEOUT]

如要查看可篩選的其他狀態值,請參閱「建構資源參考資料」下的「狀態」

依標記篩選

如要依標記篩選,請使用 build.tagsfilter 欄位中指定標記的值,其中 tag-name 是標記的名稱:

filter: tag-name in build.tags

您可以使用 size,根據建構事件中指定的標記數量進行篩選。在下列範例中,filter 欄位會篩選出具有兩個標記的建構事件,其中一個標記指定為 v1

filter: size(build.tags) == 2 && "v1" in build.tags

依圖片篩選

如要依映像檔篩選,請使用 build.imagesfilter 欄位中指定映像檔的值,其中 image-name 是 Artifact Registry 中列出的完整映像檔名稱,例如 us-east1-docker.pkg.dev/my-project/docker-repo/image-one

filter: image-name in build.images

在下列範例中,filter 會篩選出以 us-east1-docker.pkg.dev/my-project/docker-repo/image-oneus-east1-docker.pkg.dev/my-project/docker-repo/image-two 指定為映像檔名稱的建構事件:

filter: "us-east1-docker.pkg.dev/my-project/docker-repo/image-one" in build.images || "us-east1-docker.pkg.dev/my-project/docker-repo/image-one" in build.images

依時間篩選

您可以在 filter 欄位中指定下列其中一個選項,根據建構作業的建立時間、開始時間或完成時間篩選建構事件:build.create_timebuild.start_timebuild.finish_time

在下列範例中,filter 欄位會使用 timestamp 篩選建構事件,要求在 2020 年 7 月 20 日上午 6 點建立建構:

filter: build.create_time == timestamp("2020-07-20:T06:00:00Z")

您也可以依時間比較篩選建構事件。在下列範例中,filter 欄位會使用 timestamp 篩選建構事件,開始時間介於 2020 年 7 月 20 日上午 6 點和 2020 年 7 月 30 日上午 6 點之間。

filter: timestamp("2020-07-20:T06:00:00Z") >= build.start_time && build.start_time <= timestamp("2020-07-30:T06:00:00Z")

如要進一步瞭解如何在 CEL 中表示時區,請參閱時區的語言定義。

如要依建構時間長度篩選,可以使用 duration 比較時間戳記。 在下列範例中,filter 欄位會使用 duration 篩選建構事件,找出執行時間至少五分鐘的建構作業:

filter: build.finish_time - build.start_time >= duration("5m")

依取代項目篩選

如要依替代項目篩選,請在 filter 欄位中指定替代變數,並使用 build.substitutions。在下列範例中,「filter」欄位會列出包含替代變數 substitution-variable 的建構作業,並檢查 substitution-variable 是否符合指定的 substitution-value

filter: build.substitutions[substitution-variable] == substitution-value

其中:

  • substitution-variable 是替代變數的名稱。
  • substitution-value 是替代值的名稱。

您也可以依預設替代變數值篩選。在下列範例中,filter 欄位會列出分支名稱為 master 的建構作業,以及存放區名稱為 github.com/user/my-example-repo 的建構作業。預設替代變數 BRANCH_NAMEREPO_NAME 會以鍵的形式傳遞至 build.substitutions

filter: build.substitutions["BRANCH_NAME"] == "master" && build.substitutions["REPO_NAME"] == "github.com/user/my-example-repo"

如要使用規則運算式篩選字串,可以使用內建的 matches 函式。在以下範例中,filter 欄位會篩選出狀態為 FAILURE 或 TIMEOUT 的建構,且建構替代變數 TAG_NAME 的值符合規則運算式 v{DIGIT}.{DIGIT}.{3 DIGITS})

filter: build.status in [Build.Status.FAILURE, Build.Status.TIMEOUT] && build.substitutions["TAG_NAME"].matches("^v\\d{1}\\.\\d{1}\\.\\d{3}$")

如要查看預設替代值清單,請參閱「使用預設替代值」。

後續步驟