Cloud Build 可以透過所選管道傳送通知,讓您掌握建構作業的最新動態。本頁說明如何使用 GitHub Issues 通知程式設定通知。
事前準備
-
Enable the Cloud Build, Compute Engine, Cloud Run, Pub/Sub, and Secret Manager APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.
- 安裝 Google Cloud CLI。
設定 GitHub 問題通知
下一節說明如何使用 GitHub Issues 通知程式,手動設定 GitHub Issue 通知。如要自動化處理設定,請參閱「自動化處理通知設定」。
如要設定 GitHub 問題,請按照下列步驟操作:
建立 GitHub 個人存取權杖:
- 前往 GitHub 設定建立新權杖。
選取
repo範圍。按一下「產生權杖」。
將 GitHub 權杖儲存在 Secret Manager 中:
在 Google Cloud 控制台中開啟「Secret Manager」頁面:
按一下「建立密鑰」。
輸入密鑰名稱。
在「密鑰值」下方,新增 GitHub 權杖。
如要儲存密鑰,請按一下「建立密鑰」。
雖然 Cloud Run 服務帳戶可能具備專案的「編輯者」角色,但「編輯者」角色不足以存取 Secret Manager 中的密鑰。如要授予 Cloud Run 服務帳戶密鑰存取權,請按照下列步驟操作:
前往 Google Cloud 控制台的「IAM」(身分與存取權管理) 頁面:
找出與專案相關聯的 Compute Engine 預設服務帳戶:
您的 Compute Engine 預設服務帳戶看起來會類似下列內容:
project-number-compute@developer.gserviceaccount.com記下 Compute Engine 預設服務帳戶。
在 Google Cloud 控制台中開啟「Secret Manager」頁面:
按一下包含 GitHub 權杖密鑰的密鑰名稱。
在「權限」分頁中,按一下「新增成員」。
將與專案相關聯的 Compute Engine 預設服務帳戶新增為成員。
將「Secret Manager Secret Accessor」(Secret Manager 密鑰存取者)權限設為角色。
按一下 [儲存]。
授予 Cloud Run 服務帳戶從 Cloud Storage bucket 讀取資料的權限:
前往 Google Cloud 控制台的「IAM」(身分與存取權管理) 頁面:
找出與專案相關聯的 Compute Engine 預設服務帳戶:
您的 Compute Engine 預設服務帳戶看起來會類似下列內容:
project-number-compute@developer.gserviceaccount.com在包含 Compute Engine 預設服務帳戶的資料列中,按一下「鉛筆」圖示。 系統會顯示「編輯存取權」分頁。
按一下 [Add another role] (新增其他角色)。
新增下列角色:
- Storage 物件檢視者
按一下 [儲存]。
撰寫範本設定檔,說明建立的 GitHub 問題應採用的格式:
在下列範本設定檔中,
title和body欄位會使用建構作業中的替代變數:{ "title": "Build {{.Build.BuildTriggerId}}: {{.Build.Status}}", "body": "[{{.Build.ProjectId}}] {{.Build.BuildTriggerId}} status: **{{.Build.Status}}**\n\n[View Logs]({{.Build.LogUrl}})" }如要查看範例,請參閱 GitHub Issues 通知程式的範本設定檔。
您可以從建立問題的 GitHub API 端點,透過可用的主體參數設定其他欄位。
編寫通知程式設定檔,設定 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 篩選建構事件」。
將通知程式設定檔和範本檔案上傳至 Cloud Storage bucket:
如果沒有 Cloud Storage bucket,請執行下列指令建立 bucket,其中 bucket-name 是您要為 bucket 命名的名稱,須符合命名規定。
gcloud storage buckets create gs://bucket-name/將通知程式設定檔和範本檔案上傳至值區:
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是範本檔案的名稱。
將通知程式部署至 Cloud Run:
gcloud run deploy service-name \ --image=us-east1-docker.pkg.dev/gcb-release/cloud-build-notifiers/githubissues:latest \ --no-allow-unauthenticated \ --update-env-vars=CONFIG_PATH=config-path,PROJECT_ID=project-id其中:
service-name是要部署映像檔的 Cloud Run 服務名稱。config-path是 GitHub Issues 通知程式 (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 中找到先前的映像檔版本和標記。授予 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 專案編號。
建立服務帳戶,代表您的 Pub/Sub 訂閱身分:
gcloud iam service-accounts create cloud-run-pubsub-invoker \ --display-name "Cloud Run Pub/Sub Invoker"您可以使用
cloud-run-pubsub-invoker,或將其改成不同於專案中其他服務帳戶的名稱。 Google Cloud將 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。
建立
cloud-builds主題,接收通知程式的建構更新訊息:gcloud pubsub topics create cloud-builds您也可以在建構設定檔中定義自訂主題名稱,這樣訊息就會改為傳送至自訂主題。在這種情況下,您會建立具有相同自訂主題名稱的主題:
gcloud pubsub topics create topic-name詳情請參閱「要接收建構作業通知的 Pub/Sub 主題」。
為通知程式建立 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 字串,透過「建構」資源中列出的任何欄位,篩選建構設定檔中的建構事件。如要尋找與欄位相關聯的確切語法,請參閱 cloudbuild.proto 檔案。
依觸發條件 ID 篩選
如要依觸發條件 ID 篩選,請使用 build.build_trigger_id 在 filter 欄位中指定觸發條件 ID 的值,其中 trigger-id 是觸發條件 ID 的字串:
filter: build.build_trigger_id == trigger-id
依狀態篩選
如要依狀態篩選,請使用 build.status 在 filter 欄位中指定要篩選的建構狀態。
以下範例說明如何使用 filter 欄位,依 SUCCESS 狀態篩選建構事件:
filter: build.status == Build.Status.SUCCESS
您也可以篩選不同狀態的建構作業。以下範例說明如何使用 filter 欄位,篩選狀態為 SUCCESS、FAILURE 或 TIMEOUT 的建構事件:
filter: build.status in [Build.Status.SUCCESS, Build.Status.FAILURE, Build.Status.TIMEOUT]
如要查看其他可篩選的狀態值,請參閱「建構資源參考資料」下的「狀態」。
依標記篩選
如要依標記篩選,請使用 build.tags 在 filter 欄位中指定標記的值,其中 tag-name 是標記的名稱:
filter: tag-name in build.tags
您可以使用 size,根據建構事件中指定的標記數量進行篩選。在下列範例中,filter 欄位會篩選出具有兩個標籤的建構事件,其中一個標籤指定為 v1:
filter: size(build.tags) == 2 && "v1" in build.tags
依圖片篩選
如要依映像檔篩選,請使用 build.images 在 filter 欄位中指定映像檔的值,其中 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-one 或 us-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_time、build.start_time 或 build.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_NAME 和 REPO_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}$")
如要查看預設替代值清單,請參閱「使用預設替代值」。
後續步驟
- 瞭解 Cloud Build 通知程式。
- 瞭解如何訂閱建構通知。
- 瞭解如何撰寫 Cloud Build 建構設定檔。