1. 目標
在本教學課程中,您將建立三個名為 preview、canary 和 prod 的 GKE 叢集。接著,為每個叢集建立對應的 Cloud Deploy 目標,以及定義在這些目標中執行部署作業步驟順序的 Cloud Deploy 管道。
部署流程會由 cloudbuild 管道觸發,該管道會建立 Cloud Deploy 版本,並在預先發布叢集中執行部署作業。確認預覽版部署作業成功,且運作正常後,您將手動在初期測試版本叢集中升級版本。如要在實際工作環境叢集中升級版本,必須先獲得核准。您可以在 Cloud Deploy UI 中核准實際工作環境管道,然後升級版本。
本教學課程的目標可細分為下列步驟:
- 準備工作區
- 定義 Cloud Deploy 目標
- 定義 Cloud Deploy 管道
- 建立發布版本
- 升級部署作業
- 核准正式版
自修實驗室環境設定
- 登入 Google Cloud 控制台,然後建立新專案或重複使用現有專案。如果沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶。



- 專案名稱是這個專案參與者的顯示名稱。這是 Google API 未使用的字元字串,您隨時可以更新。
- 專案 ID 在所有 Google Cloud 專案中不得重複,且設定後即無法變更。Cloud 控制台會自動產生專屬字串,通常您不需要在意該字串為何。在大多數程式碼研究室中,您需要參照專案 ID (通常會標示為
PROJECT_ID),因此如果您不喜歡該字串,可以產生另一個隨機字串,或是嘗試使用自己的字串,看看是否可用。專案建立後,系統就會「凍結」該值。 - 還有第三個值,也就是部分 API 使用的「專案編號」。如要進一步瞭解這三種值,請參閱說明文件。
- 接著,您需要在 Cloud 控制台中啟用帳單,才能使用 Cloud 資源/API。完成本程式碼研究室的費用應該不高,甚至完全免費。如要停用資源,避免在本教學課程結束後繼續產生帳單費用,請按照程式碼研究室結尾的「清除」操作說明操作。Google Cloud 新使用者可參加價值$300 美元的免費試用計畫。
2. 平台設定
準備工作區
我們將在此設定執行本教學課程所需的環境。完成這個步驟後,我們就會建立 GKE 叢集,並在其中執行部署作業。
- 設定 gcloud config 預設值
gcloud config set project <your project>
gcloud config set deploy/region us-central1
- 複製存放區
git clone https://github.com/gushob21/software-delivery-workshop
cd software-delivery-workshop/labs/cloud-deploy/
cloudshell workspace .
rm -rf deploy && mkdir deploy
- 設定環境變數
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects list --filter="$PROJECT_ID" --format="value(PROJECT_NUMBER)")
- 啟用 API
gcloud services enable \
cloudresourcemanager.googleapis.com \
`container.googleapis.com \`
`cloudbuild.googleapis.com \`
`containerregistry.googleapis.com \`
`secretmanager.googleapis.com \`
`clouddeploy.googleapis.com`
- 建立 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 目標
- 在 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.
- 在部署目錄中建立名為 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
- 在部署目錄中建立名為 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 角色,才能核准發布作業。
- 建立部署目標
`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 管道
- 在 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 算繪。
- 套用管道
gcloud beta deploy apply --file deploy/pipeline.yaml
4. 開發階段
應用程式開發完成後,自動化 CICD 工具鍊會建構及儲存資產。執行下列指令,使用 Skaffold 建構應用程式,並儲存要透過 Cloud Deploy 部署的資產。您的 CICD 程序會為每個應用程式建構作業執行這個步驟。
- 使用 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 版本時,系統會自動將版本推出至第一個目標 (即預覽)。
- 前往 Google Cloud 控制台中的 <Cloud Deploy>
- 按一下「sample-app」
這個畫面會以圖形呈現管道。
- 確認預覽方塊左側有綠色外框,表示版本已部署至該環境。
- 如要查看發布內容的其他詳細資料,請按一下畫面下方「發布內容詳細資料」下方的發布內容名稱
- 確認版本已順利部署應用程式,請在 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
- 按一下畫面右上方的網頁預覽圖示。
- 選取「透過以下通訊埠預覽:8080」
系統會將您導向新頁面,並顯示「Hello World!」訊息。
- 在終端機中使用
ctrl+c結束通訊埠轉送。
宣傳發行的歌曲
現在版本已部署至管道中的第一個目標 (預覽),您可以將其升級至下一個目標 (初期測試版本)。執行下列指令,開始這項程序。
gcloud beta deploy releases promote \
--release=sample-app-release-${REL_TIMESTAMP} \
--delivery-pipeline=sample-app \
--quiet
查看發布宣傳活動
- 前往 Google Cloud 控制台中的 sample-app 管道
- 確認 Canary 方塊左側有綠色外框,表示版本已部署至該環境。
- 建立應用程式的通道,確認應用程式已正確部署
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
- 按一下畫面右上方的網頁預覽圖示。
- 選取「透過以下通訊埠預覽:8080」
系統會將您導向新頁面,並顯示「Hello World!」訊息。
- 在終端機中使用
ctrl+c結束通訊埠轉送。
核准正式版
請回想一下,我們透過 prod.yaml 建立實際工作環境目標時,已將標記 requireApproval 指定為 true。這會強制要求核准才能在正式環境中推送。
- 使用下列指令將初期測試版本推送至正式環境
gcloud beta deploy releases promote \
--release=sample-app-release-${REL_TIMESTAMP} \
--delivery-pipeline=sample-app \
--quiet
- 前往 Google Cloud 控制台中的 sample-app 管道
- 請注意標示「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
- 按一下畫面右上方的網頁預覽圖示。
- 選取「透過以下通訊埠預覽:8080」
系統會將您導向新頁面,並顯示「Hello World!」訊息。
- 在終端機中使用
ctrl+c結束通訊埠轉送。