验证您的部署

本文档介绍了如何验证 Cloud Deploy 部署。

您可以配置 Cloud Deploy 和 Skaffold 以验证已部署到任何目标的应用是否正常运行。验证是使用您自己的测试映像完成的,并且您可以将 Cloud Deploy 和 Skaffold 配置为在部署完成后运行这些测试。

默认情况下,部署验证在 Cloud Deploy 执行环境中运行,但您也可以将其配置为在运行应用的同一集群上运行

部署验证的工作原理是什么?

  1. configure Skaffold 以进行验证。

    此配置标识用于运行测试的容器映像,以及要从该容器映像运行的特定命令(例如脚本)。

  2. 您可以在交付流水线中configure一个或多个目标以进行部署验证。

    此配置为部署到该目标的工作负载启用验证。

  3. 部署发布 (skaffold apply) 后,Cloud Deploy 会在 Cloud Deploy 执行环境中运行 skaffold verify 命令。

    要部署到 Google Kubernetes Engine 和 GKE Enterprise,您可以选择在运行应用容器的同一集群上运行验证容器。

  4. Skaffold 调用在 skaffold.yamlverify 节中指定的一个或多个测试以针对已部署的应用运行。

  5. 所执行测试成功或失败表示验证成功或失败。

    • 验证成功与否取决于所执行的容器的退出代码。

      0 表示成功。非零退出代码表示失败。如需生成所需的验证结果,请确保容器使用适当的退出代码退出。如果在验证过程中执行了多个容器,则这些容器必须全部成功才能验证成功。

    • 如果验证失败,发布也会失败。

    • 如果部署在验证期间失败,您可以通过检查发布来确认这一点:

      Google Cloud 控制台中关于发布的详细信息,包括验证状态

  6. 您可以ignore重试失败的验证。

    您还可以终止正在进行的验证作业。

用于验证的组件

rollout 资源包含以下对象,它们支持部署验证:

  • 阶段

    发布中逻辑上组合在一起的操作(作业)集合,例如部署或部署和验证。

  • 作业

    要在发布时执行的特定操作,例如部署或验证。

  • 作业运行

    作业运行是发布资源的子级,它是作业的一个实例,例如部署尝试。

如需详细了解 Cloud Deploy 资源,请参阅 Cloud Deploy 服务架构

部署验证生成的通知

Cloud Deploy 生成 Pub/Sub 消息并针对以下事件发布这些消息:

  • 创建、更新和删除作业运行

    这些通知会发布到 clouddeploy-resources 主题,并包含以下属性:

    • Resource
    • ResourceType (JobRun)
    • ActionCreateUpdateDelete
    • ProjectNumber
    • Location
    • TargetId
    • DeliveryPipelineId
    • ReleaseId
    • RolloutId
    • JobRunId

以下是用于发布到 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 主题,并包含以下属性:

    • Resource
    • ResourceType (JobRun)
    • ActionStartSucceedFailure
    • ProjectNumber
    • Location
    • TargetId
    • DeliveryPipelineId
    • ReleaseId
    • RolloutId
    • JobRunId
    • PhaseId
    • JobId
    • JobTypeDeployVerify

以下是失败的作业运行并发布到 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 配置此执行环境,配置方式与为 RENDERDEPLOY 配置执行环境相同。

配置 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 节内)中添加一个 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

    目标的特定运行时类型。可以是 GKEANTHOSRUN

  • 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

    发布中包含待验证作业的阶段