本文档介绍了如何在部署之前和/或之后运行任意程序或操作。
您可以将 Cloud Deploy 和 Skaffold 配置为运行操作,以执行部署前操作和/或部署后操作。以这种方式运行的程序称为“钩子”。部署前钩子和部署后钩子在发布上作为部署前作业运行。
您可以将每个钩子配置为在指定的 Cloud Deploy 执行环境中运行,但如果要部署到 Google Kubernetes Engine,则可以选择将其配置为在要部署应用的 GKE 集群上运行。
部署钩子的行为假定遵循幂等原则。如果指定操作运行多次,不会产生额外的效果。
部署钩子的工作原理是什么?
下面介绍了配置部署钩子的步骤,以及运行这些钩子的 Skaffold 和 Cloud Deploy 流程:
您可以将用于给定版本的
skaffold.yaml
配置为包含customActions
(用于标识用于运行钩子的容器映像)以及要在每个容器上运行的特定命令或脚本。您可以在交付流水线运行过程中的一个或多个阶段配置钩子,每个阶段都会引用您在
skaffold.yaml
中配置的某个customActions
。在发布的部署作业运行之前,Skaffold 会运行在流水线运行过程中的
predeploy
节中引用的skaffold.yaml
中配置的所有命令。predeploy
钩子始终作为该阶段中的第一个作业运行。发布的部署作业运行后,Cloud Deploy 会运行在流水线运行过程中的
postdeploy
节中引用的任何在skaffold.yaml
中配置的命令。
部署钩子在默认的 Cloud Deploy 执行环境或指定的替代执行环境中运行。对于 GKE 和 GKE Enterprise 的部署,您可以选择在部署应用的同一集群上运行钩子。
将部署钩子与 Canary 部署搭配使用
为 Canary 部署配置部署钩子时,需要了解以下几点:
在交付流水线阶段,钩子的配置(
predeploy
和postdeploy
)位于strategy.canary.canaryDeployment
或strategy.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 相同。
您可以为 predeploy
和 postdeploy
指定多项操作(以英文逗号分隔)。如果指定了多项操作,这些操作会按指定顺序依次执行。如果第一个操作失败,则作业(部署前或部署后)将会失败,并且其余操作不会运行。
默认情况下,如果您在并行运行多个容器时作业失败,则两个容器都会停止。您可以使用 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
目标的具体运行时类型。可以选择
GKE
、ANTHOS
或RUN
。 对于自定义目标,则不应设置该值。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
包含钩子作业的发布中的阶段。
后续步骤
详细了解 Skaffold。