使用 CI/CD 管道開發及部署容器化應用程式

Last reviewed 2022-11-18 UTC

本部署指南說明如何使用一套整合式 Google Cloud 工具,設定及使用開發、持續整合 (CI) 和持續推送軟體更新 (CD) 系統。您可以使用這個系統來開發應用程式並部署至 Google Kubernetes Engine (GKE)。

本指南說明如何建立「用於開發及推送容器化應用程式的部署管道」一文所述的架構。

本部署指南適用於軟體開發人員和營運人員,您在完成指南時會扮演下列角色:

  • 首先,您會擔任運算子,設定 CI/CD 管道。這個管道的主要元件是 Cloud BuildArtifact RegistryCloud Deploy
  • 接著,您會扮演開發人員,使用 Cloud Code 變更應用程式。以開發人員身分操作時,您會看到這個管道提供的整合式體驗。
  • 最後,您會扮演操作人員,逐步將應用程式部署到正式環境。

本部署指南假設您熟悉如何在 gcloud 上執行Google Cloud 指令,以及如何將應用程式容器部署至 GKE。

架構

下圖顯示本部署指南中使用的資源:

使用 Cloud Code、Cloud Build、Artifact Registry、Cloud Deploy 和 GKE 開發及部署系統

如要進一步瞭解這個架構中使用的元件,請參閱「Deployment pipeline for developing and delivering containerized apps」。

目標

您將以作業人員的身分執行下列操作:

  • 設定 CI 管道和 CD 管道。這項設定包括:
    • 設定必要權限。
    • 為暫存和正式環境建立 GKE 叢集。
    • 在 Cloud Source Repositories 中建立存放區,存放原始碼。
    • 在 Artifact Registry 中建立應用程式容器的存放區。
    • 在主要 GitHub 存放區中建立 Cloud Build 自動建構觸發條件。
    • 建立 Cloud Deploy 推送管道和目標。目標是暫存和正式環境。
  • 啟動 CI/CD 程序,部署至測試環境,然後升級至正式環境。

您以開發人員身分變更應用程式。如要這麼做,請按照下列步驟操作:

  • 複製存放區,即可使用預先設定的開發環境。
  • 在開發人員工作區中變更應用程式。
  • 建構及測試變更。測試包括治理驗證測試。
  • 在開發叢集中查看及驗證變更。這個叢集是在 minikube 上執行。
  • 將變更提交至主要存放區。

費用

在本文件中,您會使用下列 Google Cloud的計費元件:

如要根據預測用量估算費用,請使用 Pricing Calculator

初次使用 Google Cloud 的使用者可能符合免費試用期資格。

完成本文所述工作後,您可以刪除建立的資源,避免繼續計費,詳情請參閱「清除所用資源」。

事前準備

  1. 在 Google Cloud 控制台的專案選擇器頁面中,選取或建立 Google Cloud 專案。

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您在專案中獲派角色,即可選取該專案。
    • 建立專案:如要建立專案,您需要專案建立者角色 (roles/resourcemanager.projectCreator),其中包含 resourcemanager.projects.create 權限。瞭解如何授予角色

    前往專案選取器

  2. 確認專案已啟用計費功能 Google Cloud

  3. 啟用 Artifact Registry、Cloud Build、Cloud Deploy、Cloud Source Repositories、Google Kubernetes Engine、Resource Manager 和 Service Networking API。

    啟用 API 時所需的角色

    您必須具備 serviceusage.services.enable 權限,才能啟用 API。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用情形管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色

    啟用 API

  4. 在 Google Cloud 控制台中啟用 Cloud Shell。

    啟用 Cloud Shell

    控制台底部會開啟 Cloud Shell 工作階段,並顯示指令列提示。 Google Cloud Cloud Shell 是已安裝 Google Cloud CLI 的殼層環境,並已針對您目前的專案設定好相關值。工作階段可能要幾秒鐘的時間才能初始化。

準備環境

在本節中,您將扮演應用程式運算子的角色,並執行下列操作:

  • 設定必要權限。
  • 為暫存和正式環境建立 GKE 叢集。
  • 複製來源存放區。
  • 在 Cloud Source Repositories 中建立存放區,存放原始碼。
  • 在 Artifact Registry 中建立容器應用程式的存放區。

設定權限

在本節中,您將授予設定 CI/CD 管道所需的權限。

  1. 如果您是在新的 Cloud Shell Editor 執行個體中作業,請指定要用於本部署指南的專案:

    gcloud config set project PROJECT_ID
    

    PROJECT_ID 替換為您為本部署指南選取或建立的專案 ID。

    如果顯示對話方塊,請按一下「授權」

  2. 請確認預設 Compute Engine 服務帳戶具備足夠的權限,可在 Cloud Deploy 中執行作業,並從 Artifact Registry 提取容器。Cloud Build 和 Cloud Deploy 會使用這個預設服務帳戶。

    這個服務帳戶可能已具備必要權限。 如果專案已停用為預設服務帳戶自動授予角色的功能,則適用此步驟,確保授予必要權限。

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
        --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
        --role="roles/clouddeploy.jobRunner"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
        --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
        --role="roles/artifactregistry.reader"
    
  3. 授予 Cloud Build 服務帳戶權限,以便透過 Cloud Deploy 叫用部署作業,並更新發布管道和目標定義:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
        --format="value(projectNumber)")@cloudbuild.gserviceaccount.com \
        --role="roles/clouddeploy.operator"
    

    如要進一步瞭解這個 IAM 角色,請參閱 clouddeploy.operator 角色。

  4. 授予 Cloud Build 和 Cloud Deploy 服務帳戶部署至 GKE 的權限:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
        --format="value(projectNumber)")-compute@developer.gserviceaccount.com \
        --role="roles/container.admin"
    

    如要進一步瞭解這個 IAM 角色,請參閱container.admin 角色

  5. 將呼叫 Cloud Deploy 作業所需的權限授予 Cloud Build 服務帳戶:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$(gcloud projects describe PROJECT_ID \
        --format="value(projectNumber)")@cloudbuild.gserviceaccount.com \
        --role="roles/iam.serviceAccountUser"
    

    Cloud Build 叫用 Cloud Deploy 時,會使用 Compute Engine 服務帳戶建立版本,因此需要這項權限。

    如要進一步瞭解這個 IAM 角色,請參閱 iam.serviceAccountUser 角色

您已授予 CI/CD 管道所需的權限。

建立 GKE 叢集

在本節中,您將建立預先發布和正式版環境,這兩個環境都是 GKE 叢集。(您不需要在這裡設定開發叢集,因為它會使用 minikube)。

  1. 建立暫存和正式環境 GKE 叢集:

    gcloud container clusters create-auto staging \
        --region us-central1 \
        --project=$(gcloud config get-value project) \
        --async
    
    gcloud container clusters create-auto prod \
        --region us-central1 \
        --project=$(gcloud config get-value project) \
        --async
    

    您可以在預先發布叢集中測試程式碼變更。確認預備環境中的部署作業不會對應用程式造成負面影響後,即可部署至正式環境。

  2. 執行下列指令,確認輸出內容包含暫存和正式叢集的 STATUS: RUNNING

    gcloud container clusters list
    
  3. 擷取暫存和正式版叢集的 kubeconfig 檔案憑證。

    gcloud container clusters get-credentials staging --region us-central1
    
    gcloud container clusters get-credentials prod --region us-central1
    

    您可以使用這些憑證與 GKE 叢集互動,例如檢查應用程式是否正常運作。

您現在已為暫存和正式環境建立 GKE 叢集。

開啟 IDE 並複製存放區

如要複製存放區並在開發環境中查看應用程式,請執行下列步驟:

  1. 將 GitHub 存放區複製到 Cloud Shell。

    在 Cloud Shell 開啟

  2. 按一下「確認」。

    Cloud Shell 編輯器會開啟並複製範例存放區。

    您現在可以在 Cloud Shell 編輯器中查看應用程式的程式碼。

  3. 指定要用於這項部署指南的專案:

    gcloud config set project PROJECT_ID
    

    如果顯示對話方塊,請按一下「授權」

您現在可以在開發環境中取得應用程式的原始碼。

這個來源存放區包含 CI/CD 管道所需的 Cloud Build 和 Cloud Deploy 檔案。

為原始碼和容器建立存放區

在本節中,您將在 Cloud Source Repositories 中設定原始碼存放區,並在 Artifact Registry 中設定存放區,以儲存 CI/CD 管道建構的容器。

  1. 在 Cloud Source Repositories 中建立存放區,儲存原始碼並連結至 CI/CD 程序:

    gcloud source repos create cicd-sample
    
  2. 確認 Cloud Deploy 設定的目標專案正確無誤:

    sed -i s/project-id-placeholder/$(gcloud config get-value project)/g deploy/*
    git config --global credential.https://source.developers.google.com.helper gcloud.sh
    git remote add google https://source.developers.google.com/p/$(gcloud config get-value project)/r/cicd-sample
    
  3. 將原始碼推送至存放區:

    git push --all google
    
  4. 在 Artifact Registry 中建立映像檔存放區:

    gcloud artifacts repositories create cicd-sample-repo \
        --repository-format=Docker \
        --location us-central1
    

您現在在 Cloud Source Repositories 中有一個原始碼存放區,在 Artifact Registry 中則有一個應用程式容器存放區。您可以在 Cloud Source Repositories 存放區中複製原始碼,並連結至 CI/CD 管道。

設定 CI/CD 管道

在本節中,您將扮演應用程式運算子,設定 CI/CD 管道。管道會使用 Cloud Build 進行 CI,並使用 Cloud Deploy 進行 CD。管道的步驟是在 Cloud Build 自動建構觸發條件中定義。

  1. 建立 Cloud Build 的 Cloud Storage bucket,用來儲存 artifacts.json 檔案 (追蹤 Skaffold 為每個建構作業產生的構件):

    gcloud storage buckets create gs://$(gcloud config get-value project)-gceme-artifacts/
    

    將每個建構版本的 artifacts.json 檔案儲存在中央位置是個好做法,因為這樣可以提供追蹤功能,方便進行疑難排解。

  2. 查看 cloudbuild.yaml 檔案,這個檔案定義了 Cloud Build 觸發程序,且已在您複製的原始碼存放區中設定。

    這個檔案會定義觸發條件,只要有新內容推送到原始碼存放區的主要分支版本,就會觸發該條件。

    cloudbuild.yaml 檔案中定義了 CI/CD 管道的下列步驟:

    • Cloud Build 會使用 Skaffold 建構應用程式容器。

    • Cloud Build 會將建構作業的 artifacts.json 檔案放在 Cloud Storage bucket 中。

    • Cloud Build 會將應用程式容器放在 Artifact Registry 中。

    • Cloud Build 會對應用程式容器執行測試。

    • gcloud deploy apply 指令會向 Cloud Deploy 服務註冊下列檔案:

      • deploy/pipeline.yaml,這是推送管道
      • deploy/staging.yamldeploy/prod.yaml,也就是目標檔案

      註冊檔案時,如果管道和目標尚不存在,Cloud Deploy 會建立這些項目;如果設定已變更,則會重新建立。目標是暫存和正式環境。

    • Cloud Deploy 會為推送管道建立新版本。

      這個版本會參照在 CI 程序中建構及測試的應用程式容器。

    • Cloud Deploy 會將發布內容部署至預備環境。

    推送管道和目標由 Cloud Deploy 管理,且與原始碼分離。這種分離式設計表示,當應用程式的原始碼有所變更時,您不需要更新傳送管道和目標檔案。

  3. 建立 Cloud Build 自動建構觸發條件:

    gcloud beta builds triggers create cloud-source-repositories \
        --name="cicd-sample-main" \
        --repo="cicd-sample" \
        --branch-pattern="main" \
        --build-config="cloudbuild.yaml"
    

    這個觸發條件會告知 Cloud Build 監控來源存放區,並使用 cloudbuild.yaml 檔案對存放區的任何變更做出反應。每當有新的推送項目傳送至主要分支版本時,就會叫用這項觸發條件。

  4. 前往 Google Cloud 控制台的 Cloud Build 頁面。

    前往 Cloud Build

    請注意,您的應用程式沒有任何建構作業。

您已設定 CI 和 CD 管道,並在存放區的主要分支版本中建立觸發條件。

在開發人員工作區中變更應用程式

在本節中,您將扮演應用程式開發人員。

開發應用程式時,您可以使用 Cloud Code 做為開發工作區,對應用程式進行疊代式變更並驗證:

  • 變更應用程式。
  • 建構並測試新程式碼。
  • 將應用程式部署至 minikube 叢集,並驗證面向使用者的變更。
  • 將變更提交至主要存放區。

將這項變更提交至主要存放區後,Cloud Build 自動建構觸發條件就會啟動 CI/CD 管道。

建構、測試及執行應用程式

在本節中,您將建構、測試、部署及存取應用程式。

使用前一節中使用的相同 Cloud Shell 編輯器執行個體。如果關閉了編輯器,請在瀏覽器中前往 ide.cloud.google.com,開啟 Cloud Shell 編輯器。

  1. 在終端機中啟動 minikube:

    minikube start
    

    minikube 會在 Cloud Shell 中設定本機 Kubernetes 叢集。這項設定作業會在幾分鐘內完成。完成後,minikube 程序會在 Cloud Shell 執行個體上於背景執行。

  2. 在 Cloud Shell 編輯器底部的窗格中,選取「Cloud Code」

  3. 在終端機和編輯器之間顯示的細長面板中,選取「在 Kubernetes 上執行」

    如果看到 Use current context (minikube) to run the app? 提示,請按一下「是」

    這項指令會建構原始碼並執行測試。這可能需要幾分鐘的時間。測試包括單元測試和預先設定的驗證步驟,可檢查部署環境的規則集。即使您仍在開發環境中工作,系統也會確保在發生部署問題時發出警告。

    「Output」分頁會顯示 Skaffold 建構及部署應用程式的進度。

    請勿關閉這個分頁

    建構和測試完成後,「Output」(輸出) 分頁會顯示 Update succeeded, 並顯示兩個網址。

    建構及測試應用程式時,Cloud Code 會在「輸出」分頁中串流傳回記錄和網址。在開發環境中進行變更及執行測試時,您可以查看開發環境的應用程式版本,並確認是否正常運作。

    輸出內容也會顯示 Watching for changes...,表示已啟用監看模式。Cloud Code 處於監看模式時,服務會偵測存放區中儲存的任何變更,並自動重建及重新部署應用程式,套用最新變更。

  4. 在 Cloud Code 終端機中,將指標懸停在輸出內容中的第一個網址上 (http://localhost:8080)。

  5. 在隨即顯示的工具提示中,選取「開啟網頁預覽」

    在背景中,Cloud Code 會自動將流量轉送至在 minikube 上執行的 cicd-sample 服務。

  6. 在瀏覽器中重新整理頁面。

    「計數器」旁的數字會增加,表示應用程式正在回應重新整理要求。

    在瀏覽器中保持開啟這個頁面,以便在本地環境中進行變更時查看應用程式。

您現在已在開發環境中建構及測試應用程式。您已將應用程式部署至在 minikube 上執行的開發叢集,並查看應用程式面向使用者的行為。

進行變更

在本節中,您將變更應用程式,並在開發叢集中執行應用程式時查看變更。

  1. 在 Cloud Shell 編輯器中開啟 index.html 檔案。

  2. 搜尋字串 Sample App Info,並將其變更為 sample app info, 這樣標題就會使用小寫字母。

    檔案會自動儲存,並觸發應用程式容器的重建作業。

    Cloud Code 會偵測到變更,並自動重新部署。「Output」(輸出) 分頁會顯示 Update initiated。重新部署作業需要幾分鐘才能完成。

    只要是在 Kubernetes 叢集上執行的應用程式,都能使用這項自動重新部署功能。

  3. 建構完成後,前往開啟應用程式的瀏覽器,然後重新整理頁面。

    重新整理後,您會發現文字現在使用小寫字母。

無論使用哪種架構或元件,您都能透過這項設定自動重新載入。使用 Cloud Code 和 minikube 時,在 Kubernetes 中執行的任何項目都會具備這項熱重載程式碼功能。

您可以使用 Cloud Code,對部署至 Kubernetes 叢集的應用程式進行偵錯。本部署指南不會介紹這些步驟,但如需詳細資訊,請參閱「偵錯 Kubernetes 應用程式」。

提交程式碼

您已變更應用程式,現在可以提交程式碼。

  1. 設定 Git 身分:

    git config --global user.email "YOU@EXAMPLE.COM"
    git config --global user.name "NAME"
    

    更改下列內容:

    • YOU@EXAMPLE.COM:與 GitHub 帳戶連結的電子郵件地址。
    • NAME:與 GitHub 帳戶連結的名稱。
  2. 在終端機中提交程式碼:

    git add .
    git commit -m "use lowercase for: sample app info"
    

    您不需要在此執行 git push 指令。稍後會再詳細說明。

您已在開發環境中變更應用程式、建構及測試變更,並驗證這些變更對使用者造成的影響。開發環境中的測試包括控管檢查,可讓您修正導致正式環境發生問題的錯誤。

在本部署指南中,將程式碼提交至主要存放區時,您不會經過程式碼審查。不過,程式碼審查或變更核准是軟體開發的建議程序。

如要進一步瞭解變更核准最佳做法,請參閱「簡化變更核准程序」。

將變更部署至正式環境

在本節中,您將扮演應用程式運算子的角色,並執行下列操作:

  • 觸發 CI/CD 管道,將版本部署至預先發布環境。
  • 將版本升級為正式版並核准。

啟動 CI/CD 管道並部署至預先發布環境

在本節中,您將叫用 Cloud Build 自動建構觸發條件,啟動 CI/CD 管道。每當變更提交至主要存放區時,系統就會叫用這個觸發條件。您也可以透過手動觸發條件啟動 CI 系統。

  1. 在 Cloud Shell 編輯器中,執行下列指令來觸發建構作業:

    git push google
    

    這個版本包含您對 cicd-sample 所做的變更。

  2. 返回 Cloud Build 資訊主頁,查看是否已建立建構作業。

  3. 按一下右側建構記錄中的「Running: cicd-sample - cicd-sample-main」,然後尋找以藍色文字標示的每個步驟開始和結束位置。

    步驟 0 顯示 cloudbuild.yaml 檔案中 skaffold buildskaffold test 指令的輸出內容。步驟 0 (管道的 CI 部分) 中的建構和測試工作已通過,因此現在會執行步驟 1 (管道的 CD 部分) 的部署工作。

    這個步驟完成後,會顯示下列訊息:

    Created Cloud Deploy rollout ROLLOUT_NAME in target staging

  4. 開啟 Cloud Deploy 推送管道頁面,然後點選 cicd-sample delivery 管道。

    應用程式部署在測試環境,但未部署在正式環境。

  5. 確認應用程式在暫存環境中運作正常:

    kubectl proxy --port 8001 --context gke_$(gcloud config get-value project)_us-central1_staging
    

    這個指令會設定 kubectl Proxy,以便存取應用程式。

  6. 從 Cloud Shell 存取應用程式:

    1. 在 Cloud Shell 編輯器中開啟新的終端機分頁。

    2. 傳送要求至 localhost,即可遞增計數器:

      curl -s http://localhost:8001/api/v1/namespaces/default/services/cicd-sample:8080/proxy/ | grep -A 1 Counter
      

      您可以多次執行這項指令,並觀察計數器值每次遞增的情況。

      查看應用程式時,請注意您變更的文字位於部署在暫存環境的應用程式版本中。

    3. 關閉第二個分頁。

    4. 在第一個分頁中,按下 Control+C 停止 Proxy。

您現在已叫用 Cloud Build 自動建構觸發條件來啟動 CI 程序,包括建構應用程式、將應用程式部署至暫存環境,以及執行測試來驗證應用程式是否在暫存環境中運作。

如果程式碼建構和測試在暫存環境中通過,表示 CI 程序成功。CI 程序成功完成後,就會在 Cloud Deploy 中啟動 CD 系統。

將版本升級至正式版

在本節中,您會將發布版本從測試環境升級至正式環境。實際工作環境目標已預先設定為需要核准,因此您必須手動核准。

對於您自己的 CI/CD 管道,您可能想使用部署策略,在全面部署到正式環境前,逐步啟動部署作業。逐步推出部署作業可讓您更輕鬆地偵測問題,並在必要時還原先前的版本。

如要將版本推送至正式版,請按照下列步驟操作:

  1. 開啟 Cloud Deploy 推送管道總覽,然後選取 cicd-sample 管道。

  2. 將部署作業從測試環境升級至正式環境。方法如下:

    1. 在頁面頂端的管道圖中,按一下暫存區方塊中的藍色「升級」按鈕。

    2. 在開啟的視窗中,按一下底部的「升級」按鈕。

    部署作業尚未在正式環境中執行。正在等待必要的手動核准。

  3. 手動核准部署作業:

    1. 在管道的視覺化圖表中,按一下暫存和正式環境方塊之間的「檢閱」按鈕。

    2. 在開啟的視窗中,按一下「查看」按鈕。

    3. 在下一個視窗中,按一下「核准」

    4. 返回 Cloud Deploy 推送管道總覽,然後選取 cicd-sample 管道。

  4. 管道視覺化工具顯示 prod 方塊為綠色 (表示推出成功) 後,請設定 kubectl Proxy,用來存取應用程式,確認應用程式在正式環境中運作正常:

    kubectl proxy --port 8002 --context gke_$(gcloud config get-value project)_us-central1_prod
    
  5. 從 Cloud Shell 存取應用程式:

    1. 在 Cloud Shell 編輯器中開啟新的終端機分頁。

    2. 遞增計數器:

      curl -s http://localhost:8002/api/v1/namespaces/default/services/cicd-sample:8080/proxy/ | grep -A 1 Counter
      

      您可以多次執行這項指令,並觀察計數器值每次遞增的情況。

    3. 關閉第二個終端機分頁。

    4. 在第一個分頁中,按下 Control+C 停止 Proxy。

您已升級並核准正式版部署作業。您最近變更的應用程式現已在正式環境中執行。

清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取本部署指南所用資源的費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。

方法 1:刪除專案

  1. 前往 Google Cloud 控制台的「Manage resources」(管理資源) 頁面。

    前往「Manage resources」(管理資源)

  2. 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)
  3. 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。

選項 2:刪除個別資源

  1. 刪除 Cloud Deploy 管道:

    gcloud deploy delivery-pipelines delete cicd-sample --region=us-central1 --force
    
  2. 刪除 Cloud Build 觸發條件:

    gcloud beta builds triggers delete cicd-sample-main
    
  3. 刪除測試和正式叢集:

    gcloud container clusters delete staging
    
    gcloud container clusters delete prod
    
  4. 在 Cloud Source Repositories 中刪除存放區:

    gcloud source repos delete cicd-sample
    
  5. 刪除 Cloud Storage bucket:

    gcloud storage rm -r gs://$(gcloud config get-value project)-gceme-artifacts/
    
    gcloud storage rm -r gs://$(gcloud config get-value project)_clouddeploy/
    
  6. 刪除 Artifact Registry 中的存放區:

    gcloud artifacts repositories delete cicd-sample-repo \
        --location us-central1
    

後續步驟