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

本文档介绍如何在部署之前和/或之后运行任意程序或操作。

您可以将 Cloud Deploy 和 Skaffold 配置为运行操作,从而执行部署前操作和/或部署后操作。这些以这种方式运行的程序称为“钩子”。部署前钩子和部署后钩子作为发布作业的部署前作业运行。

您可以将每个钩子配置为在指定的 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 的典型命令,您可以在参数中包含要在该 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: {}

以下是一个示例 customActions 节,其中包含用于调用应用集群上的钩子容器的 executionMode

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 执行环境中运行自定义操作容器。

可用的环境变量

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

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

后续步骤