在部署前後執行掛鉤

本文說明如何在部署前和/或部署後執行任意程式或作業。

您可以設定 Cloud Deploy 和 Skaffold 來執行動作,以便執行部署前和/或部署後動作。以這種方式執行的程式稱為「鉤子」。預先部署和後期部署掛鉤會在推出作業中做為預先部署和後期部署工作執行。

您可以將每個鉤子設為在指定的 Cloud Deploy 執行環境中執行,但如果要部署至 Google Kubernetes Engine,則可以選擇將鉤子設為在部署應用程式的 GKE 叢集中執行。

系統會假設部署掛鉤為冪等。如果特定動作執行多次,就不會產生額外效果。

部署掛鉤的運作方式為何?

以下說明設定部署掛鉤的步驟,以及執行這些掛鉤的 Skaffold 和 Cloud Deploy 程序:

  1. 您可以設定特定版本使用的 skaffold.yaml,以便納入 customActions,藉此識別用於執行鉤子的容器映像檔,以及要在每個容器中執行的特定指令或指令碼。

  2. 您可以在發布管道進度中的一或多個階段中設定鉤子,每個階段都會參照您在 skaffold.yaml 中設定的 customActions

  3. 在推出部署工作執行前,Skaffold 會執行在 skaffold.yaml 中設定的任何指令,這些指令會在管道進度中的 predeploy 節中參照。

    predeploy 鉤子一律會在階段中以第一個工作執行。

  4. 在推出作業執行完畢後,Cloud Deploy 會執行在 skaffold.yaml 中設定的任何指令,這些指令會在管道進度中的 postdeploy 節中參照。

部署掛鉤會在預設 Cloud Deploy 執行環境中執行,或是在指定的替代執行環境中執行。針對 GKE 和 GKE Enterprise 的部署作業,您可以選擇在部署應用程式的同一叢集中執行鉤子

搭配初期測試部署做法使用部署掛鉤

為初期測試部署設定部署鉤子時,請注意下列幾點:

  • 在提交管道階段中,鉤子設定 (predeploypostdeploy) 位於 strategy.canary.canaryDeploymentstrategy.canary.customCanaryDeployment.phaseConfigs 下方,而非 strategy.standard 下方。

  • 對於自動化測試群組,predeploy 鉤子只會在第一階段的部署前執行,而 postdeploy 鉤子只會在最後階段 (穩定版) 的部署後執行。

在 Skaffold 中設定動作

skaffold.yaml 檔案中,customActions 節具有一或多個 customActions,其設定如下:

customActions:
- name: ACTION_NAME
  containers:
  - name: CONTAINER_NAME
    image: IMAGE
    command: [COMMANDS_TO_RUN]
    args: [LIST_OF_ARGS]

在這個 customerActions 節中:

  • ACTION_NAME

    是此動作的名稱。這個名稱可以是任何名稱,但必須在這個 skaffold.yaml 中不重複。這是從在發布管道階段定義的預先部署和後期部署動作參照的名稱。

  • CONTAINER_NAME

    是特定容器的名稱。這個名稱可以是任何名稱,但必須在這個 skaffold.yaml 中不重複。

  • IMAGE

    是指令執行的容器映像檔名稱。

  • COMMANDS_TO_RUN

    是要在該容器上執行的進入點清單。"/bin/sh" 是您在這裡指定的一般指令,用於叫用殼層,您可以在該殼層中執行的引數中加入指令。

  • LIST_OF_ARGS

    是提供給指令的引數清單。這是以半形逗號分隔的清單,每個引數都以引號括住。如果 COMMAND_TO_RUN"/bin/sh",則此處的其中一個引數會是 "-c",另一個引數則是您要在要叫用的殼層中執行的完整指令。

    範例如下:

    command: ["/bin/sh"]
    args: ["-c", `echo "This command ran!"`]
    

如要進一步瞭解 Skaffold 自訂動作,請參閱 Skaffold 說明文件

設定管道以參照動作

如要完成部署掛鉤設定,請設定提交管道,以便參照您在 skaffold.yaml 檔案中定義的自訂動作。預先部署和後期部署動作會在管道進度中的一個或多個特定階段中設定。

以下是使用 standard 部署策略時,在管道階段中設定預先部署和後期部署掛鉤的方式:

serialPipeline:
  stages:
  - targetId: hooks-staging
    profiles: []
    strategy:
      standard:
        predeploy:
          actions: ["PREDEPLOY-ACTION"]
        postdeploy:
          actions: ["POSTDEPLOY-ACTION"] 

在這個 yaml 中:

  • PREDEPLOY_ACTION

    與您在 skaffold.yaml 中使用的 ACTION_NAME 相同,用於定義要在部署前執行的自訂動作。

  • POSTDEPLOY_ACTION

    與您在 skaffold.yaml 中使用的 ACTION_NAME 相同,用於定義要在部署後執行的自訂動作。

您可以為 predeploypostdeploy 指定多個動作,並以半形逗號分隔。指定多個動作時,系統會依指定的順序依序執行。工作 (預先部署或後置部署) 在第一個失敗的動作上失敗,且不會執行剩餘的動作。

根據預設,如果您同時執行多個容器,且其中一個工作失敗,系統會停止兩個容器。您可以使用 Skaffold 自訂動作失敗策略設定這項行為。

在應用程式叢集中執行鉤子

根據預設,部署掛鉤會在 Cloud Deploy 執行環境中執行。您也可以設定 Skaffold,在應用程式執行的同一叢集中執行這些自訂動作。在 skaffold.yaml設定自訂動作在管道階段啟用時,系統會自動在目標叢集中執行該動作。

這項功能僅適用於 GKE 和 GKE Enterprise 的部署作業,不適用於 Cloud Run。部署至 Cloud Run 的作業只能在 Cloud Deploy 執行環境中執行鉤子。

如要在叢集中執行鉤子,請在 skaffold.yaml 設定檔的特定自訂動作 customActions 節內加入 executionMode.kubernetesCluster 節:

customActions
- name: ACTION_NAME
  containers:
  - name: CONTAINER_NAME
    image: IMAGE
    command: [COMMANDS_TO_RUN]
    args: [LIST_OF_ARGS]
  executionMode:
    kubernetesCluster: {}

以下是包含 executionModecustomActions 節,可在應用程式叢集中叫用鉤子容器:

customActions:
- name: predeploy-action
  containers:
  - name: predeploy-echo
    image: ubuntu
    command: ["/bin/sh"]
    args: ["-c", 'echo "this is a predeploy action"' ]
  executionMode:
    kubernetesCluster: {}

executionMode 節點為選用項目,如果省略,Skaffold 會在 Cloud Deploy 執行環境中執行自訂動作容器。

可用的環境變數

Cloud Deploy 會在執行環境中提供並填入下列環境變數,供您用於鉤子:

  • ANTHOS_MEMBERSHIP

    如果目標為 ANTHOS 類型,則為 Anthos 會員資格的完整資源名稱。

  • CLOUD_RUN_LOCATION

    對於 RUN 類型的目標,則是 Cloud Run 服務部署所在的區域。

  • CLOUD_RUN_PROJECT

    如果目標類型為 RUN,則為建立 Cloud Run 服務的專案。

  • CLOUD_RUN_SERVICE

    如果目標為 RUN 類型,則為已部署的 Cloud Run 服務名稱。

  • CLOUD_RUN_SERVICE_URLS

    對於 RUN 類型的目標,使用者用來存取服務的網址 (以逗號分隔的清單)。您可以在Google Cloud 控制台的 Cloud Run 服務詳細資料中找到這些資訊。

  • CLOUD_RUN_REVISION

    對於 RUN 類型的目標,則是 Cloud Run 服務的特定修訂版本。

  • GKE_CLUSTER

    如果目標為 GKE 類型,請提供 Google Kubernetes Engine 叢集的完整資源名稱,例如 projects/p/locations/us-central1/clusters/dev

  • TARGET_TYPE

    目標的特定執行階段類型。GKEANTHOSRUN 其中之一。對於自訂目標,系統不會設定這個值。

  • CLOUD_DEPLOY_LOCATION

    包含 Cloud Deploy 資源的區域。

  • CLOUD_DEPLOY_DELIVERY_PIPELINE

    提交管道的 ID。

  • CLOUD_DEPLOY_TARGET

    目標的 ID。

  • CLOUD_DEPLOY_PROJECT

    包含 Cloud Deploy 資源的專案的 Google Cloud 專案編號。

  • CLOUD_DEPLOY_PROJECT_ID

    Google Cloud 專案 ID。

  • CLOUD_DEPLOY_RELEASE

    鉤子將執行的版本 ID。

  • CLOUD_DEPLOY_ROLLOUT

    包含鉤子工作內容的推送 ID。

  • CLOUD_DEPLOY_JOB_RUN

    代表工作目前執行狀態的工作執行程序 ID。

  • CLOUD_DEPLOY_PHASE

    包含鉤子工作內容的部署作業中的階段

將參數部署為環境變數

除了本節所列的環境變數外,Cloud Deploy 還可將您設定的任何部署參數傳遞至自訂容器。

瞭解詳情

後續步驟