驗證部署作業

本文說明如何驗證 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.yaml verify 節中指定的測試,針對已部署的應用程式執行。

  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 執行環境中執行驗證。

如要在叢集上執行驗證容器,請在特定驗證容器的 verify 節中,於 skaffold.yaml 設定檔內加入 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 還可以將您設定的任何部署參數傳遞至自訂容器。

瞭解詳情