透過 Cloud Deploy 進行發布

1. 目標

在這個教學課程中,您會建立三個 GKE 叢集,名稱為「Preview」、「Canary」和「prod」。接著,請建立每個叢集對應的 Cloud Deploy 目標,並建立 Cloud Deploy 管道,定義要在這些目標中執行部署作業的步驟順序。

cloudbuild 管道會觸發部署流程,這些管道會建立 Cloud Deploy 版本,並在預覽叢集中執行部署作業。確認預先發布版部署成功且如預期運作後,就會在初期測試叢集中手動升級版本。如要在實際工作環境叢集中推送版本,您必須獲得核准,才能在 Cloud Deploy UI 中核准實際工作環境管道,最後升級。

本教學課程的目標可分為以下幾個步驟:

  • 準備工作區
  • 定義 Cloud Deploy 目標
  • 定義 Cloud Deploy 管道
  • 建立發布版本
  • 升級部署作業
  • 核准正式版

自修環境設定

  1. 登入 Google Cloud 控制台,建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 「專案名稱」是這項專案參與者的顯示名稱。這是 Google API 不使用的字元字串,您可以隨時更新。
  • 所有 Google Cloud 專案的專案 ID 均不得重複,且設定後即無法變更。Cloud 控制台會自動產生一個不重複的字串。但通常是在乎它何在在大部分的程式碼研究室中,您必須參照專案 ID (通常稱為 PROJECT_ID),因此如果您不喜歡的話,請隨機產生一個,或者,您也可以自行嘗試看看是否可用。是「凍結」建立專案後
  • 還有第三個值,也就是部分 API 使用的專案編號。如要進一步瞭解這三個值,請參閱說明文件
  1. 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Cloud 資源/API。執行這個程式碼研究室並不會產生任何費用,如果有的話。如要關閉資源,以免產生本教學課程結束後產生的費用,請按照任「清除所用資源」操作請參閱本程式碼研究室結尾處的操作說明。Google Cloud 的新使用者符合 $300 美元免費試用計畫的資格。

2. 平台設定

正在準備工作區

我們會在這裡設定執行本教學課程所需的環境。完成這個步驟後,我們會建立 GKE 叢集來執行部署作業。

  1. 設定 gcloud config 預設值

gcloud config set project <your project>

gcloud config set deploy/region us-central1

  1. 複製存放區

git clone https://github.com/gushob21/software-delivery-workshop

cd software-delivery-workshop/labs/cloud-deploy/

cloudshell workspace .

rm -rf deploy && mkdir deploy

  1. 設定環境變數

export PROJECT_ID=$(gcloud config get-value project)

export PROJECT_NUMBER=$(gcloud projects list --filter="$PROJECT_ID" --format="value(PROJECT_NUMBER)")

  1. 啟用 API

gcloud services enable \

cloudresourcemanager.googleapis.com \

    `container.googleapis.com \`

    `cloudbuild.googleapis.com \`

    `containerregistry.googleapis.com \`

    `secretmanager.googleapis.com \`

    `clouddeploy.googleapis.com` 
  1. 建立 GKE 叢集
     `gcloud container clusters create preview \`
    

--zone=us-central1-a --async

    `gcloud container clusters create canary \`

--zone=us-central1-b --async

    `gcloud container clusters create prod \`

--zone=us-central1-c

定義 Cloud Deploy 目標

  1. 在 cloudshell 中使用下列指令,在名為 preview.yaml 的部署目錄中建立檔案:

cat <<EOF >deploy/preview.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: Target

metadata:

name: preview

annotations: {}

labels: {}

description: Target for preview environment

gke:

cluster: projects/$PROJECT_ID/locations/us-central1-a/clusters/preview

EOF

    As you noticed, the "kind" tag is "Target". It allows us to add some metadata to the target, a description and finally the GKE cluster where the deployment is supposed to happen for this target.
  1. 在 cloudshell 中使用下列指令,在名為 canary.yaml 的部署目錄中建立檔案:

cat <<EOF >deploy/canary.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: Target

metadata:

name: canary

annotations: {}

labels: {}

description: Target for canary environment

gke:

cluster: projects/$PROJECT_ID/locations/us-central1-b/clusters/canary

EOF

  1. 在 cloudshell 中使用下列指令,在名為 prod.yaml 的部署目錄中建立檔案:

cat <<EOF >deploy/prod.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: Target

metadata:

name: prod

annotations: {}

labels: {}

description: Target for prod environment

requireApproval: true

gke:

cluster: projects/$PROJECT_ID/locations/us-central1-c/clusters/prod

EOF

請注意,代碼「需要核准」已設為 true。如未取得核准,就無法發布至實際工作環境目標。您必須具備「roles/clouddeploy.approver」角色才能核准版本。

  1. 建立部署目標
         `gcloud config set deploy/region us-central1` 
    

gcloud beta deploy apply --file deploy/preview.yaml

gcloud beta deploy apply --file deploy/canary.yaml

gcloud beta deploy apply --file deploy/prod.yaml

3. 應用程式建立

建立新的應用程式時,CICD 管道通常會執行自動建構、整合測試和部署作業。以下步驟屬於新應用程式設定程序的一環。每個新的應用程式都會設定部署管道。

定義 Cloud Deploy 管道

  1. 在 cloudshell 中使用下列指令,在 Deployment 目錄中建立名為 pipeline.yaml 的檔案:

cat <<EOF >>deploy/pipeline.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: DeliveryPipeline

metadata:

name: sample-app

labels:

`app: sample-app`

description: delivery pipeline

serialPipeline:

stages:

- targetId: preview

`profiles:`

`- preview`

- targetId: canary

`profiles:`

`- canary`

- targetId: prod

`profiles:`

`- prod`

EOF

    As you noticed, the "kind" tag is "DeliveryPipeline". It lets you define the metadata for the pipeline, a description and an order of deployment into various targets via serialPipeline tag.

serialPipeline 標記包含一個已命名的階段標籤,該階段列出了設定此推送管道要部署的所有目標。

targetId 會識別此推送管道階段要使用的特定目標。值為目標定義中的 metadata.name 屬性。

profiles 是來自 skaffold.yaml 的零個或多個 Skaffold 設定檔名稱清單。Cloud Deploy 會在建立版本時使用採用 Skaffold 算繪的設定檔。

  1. 套用管道

gcloud beta deploy apply --file deploy/pipeline.yaml

4. 開發階段

隨著應用程式開發自動化 CICD 工具鍊,系統會建構及儲存資產。系統會執行下列指令,使用 skaffold 建構應用程式,並儲存資產以透過 Cloud Deploy 進行部署。這個步驟會在每個應用程式建構作業的 CICD 程序中執行。

  1. 使用 Skaffold 建構及儲存應用程式

skaffold build \

--file-output=artifacts.json \

--default-repo gcr.io/$PROJECT_ID \

--push=true

5. 發布階段

CICD 程序結束時,通常在程式碼已標記為實際工作環境中,您會呼叫 cloud deploy release 指令來啟動發布程序。部署作業經過驗證並獲得核准後,您就能透過自動程序或手動核准程序,升級及核准版本,在各種目標環境中遷移版本。

建立發布版本

我們稍早在這個教學課程中建立 Cloud Deploy 檔案,以瞭解 Cloud Deploy 的運作方式。為了示範,我們建立了相同的 Cloud Deploy 檔案,並使用範例 Go 應用程式將這些檔案推送至 GitHub 存放區,並使用 Cloud Deploy 完成應用程式的發布作業。

export REL_TIMESTAMP=$(date '+%Y%m%d-%H%M%S')

gcloud beta deploy releases create \

sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--description="Release demo" \

--build-artifacts=artifacts.json \

--annotations="release-id=rel-${REL_TIMESTAMP}"

查看版本

Cloud Deploy 版本建立後,會自動在第一個預先發布版目標中推出。

  1. 前往 <Cloud Deploy>位於 Google Cloud 控制台
  2. 按一下「sample-app」

此畫面會以圖表呈現您的管道。

  1. 確認預覽方塊左側顯示綠色外框,表示版本已部署至該環境。
  2. 您可以選擇在畫面下半部的「版本詳細資料」底下點選版本名稱,查看版本的其他詳細資料
  3. 確認版本已成功部署應用程式,執行下列指令

gcloud container clusters get-credentials preview --zone us-central1-a && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080

  1. 按一下畫面右上角的網頁預覽圖示。
  2. 選取「透過以下通訊埠預覽:8080」

系統會將您帶往新頁面,並顯示「Hello World!」訊息。

  1. 在終端機中使用 ctrl+c 以結束通訊埠轉送。

推送版本

現在,版本已部署至管道中的第一個目標 (預覽),就可以將其推送至下一個目標 (初期測試版本)。執行下列指令以開始處理程序。

gcloud beta deploy releases promote \

--release=sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--quiet

查看發布促銷活動

  1. 前往 Google Cloud 控制台中的 example-app 管道
  2. 確認 Canary 方塊左側顯示綠色外框,表示版本已部署至該環境。
  3. 建立通道,確認應用程式已正確部署

gcloud container clusters get-credentials canary --zone us-central1-b && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080

  1. 按一下畫面右上角的網頁預覽圖示。
  2. 選取「透過以下通訊埠預覽:8080」

系統會將您帶往新頁面,並顯示「Hello World!」訊息。

  1. 在終端機中使用 ctrl+c 以結束通訊埠轉送。

核准正式版

請記住,我們透過 prod.yaml 建立實際工作環境目標時,將標記「RequireApproval」指定為 true。這麼做會強制要求獲得核准,才能宣傳正式版產品。

  1. 使用下列指令將初期測試版本升級為正式版

gcloud beta deploy releases promote \

--release=sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--quiet

  1. 前往 Google Cloud 控制台中的 example-app 管道
  2. 請注意,黃色指示燈會顯示「1 個待處理」。

這則訊息表示有待部署項目排入正式環境,但需要經過審查和核准。

  1. 按一下「查看」按鈕。
  2. 在下一個畫面中點選「查看」再次開啟正式版的核准畫面
  3. 視需要查看「資訊清單差異」以查看變更。在本例中,這是全新的檔案。
  4. 按一下「核准」按鈕
  5. 返回範例應用程式管道頁面,即可查看處理中的正式版版本。

檢查正式版

與其他環境相同,您可以在完成部署作業後按照下列步驟審查部署作業。

  1. 執行下列指令,Cloud Shell 以建立通訊埠轉送

gcloud container clusters get-credentials prod --zone us-central1-c && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080

  1. 按一下畫面右上角的網頁預覽圖示。
  2. 選取「透過以下通訊埠預覽:8080」

系統會將您帶往新頁面,並顯示「Hello World!」訊息。

  1. 在終端機中使用 ctrl+c 以結束通訊埠轉送。