在部署之前和之后运行钩子
本快速入门介绍如何运行部署钩子,即在您使用 Cloud Deploy 进行部署之前或之后运行的任意程序。
在本快速入门中,您将执行以下操作:
创建一个 GKE 集群或一个 Cloud Run 服务。
您也可以使用 GKE 附加集群,但本快速入门仅使用 GKE 和 Cloud Run。
定义 Cloud Deploy 交付流水线和部署目标。
交付流水线配置包含部署钩子定义,如
tasks所示。此流水线仅包含一个阶段,并且仅使用一个目标。
创建 Skaffold 配置以及 Kubernetes 清单或 Cloud Run 服务定义。
您可以在 Skaffold 配置文件中标识要使用 Cloud Deploy 部署的清单。
创建会自动部署到目标的版本。
其中一个钩子在部署应用之前运行,另一个钩子在部署应用之后运行。
在Google Cloud 控制台中,使用 Cloud Deploy 的发布详情页面查看部署前和部署后钩子的结果(位于 Cloud Build 日志中)。
准备工作
- 登录您的 Google Cloud 账号。如果您是 Google Cloud新手,请 创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
安装 Google Cloud CLI。
-
如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI。
-
如需初始化 gcloud CLI,请运行以下命令:
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
安装 Google Cloud CLI。
-
如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI。
-
如需初始化 gcloud CLI,请运行以下命令:
gcloud init - 确保默认 Compute Engine 服务账号具有足够的权限。
服务账号可能已经拥有必要的权限。针对默认服务账号停用自动角色授予的项目包含这些步骤。
- 首先,添加
clouddeploy.jobRunner角色:gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/clouddeploy.jobRunner" - 为您的特定运行时添加开发者角色。
- 对于 GKE:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/container.developer" - 对于 Cloud Run:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/run.developer" -
添加
iam.serviceAccountUser角色,该角色可提供用于部署到运行时的actAs权限:gcloud iam service-accounts add-iam-policy-binding $(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --member=serviceAccount:$(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --role="roles/iam.serviceAccountUser" \ --project=PROJECT_ID
如果您已安装 CLI,请确保您运行的是最新版本:
gcloud components update
创建运行时环境
如果您要部署到 Cloud Run,可以跳过此命令。
对于 GKE,创建一个集群:deploy-hooks-cluster,使用默认设置。集群的 Kubernetes API 端点必须可通过公共互联网访问。默认情况下,GKE 集群可从外部访问。
gcloud container clusters create-auto deploy-hooks-cluster \
--project=PROJECT_ID \
--region=us-central1
创建交付流水线和目标
您可以在一个文件中或在单独的文件中定义流水线和目标。在本快速入门中,您将创建一个文件。
打开一个终端窗口。
创建一个新目录,并导航至该目录。
GKE
mkdir deploy-hooks-gke-quickstart cd deploy-hooks-gke-quickstartCloud Run
mkdir deploy-hooks-run-quickstart cd deploy-hooks-run-quickstart创建交付流水线和目标定义:
GKE
在
deploy-hooks-gke-quickstart目录中,创建包含以下内容的新文件clouddeploy.yaml:apiVersion: deploy.cloud.google.com/v1 kind: DeliveryPipeline metadata: name: deploy-hooks-demo-app-gke-1 description: main application pipeline serialPipeline: stages: - targetId: hooks-staging profiles: [] strategy: standard: predeploy: tasks: - type: container image: ubuntu command: ["/bin/sh"] args: ["-c", 'echo "this is a predeploy action"' ] postdeploy: tasks: - type: container image: ubuntu command: ["/bin/sh"] args: ["-c", 'echo "this is a postdeploy action"' ] --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: hooks-staging description: hooks staging cluster gke: cluster: projects/PROJECT_ID/locations/us-central1/clusters/deploy-hooks-clusterCloud Run
在
deploy-hooks-run-quickstart目录中,创建包含以下内容的新文件clouddeploy.yaml:apiVersion: deploy.cloud.google.com/v1 kind: DeliveryPipeline metadata: name: deploy-hooks-demo-app-run-1 description: main application pipeline serialPipeline: stages: - targetId: hooks-staging profiles: [] strategy: standard: predeploy: tasks: - type: container image: ubuntu command: ["/bin/sh"] args: ["-c", 'echo "this is a predeploy action"' ] postdeploy: tasks: - type: container image: ubuntu command: ["/bin/sh"] args: ["-c", 'echo "this is a postdeploy action"' ] --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: hooks-staging description: staging Run service run: location: projects/PROJECT_ID/locations/us-central1在 Cloud Deploy 服务中注册流水线和目标:
gcloud deploy apply --file=clouddeploy.yaml --region=us-central1 --project=PROJECT_ID
现在,您已经有了包含一个目标的交付流水线,可以部署应用并运行部署前和部署后作业了。
确认您的流水线和目标:
在 Google Cloud 控制台中,导航到 Cloud Deploy 交付流水线页面,以查看可用交付流水线的列表。
此时将显示您刚刚创建的交付流水线,并且目标列会列出了一个目标。

创建 Skaffold 配置文件和应用清单
Cloud Deploy 使用 Skaffold 来识别用于将示例应用部署到目标的清单。
创建名为
skaffold.yaml且包含以下内容的文件:GKE
apiVersion: skaffold/v4beta7 kind: Config manifests: rawYaml: - k8s-pod.yaml deploy: kubectl: {}Cloud Run
apiVersion: skaffold/v4beta7 kind: Config manifests: rawYaml: - service.yaml deploy: cloudrun: {}如需详细了解此配置文件,请参阅
skaffold.yaml参考文档。为您的应用创建定义 - Cloud Run 的服务定义或 GKE 的 Kubernetes 清单。
GKE
创建一个名为
k8s-pod.yaml的文件,其中包含以下内容:apiVersion: v1 kind: Pod metadata: name: my-hooks-pod spec: containers: - name: nginx image: my-app-image此文件是一个基本的 Kubernetes 清单,它会应用于集群以部署应用。要部署的容器映像在此处设置为占位符
my-app-image,当您创建发布版本时,该占位符会被替换为具体映像。Cloud Run
创建一个名为
service.yaml的文件,其中包含以下内容:apiVersion: serving.knative.dev/v1 kind: Service metadata: name: my-hooks-run-service spec: template: spec: containers: - image: my-app-image此文件是一个简单的 Cloud Run 服务定义,用于部署应用。要部署的容器映像在此处设置为占位符
my-app-image,当您创建发布版本时,该占位符会被替换为具体映像。
创建版本
版本是表示要部署的更改的中央 Cloud Deploy 资源。交付流水线定义该版本的生命周期。请参阅 Cloud Deploy 服务架构,详细了解该生命周期。
GKE
从 deploy-hooks-gke-quickstart 目录运行以下命令,以创建表示要部署的容器映像的 release 资源:
gcloud deploy releases create test-release-001 \
--project=PROJECT_ID \
--region=us-central1 \
--delivery-pipeline=deploy-hooks-demo-app-gke-1 \
--images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
请注意 --images= 标志,您可以使用该标志将清单中的占位符 (my-app-image) 替换为特定的、经过 SHA 限定的映像。Google 建议您以这种方式将清单模板化,并在创建发布版本时使用 SHA 限定的映像名称。
Cloud Run
从 deploy-hooks-run-quickstart 目录运行以下命令,以创建表示要部署的容器映像的 release 资源:
gcloud deploy releases create test-release-001 \
--project=PROJECT_ID \
--region=us-central1 \
--delivery-pipeline=deploy-hooks-demo-app-run-1 \
--images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:95ade4b17adcd07623b0a0c68359e344fe54e65d0cb01b989e24c39f2fcd296a
请注意 --images= 标志,您可以使用该标志将服务定义中的占位符 (my-app-image) 替换为特定的、经过 SHA 限定的映像。Google 建议您以这种方式将服务和作业定义模板化,并在创建发布版本时使用 SHA 限定的映像名称。
与所有版本一样(除非它们包含 --disable-initial-rollout),Cloud Deploy 还会自动创建部署资源。应用会自动部署到为此交付流水线配置的唯一目标。
此外,预部署作业会在应用部署之前运行,而部署后作业会在应用部署之后运行。
在 Google Cloud 控制台中查看结果
几分钟后,您的发布版本会部署到目标运行时。
我们配置的部署前钩子和部署后钩子(仅用于演示)会将字符串输出到 Cloud Build 日志。我们可以查看这些日志,以确认钩子是否按预期工作。
在 Google Cloud 控制台中,导航到 Cloud Deploy 交付流水线页面,以查看您的交付流水线(“deploy-hooks-demo-app-gke-1”或“deploy-hooks-demo-app-run-1”)。
点击交付流水线的名称(“deploy-hooks-demo-app-gke-1”或“deploy-hooks-demo-app-run-1”)。
流水线可视化显示应用的部署状态。由于流水线中只有一个阶段,因此可视化图表仅显示一个节点。

您的版本列在版本标签页中交付流水线详细信息下。
在交付流水线详情下,点击发布标签页。
点击发布名称即可查看发布详情。

部署前和部署后列为作业。
点击部署前
系统会显示作业运行日志。
在日志条目列表中向下滚动,找到
predeploy-echo,然后点击它。
请注意
textPayload。该字符串是在交付流水线的predeploy-action中配置的。点击 Postdeploy 作业,然后找到
postdeploy-echo日志条目。
清理
为避免因本页中使用的资源导致您的 Google Cloud 账号产生费用,请按照以下步骤操作。
删除 GKE 集群或 Cloud Run 服务:
GKE
gcloud container clusters delete deploy-hooks-cluster --region=us-central1 --project=PROJECT_IDCloud Run
gcloud run services delete my-hooks-run-service --region=us-central1 --project=PROJECT_ID删除交付流水线、目标、发布和发布:
gcloud deploy delete --file=clouddeploy.yaml --force --region=us-central1 --project=PROJECT_ID删除 Cloud Deploy 创建的 Cloud Storage 存储分区。
一个以
_clouddeploy结尾,另一个是[region].deploy-artifacts.[project].appspot.com。
恭喜,您已经完成快速入门!