本文档介绍了如何验证 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主题,并包含以下属性:ResourceResourceType(JobRun)Action(Create、Update、Delete)ProjectNumberLocationTargetIdDeliveryPipelineIdReleaseIdRolloutIdJobRunId
以下是发布到 clouddeploy-resources 主题的作业运行创建 Pub/Sub 消息示例:
{
"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 stanza。
验证操作在其自己的执行环境中执行。可以为 VERIFY 配置此执行环境,就像可以为 RENDER 和 DEPLOY 配置一样。
为部署验证配置 Skaffold
为目标启用部署验证需要在部署的 skaffold.yaml 配置文件中添加 verify stanza。如果您为每个目标使用单独的配置文件,则此配置可以针对特定的 Skaffold 配置文件。
此 verify stanza 用于标识要运行的一个或多个容器以进行验证(例如集成测试)。如果您指定了多个容器,它们会并行执行,而不是按顺序执行。
以下是包含 verify stanza 的 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 stanza,用于标识要使用的容器以及要在该容器中运行的测试脚本。此示例中的 #ENDPOINT_URL 只是应用网址的占位符,而不是可用的 Cloud Deploy 环境变量。
在应用集群上运行验证容器
默认情况下,部署验证在 Cloud Deploy 执行环境中运行。您还可以配置 Skaffold,以在应用运行的同一集群上运行验证容器。在 skaffold.yaml 中配置集群内验证并在目标上启用验证后,验证会在该目标的集群中自动运行。
此功能仅适用于部署到 GKE 和 GKE Enterprise 的应用,不适用于 Cloud Run。部署到 Cloud Run 的内容只能在 Cloud Deploy 执行环境中运行验证。
如需在集群上运行验证容器,请在 skaffold.yaml 配置文件的 verify stanza 中为特定验证容器添加 executionMode.kubernetesCluster stanza:
verify:
- name:
container:
name:
image:
command:
args:
executionMode:
kubernetesCluster:
以下是一个验证 stanza 示例,其中包含 executionMode 以在应用集群上调用验证容器:
verify:
- name: integration-test-container
container:
name: integration-test-container
image: integration-test-container
executionMode:
kubernetesCluster: {}
executionMode stanza 是可选的,如果您省略它,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 还可以将您设置的任何部署参数传递给自定义容器。
了解详情。