验证您的部署

本文档介绍了如何验证 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
    • 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 stanza。

验证操作在其自己的执行环境中执行。可以为 VERIFY 配置此执行环境,就像可以为 RENDERDEPLOY 配置一样。

为部署验证配置 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

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

  • 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 还可以将您设置的任何部署参数传递给自定义容器。

了解详情