使用 Cloud Deploy 發布

1. 目標

在本教學課程中,您將建立三個 GKE 叢集,分別命名為「preview」、「canary」和「prod」。接著,請建立與每個叢集相對應的 Cloud Deploy 目標,以及 Cloud Deploy 管道,以便定義在這些目標中執行部署作業的步驟順序。

部署流程會由 cloudbuild 管道觸發,該管道會建立 Cloud Deploy 版本,並在預先發布版叢集中執行部署作業。確認預覽版部署成功且運作正常後,您就可以手動在 Canary 叢集中升級版本。您必須核准才能在實際工作環境叢集中推送版本,您會在 Cloud Deploy UI 中核准實際工作環境管道,並最終推送。

本教學課程的目標可分為下列步驟:

  • 準備工作區
  • 定義 Cloud Deploy 目標
  • 定義 Cloud Deploy 管道
  • 建立發布版本
  • 推送部署
  • 核准正式版

自學環境設定

  1. 登入 Google Cloud 控制台,然後建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請務必建立帳戶

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 「Project name」是這個專案參與者的顯示名稱。這是 Google API 不會使用的字元字串,您隨時可以更新。
  • 專案 ID 在所有 Google Cloud 專案中不得重複,且無法變更 (設定後即無法變更)。Cloud 控制台會自動產生專屬字串,您通常不需要特別留意。在大多數程式碼研究室中,您需要參照專案 ID (通常會以 PROJECT_ID 表示),因此如果不喜歡這個 ID,可以產生另一個隨機 ID,也可以嘗試使用自己的 ID,看看是否可用。然後在專案建立後「凍結」。
  • 第三個值是專案編號,部分 API 會使用這個值。如要進一步瞭解這三個值,請參閱說明文件
  1. 接著,您需要在 Cloud 控制台中啟用帳單功能,才能使用 Cloud 資源/API。執行本程式碼研究室時,費用應該不會太高,如要關閉資源,避免產生教學課程以外的帳單費用,請按照程式碼研究室結尾的「清理」操作說明進行。Google Cloud 新使用者可享有 $300 美元的免費試用期

2. 平台設定

準備工作區

我們會在這裡設定執行本教學課程所需的環境。完成這個步驟後,我們將建立 GKE 叢集,以便執行部署作業。

  1. 設定 gcloud 設定預設值

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. 在 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

  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. 應用程式建立

在建立新應用程式時,CI/CD 管道通常會設定為執行自動建構、整合測試和部署作業。以下步驟屬於新應用程式的設定程序。每個新應用程式都會設定部署管道。

定義 Cloud Deploy 管道

  1. 在 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 算繪。

  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 檔案,並將這些檔案推送至 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 版本後,系統會自動將版本推出至第一個目標 (也就是預覽)。

  1. 前往 Google Cloud 控制台的 <Cloud Deploy>
  2. 按一下「sample-app」

這個畫面會顯示管道的圖形表示方式。

  1. 確認預覽方塊左側有綠色輪廓,表示已將版本部署至該環境。
  2. 如要查看版本的其他詳細資料,請按一下畫面下方「版本詳細資料」下方的版本名稱
  3. 確認版本是否已成功部署應用程式,請執行下列指令:

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. 在下一個畫面中,再次按一下「Review」(查看),即可前往正式版核准畫面
  3. 您可以選擇查看資訊清單差異,檢視變更內容。在本例中,是全新的檔案。
  4. 按一下「核准」按鈕
  5. 返回應用程式示例管道頁面,您會看到正在進行的正式版發布作業。

查看正式版

如同其他環境,您可以按照下列步驟查看部署作業是否完成。

  1. 在 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

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

系統會將您導向另一個顯示「Hello World!」訊息的新頁面。

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