1. 目標
在這個教學課程中,您會建立三個 GKE 叢集,名稱為「Preview」、「Canary」和「prod」。接著,請建立每個叢集對應的 Cloud Deploy 目標,並建立 Cloud Deploy 管道,定義要在這些目標中執行部署作業的步驟順序。
cloudbuild 管道會觸發部署流程,這些管道會建立 Cloud Deploy 版本,並在預覽叢集中執行部署作業。確認預先發布版部署成功且如預期運作後,就會在初期測試叢集中手動升級版本。如要在實際工作環境叢集中推送版本,您必須獲得核准,才能在 Cloud Deploy UI 中核准實際工作環境管道,最後升級。
本教學課程的目標可分為以下幾個步驟:
- 準備工作區
- 定義 Cloud Deploy 目標
- 定義 Cloud Deploy 管道
- 建立發布版本
- 升級部署作業
- 核准正式版
自修環境設定
- 登入 Google Cloud 控制台,建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶。
- 「專案名稱」是這項專案參與者的顯示名稱。這是 Google API 不使用的字元字串,您可以隨時更新。
- 所有 Google Cloud 專案的專案 ID 均不得重複,且設定後即無法變更。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 目標
- 在 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.
- 在 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
- 在 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」角色才能核准版本。
- 建立部署目標
`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 管道
- 在 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 算繪的設定檔。
- 套用管道
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 版本建立後,會自動在第一個預先發布版目標中推出。
- 前往 <Cloud Deploy>位於 Google Cloud 控制台
- 按一下「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 控制台中的 example-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 控制台中的 example-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
以結束通訊埠轉送。