驗證部署作業

本文說明如何驗證 Cloud Deploy 部署作業。

您可以設定 Cloud Deploy 和 Skaffold,確認已部署至任何目標的應用程式是否正常運作。驗證程序會使用您自己的測試映像檔完成,您可以設定 Cloud Deploy 和 Skaffold,在部署完成後執行這些測試。

根據預設,部署驗證會在 Cloud Deploy 執行環境中執行,但您也可以將其設定為在應用程式執行的相同叢集中執行

部署驗證的運作方式為何?

  1. 設定 Skaffold 以進行驗證。

    這項設定會指出用來執行測試的容器映像檔,以及從該容器映像檔執行的特定指令 (例如指令碼)。

  2. 您可以在發布管道中設定一或多個目標,用於部署驗證。

    這項設定會啟用對部署至該目標的工作負載進行驗證。

  3. 推出作業部署完成 (skaffold apply) 後,Cloud Deploy 會在 Cloud Deploy 執行環境中執行 skaffold verify 指令。

    如果是部署至 Google Kubernetes Engine 和 GKE Enterprise,您可以選擇在執行應用程式容器的同一叢集中執行驗證容器。

  4. Skaffold 會叫用 skaffold.yamlverify 節中指定的測試,以便針對已部署的應用程式執行。

  5. 執行測試的結果是否成功,代表驗證是否成功。

    • 驗證成功與否取決於執行的容器結束代碼。

      0 表示成功。非零的結束代碼表示失敗。如要產生所需的驗證結果,請確認容器會以適當的結束代碼結束。如果驗證程序執行多個容器,則所有容器都必須成功,驗證程序才會成功。

    • 如果驗證失敗,推出作業也會失敗。

    • 如果部署在驗證期間失敗,您可以檢查推出作業:

      在 Google Cloud 控制台中查看推行計畫的詳細資料,包括驗證狀態

  6. 您可以忽略重試驗證失敗。

    您也可以終止進行中的驗證工作。

用於驗證的元件

rollout 資源包含下列物件,可支援部署驗證:

  • 階段

    在推行中,邏輯上會一併分組的作業 (工作) 集合,例如部署或部署及驗證。

  • 工作

    要在推出作業中執行的特定作業,例如部署或驗證。

  • 工作執行作業

    工作執行是推出資源的子項,是工作的例項,例如嘗試部署。

如要進一步瞭解 Cloud Deploy 資源,請參閱「Cloud Deploy 服務架構

部署驗證產生的通知

Cloud Deploy 會產生 Pub/Sub 訊息,並針對下列事件發布:

  • 建立、更新及刪除工作執行作業

    這些通知會發布至 clouddeploy-resources 主題,並包含下列屬性:

    • Resource
    • ResourceType (JobRun)
    • Action (CreateUpdateDelete)
    • ProjectNumber
    • Location
    • TargetId
    • DeliveryPipelineId
    • ReleaseId
    • RolloutId
    • JobRunId

以下是工作執行建立作業的 Pub/Sub 訊息範例,已發布至 clouddeploy-resources 主題:

{
    "ackId": "UAYWLF1GSFE3GQhoUQ5PXiM_NSAoRRAGAE8CKF15MFcrQVh9Dz4NGXJ9YXRiWRIJBkUHeF9cEQ1iXE5EB0nq0KDVV1dKXxYGAExQeVhbHQVoWVh0Bnn7h5nK-8HjYwk9OqKarPdtO4PY2fNHZiI9XhJLLD5-My5FQV5AEkw4G0RJUytDCypYEU4EISE-MD5FU0Q",
    "message": {
      "attributes": {
        "Action": "Create",
        "DeliveryPipelineId": "dv-pipeline",
        "JobRunId": "634f8c6f-30c3-49ca-af80-68dc24d4cc5d",
        "Location": "us-central1",
        "ProjectNumber": "253401481285",
        "ReleaseId": "test-release-100",
        "Resource": "projects/253401481285/locations/us-central1/deliveryPipelines/dv-pipeline/releases/test-release-100/rollouts/test-release-100-to-dev-0001/jobRuns/634f8c6f-30c3-49ca-af80-68dc24d4cc5d",
        "ResourceType": "JobRun",
        "RolloutId": "test-release-100-to-dev-0001"
      },
      "messageId": "5572937706805411",
      "publishTime": "2022-09-07T14:00:46.040Z"
    }
  },
  • 工作執行開始、成功和失敗

    這些通知會發布至 clouddeploy-operations 主題,並包含下列屬性:

    • Resource
    • ResourceType (JobRun)
    • Action (StartSucceedFailure)
    • ProjectNumber
    • Location
    • TargetId
    • DeliveryPipelineId
    • ReleaseId
    • RolloutId
    • JobRunId
    • PhaseId
    • JobId
    • JobType (DeployVerify)

以下是發布至 clouddeploy-operations 主題的失敗工作執行作業的 Pub/Sub 訊息範例:

{
    "ackId": "RFAGFixdRkhRNxkIaFEOT14jPzUgKEUUBAgUBXx9cEFPdVhec2hRDRlyfWB9aVsbCAUXU3cJURsHaE5tdR-6xcvaS0NVb18UAgRFWndfXhMEblhfcy-fkK3HwvT9U0AvOemNgdZpe6jHiulvZiM9XxJLLD5-My5FQV5AEkw4G0RJUytDCypYEU4EISE-MD5FUw",
    "message": {
      "attributes": {
        "Action": "Failure",
        "DeliveryPipelineId": "dv-pipeline",
        "JobId": "verify",
        "JobRunId": "b389224a-c259-4a00-ab75-c22e48bc3136",
        "JobType": "Verify",
        "Location": "us-central1",
        "PhaseId": "stable",
        "ProjectNumber": "253401481285",
        "ReleaseId": "test-release-101",
        "Resource": "projects/253401481285/locations/us-central1/deliveryPipelines/dv-pipeline/releases/test-release-101/rollouts/test-release-101-to-dev-0001/jobRuns/b389224a-c259-4a00-ab75-c22e48bc3136",
        "ResourceType": "JobRun",
        "RolloutId": "test-release-101-to-dev-0001",
        "TargetId": "dev"
      },
      "messageId": "5573609905896436",
      "publishTime": "2022-09-07T15:35:37.906Z"
    }
  },

設定 Cloud Deploy 以進行部署作業驗證

如要為 Cloud Deploy 目標啟用部署驗證功能,請在推送管道進度中,將 verify: true 屬性新增至特定目標 (或多個目標),如以下範例所示:

apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
 name: my-demo-app
description: main application pipeline
serialPipeline:
 stages:
 - targetId: dev
   profiles: []
   strategy:
     standard:
       verify: true
 - targetId: prod
   profiles: []
   strategy:
     standard:
       verify: false

在這個設定中,部署驗證功能會在 dev 目標上啟用,但不會在 prod 目標上啟用。verify: false 等同於省略 verify 屬性或整個 strategy 節。

驗證作業會在其專屬的執行環境中執行。您可以為 VERIFY 設定這個執行環境,就像為 RENDERDEPLOY 設定一樣。

設定 Skaffold 以驗證部署作業

如要為目標啟用部署驗證功能,您必須在部署作業的 skaffold.yaml 設定檔中加入 verify 節。如果您為每個目標使用不同的設定檔,則可以為特定 Skaffold 設定檔使用這項設定。

這個 verify 節點會指出要執行哪個容器來進行驗證,例如整合測試。

以下是包含 verify 節的 skaffold.yaml 範例:

apiVersion: skaffold/v4beta7
kind: Config
build:
  artifacts:
    - image: integration-test
      context: integration-test
manifests:
  rawYaml:
  - kubernetes.yaml
deploy:
  kubectl: {}
verify:
- name: verify-integration-test
  container:
    name: integration-test
    image: integration-test
    command: ["./test-systems.sh"]
- name: verify-endpoint-test
  container:
    name: alpine
    image: alpine
    command: ["/bin/sh"]
    args: ["-c", "wget #ENDPOINT_URL"]

這個簡單範例顯示 verify 節,用於識別要使用的容器,以及在該容器中執行的測試指令碼。本例中的 #ENDPOINT_URL 只是應用程式網址的預留位置,並非可用的 Cloud Deploy 環境變數。

在應用程式叢集中執行驗證容器

根據預設,部署作業驗證會在 Cloud Deploy 執行環境中執行。您也可以設定 Skaffold,在應用程式執行的同一叢集中執行驗證容器。在 skaffold.yaml 中設定叢集內驗證,並在目標上啟用驗證功能後,系統會自動在該目標的叢集中執行驗證。

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

如要在叢集中進行驗證,您必須使用 Skaffold 2.3 以上版本

如要在叢集中執行驗證容器,請在 skaffold.yaml 設定檔的 verify 節內,針對特定驗證容器的 verify 節,加入 executionMode.kubernetesCluster 節:

verify:
- name: 
  container:
    name: 
    image: 
    command: 
    args: 
  executionMode:
    kubernetesCluster:

以下是包含 executionMode 的驗證節,可在應用程式叢集中叫用驗證容器:

verify:
- name: integration-test-container
  container:
    name: integration-test-container
    image: integration-test-container
  executionMode:
    kubernetesCluster: {}

executionMode 節點為選用項目,如果省略這個節點,Skaffold 會在 Cloud Deploy 執行環境中執行驗證容器。

重新嘗試驗證

如果驗證工作失敗,您可以重試驗證,建立新的作業執行:

gcloud deploy rollouts retry-job ROLLOUT_NAME \
             --job-id=JOB_ID \
             --phase-id=PHASE_ID \
             --delivery-pipeline=PIPELINE_NAME \
             --release=RELEASE_NAME \
             --region=REGION

重試驗證後,推出狀態會從 FAILED 變更為 IN_PROGRESS

您只能針對驗證工作失敗的推出作業重試驗證。

可用的環境變數

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

  • ANTHOS_MEMBERSHIP

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

  • CLOUD_RUN_LOCATION

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

  • CLOUD_RUN_PROJECT

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

  • CLOUD_RUN_SERVICE

    如果目標為 RUN 類型,請提供已部署 Cloud Run 服務的完整資源名稱,例如 projects/p/locations/us-central1/services/dev

  • 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_DELIVERY_PIPELINE

    執行環境正在執行的 ID 提交管道。

  • CLOUD_DEPLOY_TARGET

    執行環境正在執行的目標 ID。

  • CLOUD_DEPLOY_PROJECT

    執行環境正在執行的 Google Cloud 專案編號。

  • CLOUD_DEPLOY_PROJECT_ID

    包含 Cloud Deploy 資源的 Google Cloud 專案 ID。

  • CLOUD_DEPLOY_RELEASE

    要執行驗證作業的版本 ID。

  • CLOUD_DEPLOY_ROLLOUT

    包含待驗證工作的推行版本 ID。

  • CLOUD_DEPLOY_JOB_RUN

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

  • CLOUD_DEPLOY_PHASE

    在推行中包含驗證工作的階段

將參數部署為環境變數

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

瞭解詳情