验证您的部署

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

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

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

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

  1. 配置 Skaffold 以进行验证。

    此配置标识用于运行的一个或多个容器映像 以及要在其中运行的特定命令(例如脚本) 容器映像

  2. 在广告投放中配置一个或多个目标 用于部署验证的流水线。

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

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

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

  4. Skaffold 会调用您的verify skaffold.yaml,针对已部署的应用运行。

  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

以下是作业运行的 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 以进行部署验证

为目标启用部署验证需要在以下位置包含 verify 节 用于部署的 skaffold.yaml 配置文件。此配置 如果您要为每个 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 配置中的 executionMode.kubernetesCluster 节 文件,放在特定验证容器的 verify 节中:

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 会运行 验证容器。

重新尝试验证

当验证作业失败时,您可以重新尝试验证,并运行以下命令来创建新的作业:

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 类型的目标,是指以 用户在访问您的服务时使用的凭据。您可以在 服务的 Cloud Run 服务详情(位于 Google Cloud 控制台。

  • 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

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