验证您的部署

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

以下是关于作业运行创建的 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)
    • ActionStartSucceedFailure
    • ProjectNumber
    • Location
    • TargetId
    • DeliveryPipelineId
    • ReleaseId
    • RolloutId
    • JobRunId
    • PhaseId
    • JobId
    • JobTypeDeployVerify

以下是一个关于失败的作业运行情况的 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 配置此执行环境,操作方式与为 RENDERDEPLOY 配置相同。

配置 Skaffold 以进行部署验证

为目标启用部署验证时,需要在部署的 skaffold.yaml 配置文件中添加一个 verify 节。如果您要为每个目标使用单独的配置文件,则此配置可用于特定的 Skaffold 配置文件。

verify 节标识为了进行验证而要运行的容器,例如集成测试。

以下示例 skaffold.yaml 包含一个 verify 节:

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 服务的名称。

  • 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

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