在部署前后运行钩子

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

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

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

部署钩子的行为假定遵循幂等原则。如果指定操作运行多次,不会产生额外的效果。

部署钩子的工作原理是什么?

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

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

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

  3. 在发布的部署作业运行之前,Skaffold 会运行在流水线运行过程中的 predeploy 节中引用的 skaffold.yaml 中配置的所有命令。

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

  4. 发布的部署作业运行后,Cloud Deploy 会运行在流水线运行过程中的 postdeploy 节中引用的任何在 skaffold.yaml 中配置的命令。

部署钩子在默认的 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 资源的区域。

  • 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

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

后续步骤