在部署之前和之后运行钩子

本文档介绍了如何先运行任意程序或操作, 和/或之后

您可以将 Cloud Deploy 和 Skaffold 配置为 操作来执行部署前操作 部署后操作,或同时执行这两项操作。以这种方式运行的程序称为 “hoks”。部署前钩子和部署后钩子会作为发布的部署前和部署后作业运行。

您可以将每个钩子配置为在指定 Cloud Deploy 中运行 执行环境,但如果 可以选择将其配置为在 Google Kubernetes Engine 上运行 您要在其中部署应用的 GKE 集群。

部署钩子假定是幂等的。如果某个给定操作被运行多次,则不会产生额外影响。

部署钩子是如何运作的?

以下介绍了配置部署钩子的步骤,以及运行这些钩子的 Skaffold 和 Cloud Deploy 流程:

  1. 您可以配置为给定版本使用的 skaffold.yaml,以包含用于标识用于运行钩子的容器映像或映像的 customActions,以及要在每个容器上运行的特定命令或脚本。

  2. 您可以在交付流水线进程中的一个或多个阶段配置钩子,每个钩子都引用您在 skaffold.yaml 中配置的 customActions 之一。

  3. 在发布版本的部署作业运行之前,Skaffold 会运行在 skaffold.yaml 中配置的任何命令,这些命令在流水线进度中的 predeploy 诗节中都有引用。

    predeploy 钩子始终作为相应阶段中的第一个作业运行。

  4. 在发布版本的部署作业运行后,Cloud Deploy 会运行在 skaffold.yaml 中配置的任何命令,这些命令在流水线进度中的 postdeploy 诗节中都有引用。

部署钩子在默认的 Cloud Deploy 执行中运行 环境或指定的替代执行环境中。对于部署到 GKE 和 GKE Enterprise 的情况,您可以选择在部署应用的同一集群上运行钩子

将部署钩子与 Canary 部署搭配使用

为 Canary 部署配置部署钩子时,有几个 注意事项:

  • 在交付流水线阶段,钩子的配置predeploypostdeploy)小于 strategy.canary.canaryDeploymentstrategy.canary.customCanaryDeployment.phaseConfigs,而不是低于 strategy.standard

  • 对于自动化 Canary 版,predeploy 钩子仅在第一个阶段的部署之前执行,postdeploy 钩子仅在最后一个阶段(稳定版)的部署之后执行。

在 Skaffold 中配置操作

skaffold.yaml 文件中,customActions 节接受一个或多个 customActions 个节,已配置 如下所示:

customActions
- name: ACTION_NAME
  containers:
  - name: CONTAINER_NAME
    image: IMAGE
    command: [COMMANDS_TO_RUN]
    args: [LIST_OF_ARGS]

在此 customerActions 节中:

  • ACTION_NAME

    是此操作的名称。此名称可以是任何您想要的名称,但必须在此 skaffold.yaml 中是唯一的。这是将从交付流水线阶段定义的部署前和部署后操作引用的名称。

  • CONTAINER_NAME

    是特定容器的名称。此名称可以是您想要的任何名称,但必须在此 skaffold.yaml 中是唯一的。

  • IMAGE

    是将执行命令的容器映像的名称。

  • COMMANDS_TO_RUN

    是在该容器上运行的入口点列表。"/bin/sh" 是此处用于调用 shell 的典型命令,您需要在 args 中添加要在该 shell 中运行的命令。

  • LIST_OF_ARGS

    是要提供给命令的参数列表。这是以逗号分隔的 列表,每个参数都用引号括起来。如果您的COMMAND_TO_RUN"/bin/sh",则此处的一个参数为 "-c",另一个为 参数应该是你想要在当前运行的 shell 中运行的完整命令 调用。

    示例如下:

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

如需详细了解 Skaffold 自定义操作,请参阅 Skaffold 文档

配置流水线以引用操作

如需完成配置部署钩子,您需要配置交付流水线以引用您在 skaffold.yaml 文件中定义的自定义操作。在一个文件中配置部署前和部署后操作 或销售漏斗中更具体的阶段 进度

使用 standard 部署策略时,您可以在流水线阶段配置部署前和部署后钩子,具体方法如下:

serialPipeline:
  stages:
  - targetId: hooks-staging
    profiles: []
    strategy:
      standard:
        predeploy:
          actions: ["PREDEPLOY-ACTION"]
        postdeploy:
          actions: ["POSTDEPLOY-ACTION"] 

在此 yaml 中:

  • PREDEPLOY_ACTION

    与您在 skaffold.yaml 中用于定义要在部署前运行的自定义操作的 ACTION_NAME 相同。

  • POSTDEPLOY_ACTION

    与您在 skaffold.yaml 中用于定义要在部署后运行的自定义操作的 ACTION_NAME 相同。

您可以为 predeploypostdeploy 指定多项操作,以英文逗号分隔。如果指定了多个操作,这些操作会在 它们的指定顺序作业(部署前或部署后)在第一次使用时失败 操作失败,其余操作不会运行。

默认情况下,如果您并行运行多个容器,并且运行一个作业, 两个容器都会停止。您可以使用 Skaffold 自定义操作失败策略

在应用集群上运行钩子

默认情况下,部署钩子在 Cloud Deploy 执行环境中运行。您还可以 将 Skaffold 配置为在 应用正在运行。当您 在 skaffold.yaml配置自定义操作,以及 在流水线阶段启用它们时,操作会运行 自动添加到该目标的集群中

此功能适用于部署到 GKE 仅适用于 GKE Enterprise,不适用于 Cloud Run。部署到 Cloud Run 只能在 Cloud Deploy 中运行钩子 执行环境

如需在集群上运行钩子,请在 skaffold.yaml 配置文件的特定自定义操作的 customActions 诗节中添加 executionMode.kubernetesCluster 诗节:

customActions
- name: ACTION_NAME
  containers:
  - name: CONTAINER_NAME
    image: IMAGE
    command: [COMMANDS_TO_RUN]
    args: [LIST_OF_ARGS]
  executionMode:
    kubernetesCluster: {}

以下是一个包含 executionModecustomActions 节示例 调用应用集群上的钩子容器:

customActions:
- name: predeploy-action
  containers:
  - name: predeploy-echo
    image: ubuntu
    command: ["/bin/sh"]
    args: ["-c", 'echo "this is a predeploy action"' ]
  executionMode:
    kubernetesCluster: {}

executionMode 节是可选的,如果省略,Skaffold 会运行 自定义操作容器。

可用的环境变量

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_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_RELEASE

    钩子将在其中运行的版本的 ID。

  • CLOUD_DEPLOY_ROLLOUT

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

  • CLOUD_DEPLOY_JOB_RUN

    作业运行的 ID,表示 作业。

  • CLOUD_DEPLOY_PHASE

    发布中包含钩子作业的阶段

将参数部署为环境变量

除了本部分列出的环境变量之外, Cloud Deploy 可以将任何 您设置的部署参数

了解详情

后续步骤