验证您的部署

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

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

部署验证的运作方式

  1. 您可以在交付流水线中配置一个或多个目标,以通过定义要运行的任务来验证部署。

  2. 应用部署完毕后,Cloud Deploy 会在 Cloud Deploy 执行环境中运行验证任务。

    所执行测试的成功或失败表示验证的成功或失败:

    • 验证是否成功取决于容器生成的退出代码。

      0 表示成功。非零退出代码表示失败。为生成预期的验证结果,请确保容器以适当的退出代码退出。如果作为验证的一部分执行了多个容器,则所有容器都必须成功执行,验证才能成功。

    • 如果验证失败,推出也会失败。

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

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

  3. 您可以忽略重试失败的验证。

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

用于验证的组件

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

  • 阶段

    发布中在逻辑上分组在一起的一系列操作(作业),例如部署或部署并验证。

  • 作业

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

  • 作业运行

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

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

配置 Cloud Deploy 以进行部署验证

为 Cloud Deploy 目标启用部署验证包括在交付流水线进度中向给定目标(或多个目标)添加 verify stanza,如以下示例所示:

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:
         tasks:
         - type: container
           image: "VERIFY_IMAGE"
           command: [COMMANDS_TO_RUN]
           args: [LIST_OF_ARGS]
           env: {VERIFY_TASK_ENV_MAP}

在此 YAML 中:

  • VERIFY_IMAGE

    是您要为验证作业运行的映像的名称。例如,us-central1-docker.pkg.dev/gcp-project-id-12345/my-repository/my-app:v1.2 表示 Artifact Registry 映像。

  • COMMANDS_TO_RUN

    是要在该容器上运行的入口点列表。"/bin/sh" 是此处要指定的典型命令,用于调用 shell。

  • LIST_OF_ARGS

    是要提供给命令的实参列表。这是一个以英文逗号分隔的列表,每个实参都用英文引号括起来。如果您的 COMMAND_TO_RUN"/bin/sh",则此处的某个实参将为 "-c",而另一个实参将为您要在调用的 shell 中运行的整个命令。

    示例如下:

    command: ["/bin/sh"]
    args: ["-c", `echo "This command ran!"`]
    
  • VERIFY_TASK_ENV_MAP

    是以 KEY:VAL 格式传递到容器中的环境变量的映射。

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

在应用集群上运行验证

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

如需在集群上运行验证容器,您必须在 skaffold.yamlverify stanza 下配置验证容器。对于定义的每个容器,您还必须设置 executionMode.kubernetesCluster

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: {}

此外,您还必须在交付流水线配置中将 verify stanza 设置为 true

以下是一个交付流水线定义示例,其中 dev 目标已启用验证。

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

此功能仅适用于部署到 GKE,不适用于 Cloud Run。部署到 Cloud Run 的作业只能在 Cloud Deploy 执行环境中运行验证。

对于并行部署,验证是在多目标上配置的,验证容器在每个子目标上运行。

您还可以在 kubernetesCluster 下添加 jobManifestPathoverrides 属性,以指向验证容器的清单以及您要替换的任何值。(overrides 接受 Kubernetes 内嵌 JSON,其中包含您要替换的值。)了解详情

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 还在执行环境中提供并填充以下环境变量。您可以在部署钩子验证作业自定义目标渲染或部署中使用这些环境变量。

  • 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 服务成功部署后,Cloud Run 会生成这些网址。因此,此环境变量仅在 postdeploy 钩子和验证作业中可用。

  • 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 资源的区域。

  • CLOUD_DEPLOY_DELIVERY_PIPELINE

    交付流水线的 ID。

  • CLOUD_DEPLOY_TARGET

    目标的 ID。

  • CLOUD_DEPLOY_PROJECT

    包含 Cloud Deploy 资源的项目的 Google Cloud 项目编号。

  • CLOUD_DEPLOY_PROJECT_ID

    项目的 Google Cloud 项目 ID。

  • CLOUD_DEPLOY_RELEASE

    钩子将运行的版本对应的 ID。

  • CLOUD_DEPLOY_ROLLOUT

    包含钩子作业的发布版本的 ID。

  • CLOUD_DEPLOY_JOB_RUN

    表示当前作业执行的作业运行的 ID。

  • CLOUD_DEPLOY_PHASE

    发布中的阶段,包含部署钩子、验证作业或自定义渲染/部署的作业。

后续步骤