在部署前后运行钩子

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

您可以配置 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 会运行 skaffold.yaml 中配置的任何命令,这些命令在流水线进展中的 postdeploy stanza 中引用。

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

在 Canary 部署中使用部署钩子

为 Canary 部署配置部署钩子时,需要了解以下几点:

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

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

在 Skaffold 中配置操作

skaffold.yaml 文件中,customActions stanza 采用一个或多个 customActions stanza,配置如下:

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,不适用于 Cloud Run。部署到 Cloud Run 只能在 Cloud Deploy 执行环境中运行钩子。

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

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

以下是一个 customActions stanza 示例,其中包含 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 stanza 是可选的,如果您省略它,Skaffold 会在 Cloud Deploy 执行环境中运行自定义操作容器。

可用的环境变量

Cloud Deploy 在执行环境中提供并填充以下环境变量,您可以在钩子中使用这些变量:

  • ANTHOS_MEMBERSHIP

    对于类型为 ANTHOS 的目标,GKE 关联集群成员资格的完全指定资源名称。

  • 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_PROJECT_ID

    项目的 Google Cloud 项目 ID。

  • CLOUD_DEPLOY_RELEASE

    钩子将运行的版本 ID。

  • CLOUD_DEPLOY_ROLLOUT

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

  • CLOUD_DEPLOY_JOB_RUN

    表示当前作业执行的作业运行的 ID。

  • CLOUD_DEPLOY_PHASE

    包含钩子作业的发布阶段

将部署参数作为环境变量

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

了解详情

后续步骤