在部署前後執行掛鉤

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

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

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

部署掛鉤應為冪等。如果特定動作執行超過一次,不會產生額外效果。

部署後掛鉤的運作方式

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

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

  2. 您可以在推送 pipeline 進度的一或多個階段中設定掛鉤,每個階段都會參照您在 skaffold.yaml 中設定的其中一個 customActions

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

    predeploy 勾子一律會在階段中做為第一項工作執行。

  4. 推出作業的部署工作執行完畢後,Cloud Deploy 會執行 skaffold.yaml 中設定的所有指令,這些指令會參照管道階段中的 postdeploy 節。

部署後掛鉤會在預設的 Cloud Deploy 執行環境中執行,或是在指定的替代執行環境中執行。如要部署至 GKE,您可以選擇在應用程式部署的同一叢集上執行掛鉤

搭配初期測試部署策略使用部署掛鉤

為初期測試部署設定部署掛鉤時,請注意下列事項:

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

  • 如果是自動 Canary,系統只會在第一階段部署前執行 predeploy hook,並只會在最後階段 (穩定) 部署後執行 postdeploy hook。

在 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" 是這裡指定的典型指令,用於叫用殼層,您會在 args 中加入要在該殼層中執行的指令。

  • 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 部署作業,不適用於 Cloud Run。部署至 Cloud Run 時,只能在 Cloud Deploy 執行環境中執行掛鉤。

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

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

以下是 customActions 節的範例,其中包含 executionMode,可在應用程式叢集上叫用 Hook 容器:

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 類型的目標,則為 GKE 連結叢集成員的完整資源名稱。

  • 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 還可以將您設定的任何部署參數傳遞至自訂容器。

瞭解詳情

後續步驟