本文档介绍了如何在部署之前或之后运行任意程序或操作。
您可以配置 Cloud Deploy 以执行部署前操作、部署后操作或同时执行这两类操作。以这种方式运行的程序称为“钩子”。部署前钩子和部署后钩子在发布时作为部署前和部署后作业运行。
您可以将每个钩子配置为在指定的 Cloud Deploy 执行环境中运行,但如果您要部署到 Google Kubernetes Engine,也可以选择将其配置为在部署应用的 GKE 集群中运行。
部署钩子被认为是幂等的。如果给定的操作运行多次,则不会产生额外效果。
部署钩子的运作方式
下文介绍了部署钩子在 Cloud Deploy 中的运行方式以及如何设置部署钩子:
您可以在交付流水线进度的一个或多个阶段中配置钩子。
在部署作业运行之前,Cloud Deploy 会运行流水线进展中
predeploy定义中配置的所有任务。predeploy钩子始终作为阶段中的第一个作业运行。在发布版本的部署作业运行后,Cloud Deploy 会运行流水线进度中
postdeploy定义中配置的所有任务。
部署钩子在 Cloud Deploy 执行环境中运行。
在 Canary 部署中使用部署钩子
为 Canary 部署配置部署钩子时,需要了解以下几点:
在交付流水线阶段,钩子的配置(
predeploy和postdeploy)位于strategy.canary.canaryDeployment或strategy.canary.customCanaryDeployment.phaseConfigs下,而不是位于strategy.standard下。对于自动化 Canary 版,
predeployhook 仅在第一阶段部署之前执行,而postdeployhook 仅在最后一个阶段(稳定版)部署之后执行。
配置流水线以运行钩子
您可以在流水线进展中的一个或多个特定阶段配置部署前钩子和部署后钩子。
以下是在使用 standard 部署策略时,如何在流水线阶段中配置部署前和部署后钩子的示例:
serialPipeline:
stages:
- targetId: hooks-staging
profiles: []
strategy:
standard:
predeploy:
tasks: [TASKS]
postdeploy:
tasks: [TASKS]
在此 YAML 中:
TASKS
是一个列表,其中包含您希望作为预部署或部署后钩子的一部分运行的一个或多个任务。如果您指定了多个任务,这些任务将按指定顺序依次执行。 如果某个作业(预部署或部署后)中的第一个任务失败,则该作业也会失败,并且不会运行剩余的任务。
在应用集群上运行钩子
默认情况下,部署钩子在 Cloud Deploy 执行环境中运行。您还可以配置 Skaffold,以在应用运行的同一集群上运行部署钩子。
如需在应用集群上运行钩子,您必须在 skaffold.yaml 中将它们配置为 customActions,并在交付流水线阶段配置的 predeploy 或 postdeploy stanza 中使用 actions 引用它们:
serialPipeline:
stages:
- targetId: hooks-staging
profiles: []
strategy:
standard:
predeploy:
actions: ["my-predeploy-action"]
postdeploy:
actions: ["my-postdeploy-action"]
此功能仅适用于部署到 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的目标,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 服务成功部署后,Cloud Run 会生成这些网址。因此,此环境变量仅在 postdeploy 钩子和验证作业中可用。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_PROJECT_ID项目的 Google Cloud 项目 ID。
CLOUD_DEPLOY_RELEASE钩子将运行的版本对应的 ID。
CLOUD_DEPLOY_ROLLOUT包含钩子作业的发布版本的 ID。
CLOUD_DEPLOY_JOB_RUN表示当前作业执行的作业运行的 ID。
CLOUD_DEPLOY_PHASE发布中的阶段,包含部署钩子、验证作业或自定义渲染/部署的作业。
将参数部署为环境变量
除了本部分列出的环境变量之外,Cloud Deploy 还可以将您设置的任何部署参数传递给自定义容器。
了解详情。
后续步骤
- 详细了解任务
- 不妨试试快速入门:在部署前后运行钩子。