自動執行建構作業,因應 Pub/Sub 事件

Cloud Build Pub/Sub 觸發條件可讓您執行建構作業,以回應透過 Pub/Sub 發布的 Google Cloud 事件。您可以根據 Pub/Sub 事件的資訊,設定建構作業的參數,並決定是否要執行建構作業來回應事件。Pub/Sub 觸發條件可設定為監聽任何 Pub/Sub 主題。

本頁說明如何建立 Pub/Sub 觸發條件,自動執行建構作業,因應 Artifact Registry 和 Cloud Storage 中的事件。

限制

使用 VPC Service Controls 時,系統不支援 Cloud Build Pub/Sub 觸發條件。

事前準備

  • 啟用 Cloud Build API。

    啟用 API 時所需的角色

    如要啟用 API,您需要具備服務使用情形管理員 IAM 角色 (roles/serviceusage.serviceUsageAdmin),其中包含 serviceusage.services.enable 權限。瞭解如何授予角色

    啟用 API

  • 請確保原始碼包含建構設定檔或存放區中的 Dockerfile
  • 如要使用本頁的 gcloud 指令,請安裝 Google Cloud CLI

建立可回應 Artifact Registry 事件的自動建構觸發條件

您可以建立 Pub/Sub 觸發條件,回應 Artifact Registry 事件,例如映像檔推送、加上標記或刪除時。本節將說明如何建立 Pub/Sub 觸發條件,在將新標記推送至現有映像檔時,叫用建構作業。如果您不熟悉 Artifact Registry,請參閱 Artifact Registry 總覽

控制台

如要使用 Google Cloud 控制台建立觸發條件,監聽推送至 Artifact Registry 現有映像檔的新標記,請按照下列步驟操作:

  1. 開啟「觸發條件」頁面:

    開啟「觸發條件」頁面

  2. 在頁面頂端選取專案,然後按一下「開啟」

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

  4. 輸入下列觸發條件設定:

    • 名稱:輸入觸發條件的名稱。
    • 「區域」:選取觸發條件的區域

      • 如果與觸發條件相關聯的建構設定檔指定了私人集區,Cloud Build 會使用該私人集區執行建構。在這種情況下,您在觸發條件中指定的區域,必須與您建立私人集區的區域相符。
      • 如果與觸發條件相關聯的建構設定檔指定私人集區,Cloud Build 會使用預設集區,在與觸發條件相同的區域中執行建構。
    • 說明 (選填):輸入觸發條件的說明。

    • 「Event」(事件):選取「Pub/Sub message」(Pub/Sub 訊息),做為叫用觸發條件的事件。

    • 訂閱項目:選取要訂閱的 Pub/Sub 主題,用來當做觸發事件。下拉式選單會顯示專案中的所有現有主題。

      • Pub/Sub 主題:從下拉式選單中選取 gcr 主題,或按照「設定 Pub/Sub 通知」一文中的操作說明手動建立主題。
    • 來源:選取在 Pub/Sub 觸發條件執行時要建構的來源。

    • 存放區代別:選取「第 2 代」

    • 存放區:選取存放區。

    • 分支版本標記:指定要比對的分支版本或標記值的規則運算式。如要瞭解可接受的規則運算式語法,請參閱 RE2 語法

    • 註解控制:如果您選取「提取要求 (僅限 GitHub 應用程式)」做為事件,請選擇下列其中一個選項,控管觸發條件是否會自動執行建構作業:

      • 必要 (擁有者和協作者除外):存放區擁有者或協作者建立或更新提取要求時,觸發條件會自動執行建構作業。如果動作是由外部貢獻者發起,只有在擁有者或協作者對提取要求加註 /gcbrun 時,才會執行建構作業。

      • 必要:當任何貢獻者建立或更新提取要求時,只有在擁有者或協作者對提取要求加上 /gcbrun 註解後,才會執行建構作業。每當提取要求有變更時,系統就會執行建構作業。

      • 不需設定:任何貢獻者建立或更新提取要求時,觸發條件會自動執行建構作業。

  5. 設定:選取建構設定檔 (位於遠端存放區中),或建立內嵌建構設定檔,以用於建構作業。

    • 類型:選取要用於建構作業的設定類型。
      • Cloud Build 設定檔 (yaml 或 json): 使用建構設定檔進行設定。
      • Dockerfile:使用 Dockerfile 進行設定。
      • 建構包:使用 buildpacks 進行設定。
    • 位置:指定設定的位置。

      • 存放區:如果設定檔位於遠端存放區,請提供版本設定檔Dockerfile 目錄或建構套件目錄的位置。如果版本設定類型為 Dockerfile 或建構套件,您需要提供產生的映像檔名稱,並視需要提供建構作業的逾時時間。提供 Dockerfile 或建構套件映像檔名稱後,您會看到版本將執行的 docker buildpack 指令預覽。
      • Buildpack 環境變數 (選用):如果您選取 buildpacks 做為設定類型,請按一下「新增套件環境變數」,指定 buildpack 環境變數和值。如要進一步瞭解建構包環境變數,請參閱「環境變數」。
      • 內嵌:如果您選取「Cloud Build 設定檔 (yaml 或 json)」做為設定選項,可以內嵌指定建構設定。點選「開啟編輯器」,在Google Cloud 控制台中使用 YAML 或 JSON 語法撰寫建構設定檔。點選「完成」儲存建構設定。

  6. 替代 (選用):如果您選取建構設定檔做為建構設定選項,可以使用這個欄位定義觸發程序專用的替代變數

    在下列範例中,我們要從酬載和與 gcr 事件相關聯的動作中,取得圖片標記的名稱。如要這麼做,請使用酬載繫結建立替代變數。

    指定下列變數和值:

    變數名稱 變數值
    _IMAGE_TAG $(body.message.data.tag)
    _ACTION $(body.message.data.action)

    body.message 參照發布者發布的 PubSubMessage,並由訂閱者取用。如要查看更多 Pub/Sub 通知酬載範例,請參閱「通知範例」。

  7. 篩選器 (選用):您可以在觸發條件中建立篩選器,方法是在替代變數上指定篩選器,藉此判斷觸發條件是否會執行建構,以回應傳入的酬載。篩選運算式必須評估為 true,建構作業才會執行。

    如果主題有多則訊息,我們建議在設定 Pub/Sub 觸發條件時使用篩選功能。您可以透過篩選器精確控管因應傳入的 Pub/Sub 訊息而執行的建構作業。如要瞭解設定不含篩選器的觸發條件相關風險,請參閱「不含篩選器的觸發條件相關風險」。

    在以下範例中,我們希望在將新標記推送至現有映像檔時,觸發條件會執行建構作業。我們會使用篩選條件運算子,檢查 _IMAGE_TAG 變數是否與現有代碼名稱相符,以及 _ACTION 變數是否與 INSERT 相符,藉此尋找新加入的資料。

    將下列項目指定為篩選條件:

    • _IMAGE_TAG != ""
    • _ACTION == INSERT

    Pub/Sub 觸發條件的篩選語法會使用一般運算語言 (CEL) 評估運算式。如要進一步瞭解 CEL,請參閱 cel-spec 存放區。

  1. 按一下「建立」即可建立自動建構觸發條件。

gcloud

如要建立觸發程序,監聽推送至 Artifact Registry 現有映像檔的新標記,請使用 gcloud 指令:

  1. 開啟終端機視窗。
  2. 執行 gcloud 指令,在專案中建立自動建構觸發條件。在下列範例中,觸發條件會根據替代變數 _IMAGE_TAG 定義的指定酬載,回應標記符合 prod 的建構作業,以及符合 INSERT 的動作。

     gcloud builds triggers create pubsub \
       --region=REGION \
       --name=TRIGGER_NAME \
       --repository=projects/PROJECT_ID/locations/REGION/connections/CONNECTION_NAME/repositories/REPO_NAME \
       --topic=projects/PROJECT_ID/topics/TOPIC_NAME \
       --build-config=BUILD_CONFIG \ # or --inline-config=INLINE_BUILD_CONFIG
       --substitutions=\
         '_IMAGE_TAG_="$(body.message.data.tag)",' \
         '_ACTION="$(body.message.data.action)"' \
       --subscription-filter='_IMAGE_TAG != "" && _ACTION == "INSERT"' \
       --tag=TAG_NAME  # or --branch=BRANCH_NAME
    

其中:

  • REGION 是觸發條件的區域
  • TRIGGER_NAME 是觸發條件的名稱。
  • PROJECT_ID 是您的雲端專案 ID。
  • CONNECTION_NAME 是主機連線的名稱。
  • REPO_NAME 是存放區的名稱。
  • TOPIC_NAME 是您訂閱的 Pub/Sub 主題名稱。
  • BUILD_CONFIG 是建構設定檔的路徑。
  • INLINE_BUILD_CONFIG 是內建建構設定檔的路徑。
  • 如要將觸發條件設為根據標記建構,TAG_NAME 是標記的名稱。
  • 如要將觸發條件設為在分支版本上建構,BRANCH_NAME 是分支版本的名稱。

建立會回應 Cloud Storage 事件的自動建構觸發條件

您可以建立 Pub/Sub 觸發條件,回應 Cloud Storage 事件,例如將新的二進位檔推送至現有儲存空間 bucket 時。本節說明如何建立 Pub/Sub 觸發程序,以便在將新二進位檔部署至上傳的 bucket 時,以建構作業做為回應。如果您不熟悉 Cloud Storage,請參閱快速入門導覽課程

控制台

如要使用 Google Cloud 控制台建立監聽 Cloud Storage 事件的觸發條件,請按照下列步驟操作:

  1. 開啟「觸發條件」頁面:

    開啟「觸發條件」頁面

  2. 在頁面頂端選取專案,然後按一下「開啟」

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

  4. 輸入下列觸發條件設定:

    • 名稱:輸入觸發條件的名稱。
    • 「區域」:選取觸發條件的區域

      • 如果與觸發條件相關聯的建構設定檔指定了私人集區,Cloud Build 會使用該私人集區執行建構。在這種情況下,您在觸發條件中指定的區域,必須與您建立私人集區的區域相符。
      • 如果與觸發條件相關聯的建構設定檔指定私人集區,Cloud Build 會使用預設集區,在與觸發條件相同的區域中執行建構。
    • 說明 (選填):輸入觸發條件的說明。

    • 「Event」(事件):選取「Pub/Sub message」(Pub/Sub 訊息),做為叫用觸發條件的事件。

    • 訂閱項目:選取要訂閱的 Pub/Sub 主題,用來當做觸發事件。下拉式選單會顯示專案中的所有現有主題。

    • 來源:選取在 Pub/Sub 觸發條件執行時要建構的來源。

    • 存放區代別:選取「第 2 代」

    • 存放區:選取存放區。

    • 分支版本標記:指定要比對的分支版本或標記值的規則運算式。如要瞭解可接受的規則運算式語法,請參閱 RE2 語法

    • 註解控制:如果您選取「提取要求 (僅限 GitHub 應用程式)」做為事件,請選擇下列其中一個選項,控管觸發條件是否會自動執行建構作業:

      • 必要 (擁有者和協作者除外):存放區擁有者或協作者建立或更新提取要求時,觸發條件會自動執行建構作業。如果動作是由外部貢獻者發起,只有在擁有者或協作者對提取要求加註 /gcbrun 後,才會執行建構作業。

      • 必要:當任何貢獻者建立或更新提取要求時,只有在擁有者或協作者對提取要求加上 /gcbrun 註解後,才會執行建構作業。每當提取要求有變更時,系統就會執行建構作業。

      • 不需設定:任何貢獻者建立或更新提取要求時,觸發條件會自動執行建構作業。

  5. 設定:選取建構設定檔 (位於遠端存放區中),或建立內嵌建構設定檔,以用於建構作業。

    • 類型:選取要用於建構作業的設定類型。
      • Cloud Build 設定檔 (yaml 或 json): 使用建構設定檔進行設定。
      • Dockerfile:使用 Dockerfile 進行設定。
      • 建構包:使用 buildpacks 進行設定。
    • 位置:指定設定的位置。

      • 存放區:如果設定檔位於遠端存放區,請提供版本設定檔Dockerfile 目錄或建構套件目錄的位置。如果版本設定類型為 Dockerfile 或建構套件,您需要提供產生的映像檔名稱,並視需要提供建構作業的逾時時間。提供 Dockerfile 或建構套件映像檔名稱後,您會看到版本將執行的 docker buildpack 指令預覽。
      • Buildpack 環境變數 (選用):如果您選取 buildpacks 做為設定類型,請按一下「新增套件環境變數」,指定 buildpack 環境變數和值。如要進一步瞭解建構包環境變數,請參閱「環境變數」。
      • 內嵌:如果您選取「Cloud Build 設定檔 (yaml 或 json)」做為設定選項,可以內嵌指定建構設定。點選「開啟編輯器」,在Google Cloud 控制台中使用 YAML 或 JSON 語法撰寫建構設定檔。點選「完成」儲存建構設定。

  6. 替代 (選用):如果您選取建構設定檔做為建構設定選項,可以使用這個欄位定義觸發程序專用的替代變數

    在這個範例中,我們希望在二進位檔上傳至值區時,監控新二進位檔的部署作業。如要取得這項資料,可以使用酬載繫結建立替代變數。

    指定下列變數和值:

    變數名稱 變數值
    _EVENT_TYPE $(body.message.attributes.eventType)
    _BUCKET_ID $(body.message.attributes.bucketId)
    _OBJECT_ID $(body.message.attributes.objectId)

    body.message 參照發布者發布的 PubSubMessage,並由訂閱者取用。如要查看更多 Pub/Sub 通知酬載範例,請參閱「通知範例」。

  7. 篩選器 (選用):您可以在觸發條件中建立篩選器,方法是在替代變數上指定篩選器,藉此判斷觸發條件是否會執行建構,以回應傳入的酬載。篩選運算式必須評估為 true,建構作業才會執行。

    如果主題有多則訊息,我們建議在設定 Pub/Sub 觸發條件時使用篩選功能。您可以透過篩選器精確控管因應傳入的 Pub/Sub 訊息而執行的建構作業。如要瞭解設定不含篩選器的觸發條件相關風險,請參閱「不含篩選器的觸發條件相關風險」。

    由於我們希望在新的二進位檔部署至特定值區時,觸發條件能執行建構作業,因此可以使用「==」運算子檢查是否完全相符。如要使用規則運算式比對,也可以使用「matches」關鍵字。

    將下列項目指定為篩選條件:

    • _EVENT_TYPE == OBJECT_FINALIZE
    • _OBJECT_ID^<object-id>$ 相符
    • _BUCKET_ID^<bucket-id>$ 相符
  1. 按一下「建立」即可建立自動建構觸發條件

gcloud

如要建立自動建構觸發條件,監聽 Cloud Storage 中特定事件類型的建構事件,請按照下列步驟操作:

  1. 開啟終端機視窗。
  2. 執行 gcloud 指令,在專案中建立自動建構觸發條件。在下列範例中,觸發條件設定為回應建構作業,並將 Cloud Storage 事件與推送至現有儲存空間 bucket 的新二進位檔建立關聯:

     gcloud builds triggers create pubsub \
       --region=REGION \
       --name=TRIGGER_NAME \
       --repository=projects/PROJECT_ID/locations/REGION/connections/CONNECTION_NAME/repositories/REPO_NAME \
       --topic=projects/PROJECT_ID/topics/TOPIC_NAME \
       --build-config=BUILD_CONFIG \ # or --inline-config=INLINE_BUILD_CONFIG
       --substitutions=\
         '_EVENT_TYPE="$(body.message.attributes.eventType)",' \
         '_BUCKET_ID="$(body.message.attributes.bucketId)",' \
         '_OBJECT_ID="$(body.message.attributes.objectId)"' \
       --subscription-filter='_EVENT_TYPE == "OBJECT_FINALIZE" && _OBJECT_ID.matches("<object-id>") && _BUCKET_ID.matches("<bucket-id>")' \
       --tag=TAG_NAME  # or --branch=BRANCH_NAME
    

其中:

  • REGION 是觸發條件的區域
  • TRIGGER_NAME 是觸發條件的名稱。
  • PROJECT_ID 是您的雲端專案 ID。
  • CONNECTION_NAME 是主機連線的名稱。
  • REPO_NAME 是存放區的名稱。
  • TOPIC_NAME 是您訂閱的 Pub/Sub 主題名稱。
  • BUILD_CONFIG 是建構設定檔的路徑。
  • INLINE_BUILD_CONFIG 是內建建構設定檔的路徑。
  • 如要將觸發條件設為根據標記建構,TAG_NAME 是標記的名稱。
  • 如要將觸發條件設為在分支版本上建構,BRANCH_NAME 是分支版本的名稱。

未經過濾的觸發條件相關風險

如果尚未在 Pub/Sub 觸發程序上設定篩選器,且觸發程序修改了構件或物件,導致系統無意間將新訊息發布至觸發程序監聽的主題,觸發程序可能會無限次叫用建構作業。舉例來說,如果觸發條件符合下列情況,可能會無限次叫用建構作業:

  • 指向 gcr 主題。
  • gcr 中建立任何圖片或標記。
  • 指向值區中特定物件的 gcs 主題,並修改該物件。

如果遇到無限迴圈,可以刪除或更新觸發條件,改為指向其他主題,避免每次叫用建構作業時產生額外費用。

後續步驟