本文說明如何驗證 Cloud Deploy 部署作業。
您可以設定 Cloud Deploy 和 Skaffold,確認已部署至任何目標的應用程式是否正常運作。驗證程序會使用您自己的測試映像檔完成,您可以設定 Cloud Deploy 和 Skaffold,在部署完成後執行這些測試。
根據預設,部署驗證會在 Cloud Deploy 執行環境中執行,但您也可以將其設定為在應用程式執行的相同叢集中執行。
部署驗證的運作方式為何?
- 您設定 Skaffold 以進行驗證。 - 這項設定會指出用來執行測試的容器映像檔,以及從該容器映像檔執行的特定指令 (例如指令碼)。 
- 您可以在發布管道中設定一或多個目標,用於部署驗證。 - 這項設定會啟用對部署至該目標的工作負載進行驗證。 
- 推出作業部署完成 ( - skaffold apply) 後,Cloud Deploy 會在 Cloud Deploy 執行環境中執行- skaffold verify指令。- 如果是部署至 Google Kubernetes Engine 和 GKE Enterprise,您可以選擇在執行應用程式容器的同一叢集中執行驗證容器。 
- Skaffold 會叫用 - skaffold.yaml的- verify節中指定的測試,以便針對已部署的應用程式執行。
- 執行測試的結果是否成功,代表驗證是否成功。 - 驗證成功與否取決於執行的容器結束代碼。 - 0表示成功。非零的結束代碼表示失敗。如要產生所需的驗證結果,請確認容器會以適當的結束代碼結束。如果驗證程序執行多個容器,則所有容器都必須成功,驗證程序才會成功。
- 如果驗證失敗,推出作業也會失敗。 
- 如果部署在驗證期間失敗,您可以檢查推出作業:   
 
- 
您也可以終止進行中的驗證工作。 
用於驗證的元件
rollout 資源包含下列物件,可支援部署驗證:
- 階段 - 在推行中,邏輯上會一併分組的作業 (工作) 集合,例如部署或部署及驗證。 
- 工作 - 要在推出作業中執行的特定作業,例如部署或驗證。 
- 工作執行作業 - 工作執行是推出資源的子項,是工作的例項,例如嘗試部署。 
如要進一步瞭解 Cloud Deploy 資源,請參閱「Cloud Deploy 服務架構」
部署驗證產生的通知
Cloud Deploy 會產生 Pub/Sub 訊息,並針對下列事件發布:
- 建立、更新及刪除工作執行作業 - 這些通知會發布至 - clouddeploy-resources主題,並包含下列屬性:- Resource
- ResourceType(- JobRun)
- Action(- Create、- Update、- Delete)
- 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(- Start、- Succeed、- Failure)
- ProjectNumber
- Location
- TargetId
- DeliveryPipelineId
- ReleaseId
- RolloutId
- JobRunId
- PhaseId
- JobId
- JobType(- Deploy或- Verify)
 
以下是發布至 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 設定這個執行環境,就像為 RENDER 和 DEPLOY 設定一樣。
設定 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- 目標的特定執行階段類型。 - GKE、- ANTHOS或- RUN其中之一。
- 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 還可將您設定的任何部署參數傳遞至自訂容器。
瞭解詳情。