使用 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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the Artifact Registry, Cloud Build, Cloud Deploy, Cloud Source Repositories, Google Kubernetes Engine, Resource Manager, and Service Networking APIs.

    Enable the APIs

  4. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

準備環境

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

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

設定權限

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

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

    gcloud config set project PROJECT_ID
    

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

    如果出現對話方塊,請按一下「Authorize」(授權)

  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 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/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
    

    如果出現對話方塊,請按一下「Authorize」(授權)

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

這個來源存放區包含 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 Storage bucket,供 Cloud Build 儲存 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. 管道視覺化工具顯示實際工作環境方塊為綠色 (表示推出成功) 後,請設定 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. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

選項 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
    

後續步驟