本文档介绍了如何验证 Cloud Deploy 部署。
您可以配置 Cloud Deploy 和 Skaffold,以验证 您部署到任何目标的应用都可以正常工作。 验证是使用您自己的测试映像完成的,并且您将配置 部署后,使用 Cloud Deploy 和 Skaffold 运行这些测试 。
默认情况下,部署验证在 Cloud Deploy 中运行 执行环境 但您也可以 将其配置为在同一集群上运行 运行应用的位置
部署验证的工作原理是什么?
配置 Skaffold 以进行验证。
此配置标识用于运行的一个或多个容器映像 以及要在其中运行的特定命令(例如脚本) 容器映像
在广告投放中配置一个或多个目标 用于部署验证的流水线。
此配置可为部署到该配置的工作负载启用验证 目标。
部署发布 (
skaffold apply
) 后,Cloud Deploy 会运行skaffold verify
命令(位于 Cloud Deploy 执行环境中)。要部署到 Google Kubernetes Engine 和 GKE Enterprise,您可以选择 在应用所在的集群上运行验证容器 容器正在运行
Skaffold 会调用您的
verify
skaffold.yaml
,针对已部署的应用运行。所执行测试成功或失败表示验证成功或失败。
验证成功与否取决于所执行的容器的退出代码。
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
)
以下是失败作业的 Pub/Sub 消息示例
运行,发布到 clouddeploy-operations
主题:
{
"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 以进行部署验证
为目标启用部署验证需要在以下位置包含 verify
节
用于部署的 skaffold.yaml
配置文件。此配置
如果您要为每个 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
配置中的 executionMode.kubernetesCluster
节
文件,放在特定验证容器的 verify
节中:
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 会运行
验证容器。
重新尝试验证
当验证作业失败时,您可以重新尝试验证,并运行以下命令来创建新的作业:
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
类型的目标,是指以 用户在访问您的服务时使用的凭据。您可以在 服务的 Cloud Run 服务详情(位于 Google Cloud 控制台。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_RELEASE
将在其中运行验证的版本 ID。
CLOUD_DEPLOY_ROLLOUT
包含待验证作业的发布的 ID。
CLOUD_DEPLOY_JOB_RUN
作业运行的 ID,表示 作业。
CLOUD_DEPLOY_PHASE
发布中包含待验证作业的阶段。