在部署前后运行钩子

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

您可以配置 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 的典型命令,您需要在 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: {}

以下是一个 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

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

将参数部署为环境变量

除了本部分列出的环境变量之外,Cloud Deploy 还可以将您设置的任何部署参数传递给自定义容器。

了解详情

后续步骤