本文說明如何驗證 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 還可將您設定的任何部署參數傳遞至自訂容器。
瞭解詳情。