验证您的部署

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

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

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

部署验证的工作原理

  1. 配置 Skaffold 以进行验证。

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

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

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

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

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

  4. Skaffold 会调用 skaffold.yamlverify 诗节中指定的测试,以便对部署的应用运行测试。

  5. 执行的测试是成功还是失败,表明验证是成功还是失败。

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

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

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

    • 如果部署在验证期间失败,您可以通过检查发布情况来了解:

      Google Cloud 控制台中的发布详情,包括验证状态

  6. 您可以忽略重试验证失败的情况。

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

用于验证的组件

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

  • 阶段

    发布中的一组操作(作业),这些操作在逻辑上会归为一组,例如部署或部署和验证。

  • 作业

    对发布版本要执行的具体操作,例如部署或验证。

  • 作业运行

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

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

部署验证生成的通知

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

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

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

    • Resource
    • ResourceTypeJobRun
    • 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
    • ResourceTypeJobRun
    • 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 配置文件,则此配置可以针对特定 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 诗节:

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

    发布中的阶段,其中包含要验证的作业。

将参数部署为环境变量

除了本部分列出的环境变量之外,Cloud Deploy 还可以将您设置的任何部署参数传递给自定义容器。

了解详情