1. 目標
在本教學課程中,您將建立三個 GKE 叢集,分別命名為「preview」、「canary」和「prod」。接著,請建立與每個叢集相對應的 Cloud Deploy 目標,以及 Cloud Deploy 管道,以便定義在這些目標中執行部署作業的步驟順序。
部署流程會由 cloudbuild 管道觸發,該管道會建立 Cloud Deploy 版本,並在預先發布版叢集中執行部署作業。確認預覽版部署成功且運作正常後,您就可以手動在 Canary 叢集中升級版本。您必須核准才能在實際工作環境叢集中推送版本,您會在 Cloud Deploy UI 中核准實際工作環境管道,並最終推送。
本教學課程的目標可分為下列步驟:
- 準備工作區
- 定義 Cloud Deploy 目標
- 定義 Cloud Deploy 管道
- 建立發布版本
- 推送部署
- 核准正式版
自學環境設定
- 登入 Google Cloud 控制台,然後建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請務必建立帳戶。
- 「Project name」是這個專案參與者的顯示名稱。這是 Google API 不會使用的字元字串,您隨時可以更新。
- 專案 ID 在所有 Google Cloud 專案中不得重複,且無法變更 (設定後即無法變更)。Cloud 控制台會自動產生專屬字串,您通常不需要特別留意。在大多數程式碼研究室中,您需要參照專案 ID (通常會以
PROJECT_ID
表示),因此如果不喜歡這個 ID,可以產生另一個隨機 ID,也可以嘗試使用自己的 ID,看看是否可用。然後在專案建立後「凍結」。 - 第三個值是專案編號,部分 API 會使用這個值。如要進一步瞭解這三個值,請參閱說明文件。
- 接著,您需要在 Cloud 控制台中啟用帳單功能,才能使用 Cloud 資源/API。執行本程式碼研究室時,費用應該不會太高,如要關閉資源,避免產生教學課程以外的帳單費用,請按照程式碼研究室結尾的「清理」操作說明進行。Google Cloud 新使用者可享有 $300 美元的免費試用期。
2. 平台設定
準備工作區
我們會在這裡設定執行本教學課程所需的環境。完成這個步驟後,我們將建立 GKE 叢集,以便執行部署作業。
- 設定 gcloud 設定預設值
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 中使用下列指令,在部署目錄中建立名為 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.
- 在 Cloud Shell 中使用下列指令,在部署目錄中建立名為 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
- 在 Cloud Shell 中使用下列指令,在部署目錄中建立名為 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
請注意,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. 應用程式建立
在建立新應用程式時,CI/CD 管道通常會設定為執行自動建構、整合測試和部署作業。以下步驟屬於新應用程式的設定程序。每個新應用程式都會設定部署管道。
定義 Cloud Deploy 管道
- 在 Cloud Shell 中使用下列指令,在部署目錄中建立名為 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.yaml 中零個或多個 Skaffold 設定檔名稱的清單。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 檔案,並將這些檔案推送至 GitHub 存放區,其中包含範例 Go 應用程式,我們會使用 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」
這個畫面會顯示管道的圖形表示方式。
- 確認預覽方塊左側有綠色輪廓,表示已將版本部署至該環境。
- 如要查看版本的其他詳細資料,請按一下畫面下方「版本詳細資料」下方的版本名稱
- 確認版本是否已成功部署應用程式,請執行下列指令:
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 個待處理」。
這則訊息表示有待發布至正式環境的版本,但需要經過審查及核准。
- 按一下黃色通知下方的「查看」按鈕。
- 在下一個畫面中,再次按一下「Review」(查看),即可前往正式版核准畫面
- 您可以選擇查看資訊清單差異,檢視變更內容。在本例中,是全新的檔案。
- 按一下「核准」按鈕
- 返回應用程式示例管道頁面,您會看到正在進行的正式版發布作業。
查看正式版
如同其他環境,您可以按照下列步驟查看部署作業是否完成。
- 在 CloudShell 中執行下列指令,建立轉送連接埠
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
結束通訊埠轉送。