在 Cloud Deploy 中自動推送版本和推出進度

本頁面說明如何使用 Cloud Deploy 自動將版本推送至目標,並將推出作業推進至下一階段。

在本快速入門導覽課程中,您將執行以下操作:

  1. 建立兩個 GKE 叢集或兩個 Cloud Run 服務。

  2. 建立 Skaffold 設定,以及 Kubernetes 資訊清單或 Cloud Run 服務定義。

  3. 定義 Cloud Deploy 推送管道和部署目標。

    管道會部署至兩個目標:devstagingstaging 目標使用初期測試版部署策略

  4. 定義兩個自動化規則:

    • 在成功推出 dev 後,將自動化作業推送至 staging 目標。

    • 自動化動作,可在 canary-25` 階段順利完成後,將推出作業推進至 stable 階段。

  5. 建立版本,讓系統自動將版本部署至 dev 目標,以此將推送管道例項化。

  6. 在 Google Cloud 控制台中查看推送管道和版本。

    由於自動升級功能,這個版本會自動升級至 staging

    由於 staging 目標使用 Canary 部署策略,且這是首次在該執行階段部署,因此會略過 canary-25 階段。請參閱「為什麼有時會略過階段」,進一步瞭解為何第一次略過初期測試階段。

    由於自動推進階段,推出作業會推進至 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. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  7. To initialize the gcloud CLI, run the following command:

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

    Go to project selector

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

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

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  13. To initialize the gcloud CLI, run the following command:

    gcloud init
  14. 如果您已安裝 CLI,請確認您執行的是最新版本:

    gcloud components update
    
  15. 確認預設的 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 的「Delivery pipelines」(推送管道) 頁面,查看可用的推送管道清單。

    開啟「Delivery pipelines」頁面

    系統會顯示您剛建立的推送管道,其中「目標」欄會列出兩個目標。

     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:95ade4b17adcd07623b0a0c68359e344fe54e65d0cb01b989e24c39f2fcd296a

請注意 --images= 標記,您可以使用該標記將 服務定義中的預留位置 (my-app-image) 替換為特定 SHA 合格映像檔。Google 建議您以這種方式建立服務和工作定義範本,並在建立版本時使用 SHA 合格映像檔名稱。

根據預設,建立版本時,系統會自動為管道中的第一個目標建立推出作業。

由於這個快速入門導覽課程包含兩個自動化動作,因此會自動發生以下兩件事:

  • 在第一個目標中成功部署後,系統會自動將版本推送至第二個目標。

    自動提昇功能需要等待一分鐘。

  • 在第二個目標中,系統已設定 25% 的初期測試版本,第二個自動化動作會將推出作業從 canary-25 推進至 stable

    對於這個第一個版本,系統會略過 canary-25 階段,因為沒有可用於初期測試的先前版本應用程式。推出作業會自動推進至 stable

    提前自動化動作的延遲時間為 1 分鐘。

完成所有作業後,應用程式就會成功部署至兩個目標,您不必再採取任何行動。

如要進一步瞭解如何執行初期測試部署策略,請試試初期測試快速入門指南

在 Google Cloud 控制台中查看結果

您可以在Google Cloud 主控台中查看結果,包括自動化執行作業。

  1. 前往 Cloud Deploy 的「Delivery pipelines」(推送管道) 頁面,查看推送管道。

    開啟「Delivery pipelines」頁面

  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 瀏覽器頁面

大功告成,您已經完成本快速入門導覽課程!

後續步驟