使用 Cloud Deploy 發布

1. 目標

在本教學課程中,您將建立三個名為 preview、canary 和 prod 的 GKE 叢集。接著,為每個叢集建立對應的 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 未使用的字元字串,您隨時可以更新。
  • 專案 ID 在所有 Google Cloud 專案中不得重複,且設定後即無法變更。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. 在 Cloud Shell 中執行下列指令,在 deploy 目錄中建立名為 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. 在部署目錄中建立名為 canary.yaml 的檔案,並在 Cloud Shell 中執行下列指令:

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. 在部署目錄中建立名為 prod.yaml 的檔案,並在 Cloud Shell 中執行下列指令:

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

請注意,標記 requireApproval 設為 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. 在 Cloud Shell 中執行下列指令,在 deploy 目錄中建立名為 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 標記包含名為 stages 的標記,這是此發布管道設定部署的所有目標清單。

targetId 會識別要用於這個交付管道階段的特定目標。這個值是目標定義中的 metadata.name 屬性。

profiles 是零個或多個 Skaffold 設定檔名稱的清單,來自 skaffold.yaml。建立版本時,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. 前往 Google Cloud 控制台中的 <Cloud Deploy>
  2. 按一下「sample-app」

這個畫面會以圖形呈現管道。

  1. 確認預覽方塊左側有綠色外框,表示版本已部署至該環境。
  2. 如要查看發布內容的其他詳細資料,請按一下畫面下方「發布內容詳細資料」下方的發布內容名稱
  3. 確認版本已順利部署應用程式,請在 Cloud Shell 中執行下列指令:

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 控制台中的 sample-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 控制台中的 sample-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 結束通訊埠轉送。