在 Cloud Deploy 中自动执行版本提升和发布推进
本页面介绍了如何使用 Cloud Deploy 自动将版本提升到目标环境,以及将发布推进到下一阶段。
在本快速入门中,您将执行以下操作:
创建两个 GKE 集群或两个 Cloud Run 服务。
创建 Skaffold 配置以及 Kubernetes 清单或 Cloud Run 服务定义。
定义 Cloud Deploy 交付流水线和部署目标。
该流水线将部署到两个目标:
dev和staging。而staging目标使用Canary 部署策略。定义两个自动化规则:
一种自动化操作,用于在成功向
dev推出版本后,将版本提升到staging目标。一种自动化操作,可在成功完成
canary-25阶段后将发布推进到stable阶段。
通过创建一个自动部署到
dev目标的版本来实例化交付流水线。在 Google Cloud 控制台中查看交付流水线和版本。
由于启用了自动化升级,此版本会自动升级到
staging。由于
staging目标使用 Canary 部署策略,并且这是首次部署到该运行时,因此系统会跳过canary-25阶段。如需详细了解为何首次跳过 Canary 阶段,请参阅为何有时会跳过阶段。由于阶段推进是自动进行的,因此发布会推进到
stable阶段。
准备工作
- 登录您的 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" - 添加
clouddeploy.releaser角色: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.releaser" - 为您的特定运行时添加开发者角色。
- 对于 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 -
添加
iam.serviceAccountUser角色(包括actAs权限),以便您使用默认服务账号:gcloud iam service-accounts add-iam-policy-binding $(gcloud projects describe PROJECT_ID \ --format="value(projectNumber)")-compute@developer.gserviceaccount.com \ --member=user:YOUR_EMAIL_ADDRESS \ --role="roles/iam.serviceAccountUser" \ --project=PROJECT_ID在这种情况下,YOUR_EMAIL_ADDRESS 是您用于访问 Google Cloud 的电子邮件地址。
- 首先,添加
如果您已安装 CLI,请确保您运行的是最新版本:
gcloud components update
创建运行时环境
如果您要部署到 Cloud Run,可以跳过此命令。
对于 GKE,使用默认设置创建两个集群:automation-quickstart-cluster-dev 和 automation-quickstart-cluster-staging。集群的 Kubernetes API 端点必须可通过公共互联网访问。默认情况下,GKE 集群可从外部访问。
gcloud container clusters create-auto automation-quickstart-cluster-dev \
--project=PROJECT_ID \
--region=us-central1 \
&& gcloud container clusters create-auto automation-quickstart-cluster-staging \
--project=PROJECT_ID \
--region=us-central1
获取您的项目编号。
您需要项目编号来识别默认服务账号。这是配置自动化资源所必需的。
运行以下命令以获取项目编号:
gcloud projects describe PROJECT_ID --format="value(projectNumber)"从命令行输出中复制项目编号,然后将其粘贴到此处。
您无需将其作为命令运行。在此处粘贴该 JSON 文件,可在本快速入门的后续步骤中自动填充自动化配置中的服务账号引用。
PROJECT_NUMBER
准备 Skaffold 配置和应用清单
Cloud Deploy 使用 Skaffold 提供要部署的内容的详细信息,以及如何为您的单独目标正确部署这些内容。
在本快速入门中,您将创建一个 skaffold.yaml 文件,以标识要用于部署示例应用的应用程序清单。
打开一个终端窗口。
创建一个新目录,并导航至该目录。
GKE
mkdir deploy-automation-gke-quickstart cd deploy-automation-gke-quickstartCloud Run
mkdir deploy-automation-run-quickstart cd deploy-automation-run-quickstart创建名为
skaffold.yaml且包含以下内容的文件:GKE
apiVersion: skaffold/v4beta7 kind: Config metadata: name: gke-automation manifests: rawYaml: - k8s-deployment.yaml deploy: kubectl: {}Cloud Run
apiVersion: skaffold/v4beta7 kind: Config metadata: name: run-automation profiles: - name: dev manifests: rawYaml: - run-dev.yaml - name: staging manifests: rawYaml: - run-staging.yaml deploy: cloudrun: {}此文件是最小的 Skaffold 配置。在本快速入门中,您将创建该文件。不过,您也可以让 Cloud Deploy 为您创建一个,以用于简单的非生产应用。
如需详细了解此文件,请参阅
skaffold.yaml参考文档。创建应用定义 - 一对 Cloud Run 服务定义或一个 GKE Kubernetes 清单。
GKE
创建一个名为
k8s-deployment.yaml的文件,其中包含以下内容:apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment labels: app: my-app namespace: default spec: replicas: 1 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: nginx image: my-app-image --- apiVersion: v1 kind: Service metadata: name: my-service namespace: default spec: selector: app: my-app ports: - protocol: TCP port: 80此文件是一个简单的 Kubernetes 清单,用于部署应用。要部署的容器映像在此处设置为占位符
my-app-image,当您创建发布版本时,该占位符会被替换为具体映像。Cloud Run
创建一个名为
run-dev.yaml的文件,其中包含以下内容:apiVersion: serving.knative.dev/v1 kind: Service metadata: name: my-automation-run-service-dev spec: template: spec: containers: - image: my-app-image创建一个名为
run-staging.yaml的文件,其中包含以下内容:apiVersion: serving.knative.dev/v1 kind: Service metadata: name: my-automation-run-service-staging spec: template: spec: containers: - image: my-app-image
这些文件是简单的 Cloud Run 服务定义,用于部署应用。要部署的容器映像在此处设置为占位符
my-app-image,当您创建发布版本时,该占位符会被替换为具体映像。
创建交付流水线、目标和自动化操作
您可以在一个文件中或在单独的文件中定义交付流水线和目标。您还可以在单独的文件中定义自动化操作。此快速入门使用一个文件来定义流水线、目标和自动化。
创建交付流水线、目标定义和自动化操作:
GKE
在
deploy-automation-gke-quickstart目录中,创建包含以下内容的新文件clouddeploy.yaml:apiVersion: deploy.cloud.google.com/v1 kind: DeliveryPipeline metadata: name: my-automation-demo-app-1 description: Automation demonstration pipeline serialPipeline: stages: - targetId: automation-quickstart-dev - targetId: automation-quickstart-staging profiles: [] strategy: canary: runtimeConfig: kubernetes: serviceNetworking: service: "my-service" deployment: "my-deployment" canaryDeployment: percentages: [25] verify: false --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: automation-quickstart-dev description: Dev cluster to demonstrate deploy automation gke: cluster: projects/PROJECT_ID/locations/us-central1/clusters/automation-quickstart-cluster-dev --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: automation-quickstart-staging description: Staging cluster to demonstrate deploy automation gke: cluster: projects/PROJECT_ID/locations/us-central1/clusters/automation-quickstart-cluster-staging --- apiVersion: deploy.cloud.google.com/v1 kind: Automation metadata: name: my-automation-demo-app-1/promote description: promotes a release suspended: false serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com selector: targets: - id: automation-quickstart-dev rules: - promoteReleaseRule: id: "promote-release" wait: 1m destinationTargetId: "@next" --- apiVersion: deploy.cloud.google.com/v1 kind: Automation metadata: name: my-automation-demo-app-1/advance description: advances a rollout suspended: false serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com selector: targets: - id: automation-quickstart-staging rules: - advanceRolloutRule: id: "advance-rollout" sourcePhases: ["canary-25"] wait: 1mCloud Run
在
deploy-automation-run-quickstart目录中,创建包含以下内容的新文件clouddeploy.yaml:apiVersion: deploy.cloud.google.com/v1 kind: DeliveryPipeline metadata: name: my-automation-demo-app-1 description: Automation demonstration pipeline serialPipeline: stages: - targetId: automation-quickstart-dev profiles: [dev] - targetId: automation-quickstart-staging profiles: [staging] strategy: canary: runtimeConfig: cloudRun: automaticTrafficControl: true canaryDeployment: percentages: [25] verify: false --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: automation-quickstart-dev description: Dev cluster to demonstrate deploy automation run: location: projects/PROJECT_ID/locations/us-central1 --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: automation-quickstart-staging description: Staging cluster to demonstrate deploy automation run: location: projects/PROJECT_ID/locations/us-central1 --- apiVersion: deploy.cloud.google.com/v1 kind: Automation metadata: name: my-automation-demo-app-1/promote description: Promotes a release to the next target suspended: false serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com selector: targets: - id: automation-quickstart-dev rules: - promoteReleaseRule: id: "promote-release" wait: 1m destinationTargetId: "@next" --- apiVersion: deploy.cloud.google.com/v1 kind: Automation metadata: name: my-automation-demo-app-1/advance description: advances a rollout suspended: false serviceAccount: PROJECT_NUMBER-compute@developer.gserviceaccount.com selector: targets: - id: automation-quickstart-staging rules: - advanceRolloutRule: id: "advance-rollout" sourcePhases: ["canary-25"] wait: 1m在 Cloud Deploy 服务中注册流水线和目标:
gcloud deploy apply --file=clouddeploy.yaml --region=us-central1 --project=PROJECT_ID现在,您已拥有一个流水线,其中包含一个由两个 GKE 或 Cloud Run 目标组成的多目标,可以随时部署应用。
确认您的流水线和目标:
在 Google Cloud 控制台中,导航到 Cloud Deploy 交付流水线页面,以查看可用交付流水线的列表。
此时将显示您刚刚创建的交付流水线,并且目标列会列出了两个目标。

点击流水线名称,打开交付流水线可视化图表和详情。
在交付流水线详情下,选择自动化标签页。
系统会显示您创建的两个自动化操作。

创建版本
版本是表示要部署的更改的中央 Cloud Deploy 资源。交付流水线定义该版本的生命周期。请参阅 Cloud Deploy 服务架构,详细了解该生命周期。
GKE
从 deploy-automation-gke-quickstart 目录运行以下命令,以创建表示要部署的容器映像的 release 资源:
gcloud deploy releases create test-release-001 \
--project=PROJECT_ID \
--region=us-central1 \
--delivery-pipeline=my-automation-demo-app-1 \
--images=my-app-image=gcr.io/google-containers/nginx@sha256:f49a843c290594dcf4d193535d1f4ba8af7d56cea2cf79d1e9554f077f1e7aaa
请注意 --images= 标志,您可以使用该标志将清单中的占位符 (my-app-image) 替换为特定的、经过 SHA 验证的映像。Google 建议您以这种方式将清单模板化,并在创建发布版本时使用 SHA 限定的映像名称。
Cloud Run
从 deploy-automation-run-quickstart 目录运行以下命令,以创建表示要部署的容器映像的 release 资源:
gcloud deploy releases create test-release-001 \
--project=PROJECT_ID \
--region=us-central1 \
--delivery-pipeline=my-automation-demo-app-1 \
--images=my-app-image=us-docker.pkg.dev/cloudrun/container/hello@sha256:95ade4b17adcd07623b0a0c68359e344fe54e65d0cb01b989e24c39f2fcd296a
请注意 --images= 标志,您可以使用该标志将服务定义中的占位符 (my-app-image) 替换为特定的、经过 SHA 限定的映像。Google 建议您以这种方式将服务和作业定义模板化,并在创建发布版本时使用 SHA 限定的映像名称。
默认情况下,当您创建版本时,系统会自动为流水线中的第一个目标创建发布。
由于本快速入门包含两项自动化操作,因此会自动执行以下两项操作:
在第一个目标中成功部署后,系统会自动将相应版本提升到第二个目标。
升级自动化功能有 1 分钟的等待时间。
在配置了 25% Canary 版的第二个目标中,第二次自动化将发布从
canary-25推进到stable。对于此首个版本,系统会跳过
canary-25阶段,因为没有可进行 Canary 测试的预先存在的应用版本。发布会自动推进到stable。高级自动化操作存在 1 分钟的延迟。
一切完成后,应用会成功部署到这两个目标平台,而您无需执行任何进一步的操作。
如果您想详细了解如何运行 Canary 部署策略,可以尝试Canary 快速入门。
在 Google Cloud 控制台中查看结果
您可以在Google Cloud 控制台中查看结果,包括自动化运行。
前往 Cloud Deploy 交付流水线页面,查看您的交付流水线。
点击交付流水线的名称“my-automation-demo-app-1”。
流水线可视化显示应用的部署状态。如果经过了足够的时间,这两个目标都会显示为绿色。

您的版本列在版本标签页中交付流水线详细信息下。
点击自动化运行标签页。
其中有两项,分别对应于您创建的两个自动化操作。您可以点击任一运行来查看相应自动化运行的详细信息。

清理
为避免因本页中使用的资源导致您的 Google Cloud 账号产生费用,请按照以下步骤操作。
删除 GKE 集群或 Cloud Run 服务:
GKE
gcloud container clusters delete automation-quickstart-cluster-dev --region=us-central1 --project=PROJECT_ID \ && gcloud container clusters delete automation-quickstart-cluster-staging --region=us-west1 --project=PROJECT_IDCloud Run
gcloud run services delete my-automation-run-service-dev --region=us-central1 --project=PROJECT_ID \ && gcloud run services delete my-automation-run-service-staging --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。
恭喜,您已经完成快速入门!