在 Cloud Deploy 中自动执行版本提升和发布推进

本页介绍了如何使用 Cloud Deploy 自动将版本提升到目标平台,并将发布流程推进到下一阶段。

在本快速入门中,您将执行以下操作:

  1. 创建两个 GKE 集群或两个 Cloud Run 服务。

  2. 创建 Skaffold 配置以及 Kubernetes 清单或 Cloud Run 服务定义。

  3. 定义 Cloud Deploy 交付流水线和部署目标。

    该流水线将部署到两个目标:devstagingstaging 目标使用Canary 部署策略

  4. 定义两个自动化规则:

    • 在成功发布到 dev 后,将版本提升到 staging 目标的自动化操作。

    • canary-25` 阶段成功完成后,将发布推进到 stable 阶段的自动化操作。

  5. 通过创建一个自动部署到 dev 目标的版本来实例化交付流水线。

  6. 在 Google Cloud 控制台中查看交付流水线和版本。

    由于自动提升,此版本会自动提升到 staging

    由于 staging 目标使用的是 Canary 部署策略,并且这是首次部署到该运行时,因此系统会跳过 canary-25 阶段。如需详细了解首次跳过 Canary 阶段的原因,请参阅为何有时会跳过阶段

    由于自动推进阶段,发布会推进到 stable 阶段。

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Cloud Deploy, Cloud Build, GKE, Cloud Run, and Cloud Storage APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. 如果您已安装 CLI,请确保您运行的是最新版本:

    gcloud components update
    
  13. 确保默认 Compute Engine 服务账号具有足够的权限。

    服务账号可能已经拥有必要的权限。针对默认服务账号停用自动角色授予的项目包含这些步骤。

    1. 首先添加 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"
      
    2. 添加 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"
      
    3. 为您的特定运行时添加开发者角色。
      • 对于 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"
        
    4. 添加 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
      
    5. 为自己添加 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 的电子邮件地址。

创建运行时环境

如果您要部署到 Cloud Run,则可以跳过此命令

对于 GKE,使用默认设置创建两个集群 automation-quickstart-cluster-devautomation-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

获取您的项目编号。

您需要提供项目编号才能识别默认服务账号。这对于配置自动化资源至关重要。

  1. 运行以下命令以获取项目编号:

    gcloud projects describe PROJECT_ID
    
  2. 从命令行输出中复制项目编号,然后将其粘贴到此处。

    您无需将其作为命令运行。将其粘贴到此处可在本快速入门的后续部分中在自动化配置中填充服务账号引用。

    PROJECT_NUMBER
    

准备 Skaffold 配置和应用清单

Cloud Deploy 使用 Skaffold 提供要部署的内容的详细信息,以及如何为您的单独目标正确部署这些内容。

在本快速入门中,您将创建一个 skaffold.yaml 文件,以标识要用于部署示例应用的应用清单。

  1. 打开一个终端窗口。

  2. 创建一个新目录,并导航至该目录。

    GKE

    mkdir deploy-automation-gke-quickstart
    cd deploy-automation-gke-quickstart
    

    Cloud Run

    mkdir deploy-automation-run-quickstart
    cd deploy-automation-run-quickstart
    
  3. 创建名为 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 参考文档

  4. 为您的应用创建定义:一对 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

    1. 创建一个名为 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
      
    2. 创建一个名为 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,在您创建版本时,系统会将其替换为特定映像。

创建交付流水线、目标和自动化操作

您可以在一个文件中或在单独的文件中定义交付流水线和目标。您还可以在单独的文件中定义自动化操作。本快速入门使用一个文件来定义流水线、目标和自动化操作。

  1. 创建交付流水线、目标定义和自动化操作:

    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:
        name: "promote-release"
        wait: 1m
        toTargetId: "@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:
        name: "advance-rollout"
        sourcePhases: ["canary-25"]
        wait: 1m
    

    Cloud 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:
        name: "promote-release"
        wait: 1m
        toTargetId: "@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:
        name: "advance-rollout"
        sourcePhases: ["canary-25"]
        wait: 1m
    
  2. 在 Cloud Deploy 服务中注册流水线和目标:

    gcloud deploy apply --file=clouddeploy.yaml --region=us-central1 --project=PROJECT_ID
    

    现在,您已经有了包含一个由两个 GKE 或 Cloud Run 目标组成的多目标的流水线,可以部署应用了。

  3. 确认您的流水线和目标:

    在 Google Cloud 控制台中,前往 Cloud Deploy 交付流水线页面,查看可用交付流水线的列表。

    打开“交付流水线”页面

    此时将显示您刚刚创建的交付流水线,并且目标列会列出了两个目标。

    Google Cloud 控制台中的交付流水线直观显示

  4. 点击流水线名称,打开交付流水线可视化图表和详细信息。

  5. 提交流水线详情下,选择自动化标签页。

    系统会显示您创建的两个自动化操作。

    Google Cloud 控制台中的交付流水线直观显示

创建版本

版本是表示要部署的更改的中央 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:4a856b6f1c3ce723a456ddc2adfbb794cbfba93f727e2d96fcf6540bd0d6fff4

请注意 --images= 标志,您可以使用该标志将服务定义中的占位符 (my-app-image) 替换为经过 SHA 认证的特定映像。Google 建议您以这种方式将服务和作业定义设置为模板,并在创建版本时使用经过 SHA 限定的映像名称。

默认情况下,当您创建版本时,系统会自动为流水线中的第一个目标创建发布。

由于本快速入门包含两个自动化操作,因此系统会自动执行以下两项操作:

  • 在第一个目标中成功部署后,该版本会自动提升到第二个目标。

    自动提升功能需要等待一分钟。

  • 在第二个目标(配置了 25% 的 Canary 版)中,第二个自动化操作会将发布范围从 canary-25 推进到 stable

    对于此首次发布版本,系统会跳过 canary-25 阶段,因为没有可与 Canary 版本进行比较的现有应用版本。发布会自动推进到 stable

    提前自动化操作会延迟一分钟。

完成所有操作后,应用会成功部署到两个目标平台,而无需您执行任何其他操作。

如果您想详细了解如何运行 Canary 部署策略,可以尝试Canary 快速入门

在 Google Cloud 控制台中查看结果

您可以在 Google Cloud 控制台中查看结果,包括自动化运行作业。

  1. 前往 Cloud Deploy 交付流水线页面,查看您的交付流水线。

    打开“交付流水线”页面

  2. 点击交付流水线的名称“my-automation-demo-app-1”。

    流水线直观显示将显示应用的部署状态。如果已过足够的时间,两个目标都会显示绿色。

    Google Cloud 控制台中的交付流水线直观显示

    您的版本列在版本标签页中交付流水线详细信息下。

  3. 点击自动化操作运行情况标签页。

    其中包含两个条目,分别对应于您创建的两个自动化操作。您可以点击任一图标来查看相应自动化操作的详细信息。

    Google Cloud 控制台中显示的自动化运行详细信息

清理

为避免因本页中使用的资源导致您的 Google Cloud 账号产生费用,请按照以下步骤操作。

  1. 删除 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_ID
    

    Cloud 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
    
  2. 删除交付流水线、目标、自动化操作、版本和发布:

    gcloud deploy delete --file=clouddeploy.yaml --force --region=us-central1 --project=PROJECT_ID
    
  3. 删除 Cloud Deploy 创建的 Cloud Storage 存储分区。

    一个以 _clouddeploy 结尾,另一个是 [region].deploy-artifacts.[project].appspot.com

    打开“Cloud Storage 浏览器”页面

恭喜,您已经完成快速入门!

后续步骤