使用 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.pnga99b7ace416376c4.pngbd84a6d3004737c5.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 中,於部署目錄建立名為 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. 在 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 角色,才能核准版本。

  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 中執行下列指令,在 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 pending」(1 個待處理)。

這則訊息表示有版本已排定要部署至正式版,但需要審查和核准。

  1. 按一下黃色通知下方的「查看」按鈕。
  2. 在下一個畫面中,再次點選「審查」,即可存取正式版的核准畫面
  3. (選用) 查看資訊清單差異比較,瞭解變更內容。在本例中,這是全新的檔案。
  4. 按一下「核准」按鈕
  5. 返回 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

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

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

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