Cloud Build 可以透過所選管道傳送通知,讓您掌握建構作業的最新動態。本頁說明如何使用 GitHub Issues 通知程式設定通知。
事前準備
-
Enable the Cloud Build, Compute Engine, Cloud Run, Pub/Sub, and Secret Manager APIs.
- 安裝 Google Cloud CLI。
設定 GitHub 問題通知
下一節說明如何使用 GitHub Issues 通知程式手動設定 GitHub Issue 通知。如要自動化處理設定,請參閱「自動化處理通知設定」。
如要設定 GitHub 問題,請按照下列步驟操作:
建立 GitHub 個人存取權杖:
- 前往 GitHub 設定建立新權杖。
選取
repo
範圍。按一下「產生權杖」。
將 GitHub 權杖儲存在 Secret Manager 中:
在 Google Cloud 控制台中開啟「Secret Manager」頁面:
按一下「建立密鑰」。
輸入密鑰名稱。
在「Secret value」(密碼值) 下方,新增 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 值區讀取的權限:
前往 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/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 中找到先前的映像檔版本和標記。授予 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
字串,透過 Build 資源中列出的任何欄位,在建構設定檔中篩選建構事件。如要瞭解與欄位相關聯的確切語法,請參閱 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 建構設定檔。