本文說明如何驗證 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.yamlverify節中指定的測試,針對已部署的應用程式執行。執行的測試是否成功,代表驗證是否成功。
驗證是否成功取決於執行的容器結束代碼。
0表示成功。如果結束代碼不是零,表示失敗。如要產生預期的驗證結果,請確保容器以適當的結束代碼結束。如果驗證時執行了多個容器,則所有容器都必須成功執行,驗證才會成功。如果驗證失敗,推出作業也會失敗。
如果驗證期間部署失敗,您可以檢查推出作業來查看:
-
您也可以終止正在進行的驗證工作。
驗證所用的元件
rollout 資源包含下列物件,可支援部署驗證:
階段
推出作業中邏輯上歸為一組的作業 (工作) 集合,例如部署或部署及驗證。
工作
要在推出作業中執行的特定作業,例如部署或驗證。
工作執行作業
工作執行是推出資源的子項,也是工作的執行個體,例如部署嘗試。
如要進一步瞭解 Cloud Deploy 資源,請參閱 Cloud Deploy 服務架構
部署驗證產生的通知
Cloud Deploy 會產生 Pub/Sub 訊息,並針對下列事件發布這些訊息:
建立、更新及刪除作業執行
這些通知會發布至
clouddeploy-resources主題,並包含下列屬性:ResourceResourceType(JobRun)Action(Create、Update、Delete)ProjectNumberLocationTargetIdDeliveryPipelineIdReleaseIdRolloutIdJobRunId
以下是工作執行建立作業的 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主題,並包含下列屬性:ResourceResourceType(JobRun)Action(Start、Succeed、Failure)ProjectNumberLocationTargetIdDeliveryPipelineIdReleaseIdRolloutIdJobRunIdPhaseIdJobIdJobType(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 執行環境中執行驗證。
如要在叢集上執行驗證容器,請在特定驗證容器的 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目標的特定執行階段類型。
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 還可以將您設定的任何部署參數傳遞至自訂容器。
瞭解詳情。