本教學課程說明如何使用 Azure Pipelines、Cloud Run 和 Container Registry,為 ASP.NET MVC Core 網頁應用程式建立持續整合/持續部署 (CI/CD) 管道。
CI/CD 管道會使用兩個 Cloud de Confiance 專案,一個用於開發,另一個用於正式環境,如下圖所示。
在管道的開頭,開發人員會將變更內容提交至範例程式碼庫。這項動作會觸發管道建立版本,並將版本部署至開發叢集中的 Cloud Run。接著,發布管理員會推送版本,部署至正式版專案。
本教學課程適用於開發人員和 DevOps 工程師。本文假設您具備 .NET、Azure Pipelines、Cloud Run 和 git 的基礎知識。如要完成本教學課程,您需要 Azure DevOps 帳戶的管理員存取權。
目標
- 將 Artifact Registry 連結至 Azure Pipelines,發布 Docker 映像檔。
- 準備.NET 範例應用程式,以便部署至 Cloud Run。
- 設定 Azure Pipelines 與 Cloud de Confiance by S3NS之間的驗證。
- 使用 Azure Pipelines 版本管理功能,協調 Cloud Run 部署作業。
費用
在本文件中,您將使用下列 Cloud de Confiance by S3NS計費元件:
完成本文所述工作後,您可以刪除建立的資源,避免繼續計費,詳情請參閱「清除所用資源」一節。
如要瞭解使用 Azure DevOps 可能產生的費用,請參閱 Azure DevOps 定價頁面。
事前準備
在本教學課程中,您會使用兩個不同的專案,一個用於開發,另一個用於正式環境。使用個別專案可讓您在將版本部署至正式環境前進行測試,也能個別管理 Identity and Access Management (IAM) 角色和權限。
- 建立開發專案。 Cloud de Confiance 本教學課程將這個專案稱為「開發專案」。
- 建立正式版專案。 Cloud de Confiance 本教學課程將這個專案稱為「正式環境專案」。
- 請確認您有 Azure DevOps 帳戶,並具備管理員存取權。如果還沒有 Azure DevOps 帳戶,請前往 Azure DevOps 首頁註冊。
建立 Azure DevOps 專案
您可以使用 Azure DevOps 管理原始碼、執行建構和測試,以及協調部署至 Cloud Run 的作業。首先,請在 Azure DevOps 帳戶中建立專案。
- 前往 Azure DevOps 首頁 (https://dev.azure.com/YOUR_AZURE_DEVOPS_ACCOUNT_NAME)。
- 按一下「New Project」。
- 輸入專案名稱,例如
CloudDemo。 - 將「Visibility」設為「Private」,然後按一下 [Create project]。
- 建立專案後,按一下左選單中的「Repos」。
- 按一下「Import」(匯入),從 GitHub 建立
dotnet-docs-samples存放區分支,然後設定下列值:- 存放區類型:
Git - 複製網址:
https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git
- 存放區類型:
按一下「匯入」。
匯入程序完成後,您會看到
dotnet-docs-samples存放區的原始碼。
將 Azure Pipelines 連線至 Artifact Registry
如要為 CloudDemo 應用程式設定持續整合,請先將 Azure Pipelines 連線至 Artifact Registry。Azure Pipelines 就能透過這個連線,將容器映像檔發布至 Artifact Registry。
設定用於發布圖片的服務帳戶
在正式版專案中建立Cloud de Confiance 服務帳戶:
- 在 Cloud de Confiance 控制台中,切換至實際工作環境專案。
-
在 Cloud de Confiance 控制台中啟用 Cloud Shell。
初始化下列環境變數:
DEV_PROJECT_ID=DEV_PROJECT_ID PROD_PROJECT_ID=PROD_PROJECT_ID
更改下列內容:
DEV_PROJECT_ID:開發專案的專案 IDPROD_PROJECT_ID:生產專案的專案 ID
在正式版專案中啟用 Artifact Registry API:
gcloud services enable artifactregistry.googleapis.com \ --project=$PROD_PROJECT_ID建立 Artifact Registry 存放區,用於儲存 Docker 映像檔:
gcloud artifacts repositories create docker \ --project=$PROD_PROJECT_ID \ --repository-format=docker \ --location REGION將
REGION替換為 Artifact Registry 存放區的區域,例如us-central1。建立 Azure Pipelines 用來發布 Docker 映像的服務帳戶:
gcloud iam service-accounts create azure-pipelines-publisher \ --display-name="Azure Pipelines Publisher" \ --project=$PROD_PROJECT_ID將Artifact Registry 寫入者角色 (
roles/artifactregistry.writer) 授予服務帳戶,允許 Azure Pipelines 推送至 Artifact Registry:AZURE_PIPELINES_PUBLISHER=azure-pipelines-publisher@$PROD_PROJECT_ID.s3ns.iam.gserviceaccount.com gcloud projects add-iam-policy-binding $PROD_PROJECT_ID \ --member serviceAccount:$AZURE_PIPELINES_PUBLISHER \ --role roles/artifactregistry.writer \ --project=$PROD_PROJECT_ID產生服務帳戶金鑰:
gcloud iam service-accounts keys create azure-pipelines-publisher.json \ --iam-account $AZURE_PIPELINES_PUBLISHER \ --project=$PROD_PROJECT_ID tr -d '\n' < azure-pipelines-publisher.json > azure-pipelines-publisher-oneline.json查看服務帳戶金鑰檔案的內容:
echo $(<azure-pipelines-publisher-oneline.json)您會在後續步驟中用到服務帳戶金鑰。
為 Artifact Registry 建立服務連線
在 Azure Pipelines 中,為 Artifact Registry 建立新的服務連線:
- 在 Azure DevOps 選單中,依序選取「專案設定」和「Pipelines」 >「Service connections」。
- 按一下「建立服務連線」。
- 從清單中選取 Docker Registry,然後按一下 下一步。
在對話方塊中,在下列欄位輸入這些值:
- 登記類型:其他
Docker 登錄檔:
https://REGION-docker.pkg.dev/PROD_PROJECT_ID/docker/更改下列內容:
REGION:Artifact Registry 存放區的區域PROD_PROJECT_ID:換成您的正式版專案名稱
Docker ID:
_json_key密碼:貼上
azure-pipelines-publisher-oneline.json的內容。服務連線名稱:
gcr-tutorial
按一下「儲存」即可建立連結。
持續建構
您現在可以使用 Azure Pipelines 設定持續整合。每當有任何提交推送至 Git 存放區,Azure Pipelines 就會建構程式碼,並將建構構件封裝至 Docker 容器。然後將容器發布至 Artifact Registry。
存放區已包含下列 Dockerfile:
現在,請使用 YAML 語法建立新的管道:
- 使用 Visual Studio 或指令列
git用戶端,複製新的 Git 存放區。 - 在存放區的根目錄中,建立名為
azure-pipelines.yml的檔案。 將下列程式碼複製到檔案中:
resources: - repo: self fetchDepth: 1 pool: vmImage: ubuntu-22.04 trigger: - master variables: TargetFramework: 'net6.0' BuildConfiguration: 'Release' DockerImageName: 'PROD_PROJECT_ID/docker/CloudDemo' steps: - task: DotNetCoreCLI@2 displayName: Publish inputs: projects: 'applications/clouddemo/netcore/CloudDemo.MvcCore.sln' publishWebProjects: false command: publish arguments: '--configuration $(BuildConfiguration) --framework=$(TargetFramework)' zipAfterPublish: false modifyOutputPath: false - task: PublishBuildArtifacts@1 displayName: 'Publish Artifact' inputs: PathtoPublish: '$(build.artifactstagingdirectory)' - task: Docker@2 displayName: 'Login to Container Registry' inputs: command: login containerRegistry: 'gcr-tutorial' - task: Docker@2 displayName: 'Build and push image' inputs: Dockerfile: 'applications/clouddemo/netcore/Dockerfile' command: buildAndPush repository: '$(DockerImageName)'
將
PROJECT_ID替換為正式版專案的名稱,然後儲存檔案。由於 Cloud Run 是以 Linux 為基礎的環境,因此管道會使用 Linux 建構代理程式。
提交變更並推送至 Azure Pipelines。
Visual Studio
- 開啟 Team Explorer,然後按一下「首頁」圖示。
- 按一下 [Changes] (變更)。
- 輸入修訂訊息,例如
Add pipeline definition。 - 按一下 [Commit All and Push] (全部認可並推送)。
指令列
暫存所有已修改的檔案:
git add -A將變更提交至本機存放區:
git commit -m "Add pipeline definition"將變更推送至 Azure DevOps:
git push
在 Azure DevOps 選單中選取「Pipelines」(管線),然後按一下「Create Pipeline」(建立管線)。
選取「Azure Repos Git」。
選取存放區。
在「Review your pipeline YAML」(檢查管道 YAML) 頁面中,按一下「Run」(執行)。
系統會觸發新的建構程序。建構作業大約需要兩分鐘才能完成。
如要確認映像檔已發布至 Artifact Registry,請在控制台中切換至正式版專案,依序選取「Artifact Registry」 >「docker」,然後按一下「CloudDemo」。 Cloud de Confiance
畫面上會顯示單一圖片和該圖片的標記。這個標記對應於在 Azure Pipelines 中執行的建構版本數字 ID。
持續部署
Azure Pipelines 已可自動建構程式碼並為每個修訂版本發佈 Docker 映像檔。因此,您現在可以專注在部署上。
與其他持續整合系統不同,Azure Pipelines 會區分建構和部署作業,並提供一組標示為「發布管理」的專用工具,用於處理所有部署相關工作。
Azure Pipelines Release Management 是根據下列概念建構而成:
- 發行版本是指構成特定應用程式版本的構件組合,通常是建構程序的結果。
- 「部署」是指建立版本,並將它部署至特定環境中的過程。
- 部署作業會執行一組工作,這些工作可以分組為工作。
- 階段可讓您區隔管道,並用於協調部署至多個環境 (例如開發和測試環境)。
您設定了發布管道,每當新版本建構完成時,就會觸發管道。管道包含兩個階段:開發和製作。在每個階段,發布管道都會使用建構管道產生的 Docker 映像檔,然後將其部署至 Cloud Run。
您先前設定的建構管道會先使用建構 ID 標記每個 Docker 映像檔,再將其發布至 Artifact Registry。因此,在發布管道中,您可以使用 $BUILD_BUILDID 變數來找出要部署的正確 Docker 映像檔。
設定 Cloud Run
Cloud Run 是全代管的無伺服器環境,因此您不必佈建任何基礎架構。為確保 Cloud Run 部署作業安全無虞,您需要設定 IAM。
如下圖所示,部署及執行 Cloud Run 服務會涉及多個身分。
每個身分都以服務帳戶的形式實作,並用於特定用途,如下表所述。
| 服務帳戶 | 使用對象 | Purpose | 必要角色 |
|---|---|---|---|
| Azure Pipelines Publisher | 建構管道 | 將 Docker 映像檔發布至 Artifact Registry | roles/artifactregistry.writer (僅限正式專案) |
| Azure Pipelines Deployer | 發布管道 | 啟動 Cloud Run 部署作業 | roles/run.admin |
| 啟動 CloudDemo 服務 | roles/iam.serviceAccountUser |
||
| Cloud Run 服務代理 | Cloud Run | 從 Artifact Registry 提取 Docker 映像檔 | roles/artifactregistry.reader (僅限正式專案) |
| CloudDemo 執行者 (執行階段服務帳戶) | CloudDemo 服務 | 存取 Cloud de Confiance上的資源 | 無 |
您已建立並設定 Azure Pipelines Publisher 服務帳戶。在接下來的章節中,您將建立及設定其餘服務帳戶。
設定 Cloud Run 服務帳戶
開啟 Cloud Shell。
初始化下列環境變數:
DEV_PROJECT_ID=DEV_PROJECT_ID PROD_PROJECT_ID=PROD_PROJECT_ID
更改下列內容:
DEV_PROJECT_ID:開發專案的專案 IDPROD_PROJECT_ID:生產專案的專案 ID
在開發和產品專案中啟用 Cloud Run 和 Compute Engine API:
gcloud services enable run.googleapis.com --project=$DEV_PROJECT_ID gcloud services enable run.googleapis.com --project=$PROD_PROJECT_ID啟用這些 API 後,系統會在專案中建立 Cloud Run 服務代理程式帳戶。
在儲存 Docker 映像檔的正式版專案中,授予兩個 Cloud Run 服務代理帳戶 Artifact Registry 的存取權:
DEV_PROJECT_NUMBER=$(gcloud projects describe $DEV_PROJECT_ID \ --format='value(projectNumber)') PROD_PROJECT_NUMBER=$(gcloud projects describe $PROD_PROJECT_ID \ --format='value(projectNumber)') gcloud projects add-iam-policy-binding $PROD_PROJECT_ID \ --member=serviceAccount:service-$DEV_PROJECT_NUMBER@serverless-robot-prod.s3ns-system.iam.gserviceaccount.com \ --role roles/artifactregistry.reader gcloud projects add-iam-policy-binding $PROD_PROJECT_ID \ --member=serviceAccount:service-$PROD_PROJECT_NUMBER@serverless-robot-prod.s3ns-system.iam.gserviceaccount.com \ --role roles/artifactregistry.reader
設定 CloudDemo 執行者帳戶
現在可以設定 CloudDemo 執行器帳戶,這是 CloudDemo 服務的自訂執行階段服務帳戶:
建立名為
CloudDemo-runner的服務帳戶:gcloud iam service-accounts create clouddemo-runner \ --display-name="CloudDemo Runner" \ --project=$DEV_PROJECT_ID gcloud iam service-accounts create clouddemo-runner \ --display-name="CloudDemo Runner" \ --project=$PROD_PROJECT_ID DEV_CLOUDDEMO_RUNNER=clouddemo-runner@$DEV_PROJECT_ID.s3ns.iam.gserviceaccount.com PROD_CLOUDDEMO_RUNNER=clouddemo-runner@$PROD_PROJECT_ID.s3ns.iam.gserviceaccount.com
設定 Azure Pipelines 部署者帳戶
最後,建立及設定 Azure Pipelines 部署者帳戶,Azure 發布管道會使用這個帳戶部署至 Cloud Run。
建立名為
azure-pipelines-deployer的服務帳戶:gcloud iam service-accounts create azure-pipelines-deployer \ --display-name="Azure Pipelines Deployer" \ --project=$PROD_PROJECT_ID AZURE_PIPELINES_DEPLOYER=azure-pipelines-deployer@$PROD_PROJECT_ID.s3ns.iam.gserviceaccount.com指派必要的 IAM 角色,在開發專案中部署新的 Cloud Run 服務或修訂版本:
gcloud projects add-iam-policy-binding $DEV_PROJECT_ID \ --member serviceAccount:$AZURE_PIPELINES_DEPLOYER \ --role roles/run.admin gcloud iam service-accounts add-iam-policy-binding \ $DEV_CLOUDDEMO_RUNNER \ --member=serviceAccount:$AZURE_PIPELINES_DEPLOYER \ --role="roles/iam.serviceAccountUser" \ --project=$DEV_PROJECT_ID為正式版專案指派相同的角色組合:
gcloud projects add-iam-policy-binding $PROD_PROJECT_ID \ --member serviceAccount:$AZURE_PIPELINES_DEPLOYER \ --role roles/run.admin gcloud iam service-accounts add-iam-policy-binding \ $PROD_CLOUDDEMO_RUNNER \ --member=serviceAccount:$AZURE_PIPELINES_DEPLOYER \ --role="roles/iam.serviceAccountUser" \ --project=$PROD_PROJECT_ID產生服務帳戶金鑰:
gcloud iam service-accounts keys create azure-pipelines-deployer.json \ --iam-account=$AZURE_PIPELINES_DEPLOYER \ --project=$PROD_PROJECT_ID cat azure-pipelines-deployer.json | base64 -w 0設定發布管道時,您會使用這項指令的輸出內容。
設定發布管道
現在您可以返回 Azure Pipelines 自動部署,包括下列步驟:
- 部署至開發環境。
- 在啟動部署至正式環境之前,要求人工核准。
- 部署至正式環境。
建立發布定義
首先,建立發行定義:
- 在 Azure DevOps 選單中,依序選取「Pipelines」>「Releases」。
- 按一下 [New pipeline]。
- 從範本清單中選取 [Empty job]。
- 系統提示您輸入階段名稱時,請輸入
Development。 - 在畫面頂端為管道命名
CloudDemo。 - 在管道圖的 [Artifacts] 旁,按一下 [Add]。
- 選取「建構」,然後新增下列設定:
- 來源類型:建構
- 來源 (建構管道):選取建構定義 (應該只有一個選項)
- Default version:Latest
- 來源別名:
build
- 按一下「新增」。
- 在「構件」方塊中,按一下「持續部署觸發條件」 (閃電圖示),新增部署觸發條件。
- 在「持續部署觸發條件」下方,將切換鈕設為「已啟用」。
- 按一下 [儲存]。
視需要輸入註解,然後按一下 [OK] 確認。
管道會顯示類似以下的內容。
部署至開發專案
建立發布定義後,您現在可以為開發專案設定 Cloud Run 部署作業。
- 在選單中切換至「工作」分頁。
- 按一下 [Agent job]。
- 將「代理程式規格」設為「ubuntu-22.04」。
- 在「代理工作」旁邊,按一下「將工作新增至代理工作」 ,即可在階段中新增步驟。
- 選取「指令列」工作,然後按一下「新增」。
按一下新增的工作,然後進行下列設定:
- 顯示名稱:
Deploy image to development project 腳本:
gcloud auth activate-service-account \ --quiet \ --key-file <(echo $(ServiceAccountKey) | base64 -d) && \ gcloud run deploy clouddemo \ --quiet \ --service-account=clouddemo-runner@$(CloudRun.ProjectId.Development).s3ns.iam.gserviceaccount.com \ --allow-unauthenticated \ --image=$(CloudRun.Region)-docker.pkg.dev/$(ContainerRegistry.ProjectId)/docker/clouddemo:$BUILD_BUILDID \ --platform=managed \ --region=$(CloudRun.Region) \ --project=$(CloudRun.ProjectId.Development)這項指令會從環境變數取得服務帳戶金鑰,然後使用 gcloud CLI 將應用程式部署至 Cloud Run。Azure Pipelines 代理程式預設提供 gcloud CLI。
- 顯示名稱:
切換至「變數」分頁,並新增下列變數。
名稱 值 密鑰 ServiceAccountKey已為先前建立的服務帳戶金鑰。 azure-pipelines-deployer是 ContainerRegistry.ProjectId實際工作環境專案的專案 ID。 CloudRun.Region您先前選取的區域,用於部署 Artifact Registry 資源。 CloudRun.ProjectId.Development開發專案的專案 ID。 CloudRun.ProjectId.Production實際工作環境專案的專案 ID。 按一下 [儲存]。
視需要輸入註解,然後按一下 [OK] 確認。
部署至正式叢集
最後,將部署項目設定為正式版專案:
- 在選單中,切換至「Pipeline」分頁標籤。
- 在「階段」方塊中,依序選取「新增」 >「新階段」。
- 從範本清單中選取 [Empty job]。
- 系統提示您輸入階段名稱時,請輸入
Production。 - 按一下新建立階段的閃電圖示。
進行下列設定:
- 選取觸發條件:After stage
- 階段:開發
- 「Pre-deployment approvals」(部署前核准):(啟用)
- 核准者:選取您的使用者名稱。
管道會顯示類似下方的檢視畫面。
切換至「Tasks」分頁標籤。
將滑鼠游標懸停在「工作」分頁標籤上,然後依序選取「工作」 >「製作」。
按一下 [Agent job]。
將「代理程式規格」設為「ubuntu-22.04」。
按一下「將工作新增至代理程式工作」 ,即可在階段中新增步驟。
選取「Command line」工作,然後按一下「Add」。
按一下新增的工作,然後進行下列設定:
- 顯示名稱:
Deploy image to production project 腳本:
gcloud auth activate-service-account \ --quiet \ --key-file <(echo $(ServiceAccountKey) | base64 -d) && \ gcloud run deploy clouddemo \ --quiet \ --service-account=clouddemo-runner@$(CloudRun.ProjectId.Production).s3ns.iam.gserviceaccount.com \ --allow-unauthenticated \ --image=$(CloudRun.Region)-docker.pkg.dev/$(ContainerRegistry.ProjectId)/docker/clouddemo:$BUILD_BUILDID \ --platform=managed \ --region=$(CloudRun.Region) \ --project=$(CloudRun.ProjectId.Production)
- 顯示名稱:
按一下 [儲存]。
視需要輸入註解,然後按一下 [OK] 確認。
執行管道
您已設定整個管道,現在可以變更原始碼來測試管道:
- 在您的本機電腦上,開啟先前複製的 Git 存放區中的檔案
applications\clouddemo\netcore\CloudDemo.MvcCore\Views\Home\Index.cshtml。 - 將
ViewBag.Title的值從Home Page變更為Home Page Cloud Run。 提交變更,然後推送至 Azure Pipelines。
Visual Studio
- 開啟 Team Explorer,然後按一下「首頁」圖示。
- 按一下 [Changes] (變更)。
- 輸入修訂訊息,例如
Change site title。 - 按一下 [Commit All and Push] (全部認可並推送)。
指令列
暫存所有已修改的檔案:
git add -A將變更提交至本機存放區:
git commit -m "Change site title"將變更推送至 Azure Pipelines:
git push
在 Azure DevOps 選單中,選取「Pipelines」。系統會觸發建構作業。
建構完成後,依序選取「Pipelines」 >「Releases」。啟動發布程序。
按一下「Release-1」開啟詳細資料頁面,並等待「Development」階段的狀態切換為「Succeeded」。
在 Cloud de Confiance 控制台中,切換至開發專案。
在選單中,依序選取「Compute」 >「Cloud Run」。
「clouddemo」服務已成功部署。
按一下「clouddemo」即可查看更多詳細資料。
系統會顯示網址,指出 Cloud Run 已佈建服務。
在新瀏覽器分頁開啟網址,確認 CloudDemo 應用程式已部署並使用自訂標題。
在 Azure Pipelines 中,按一下「Production」(正式環境) 階段旁的「Approve」(核准),將部署作業升級至正式環境。
(選用) 輸入註解。
按一下「核准」確認,並等待「正式」環境的狀態切換為「成功」。
在 Cloud de Confiance 控制台中,切換至實際工作環境專案。
在選單中,依序選取「Compute」 >「Cloud Run」。
clouddemo 服務已部署至正式環境專案。
按一下「clouddemo」即可查看更多詳細資料。
系統會顯示網址,表示 Cloud Run 已佈建服務。
在新瀏覽器分頁中開啟網址,確認 CloudDemo 應用程式已部署至正式環境,且使用自訂標題。
清除所用資源
為避免在本教學課程完成後產生額外費用,請刪除您建立的實體。
刪除 Azure Pipelines 專案
如要刪除 Azure Pipelines 專案,請參閱 Azure DevOps Services 說明文件。刪除 Azure Pipelines 專案會導致所有原始碼變更遺失。
刪除 Cloud de Confiance 開發和正式環境專案
- 前往 Cloud de Confiance 控制台的「Manage resources」(管理資源) 頁面。
- 在專案清單中選取要刪除的專案,然後點選「Delete」(刪除)。
- 在對話方塊中輸入專案 ID,然後按一下 [Shut down] (關閉) 以刪除專案。
後續步驟
- 為 Cloud Run 服務設定自訂網域。
- 瞭解如何使用 Azure Pipelines將相同應用程式部署至 Google Kubernetes Engine。
- 進一步瞭解如何在 Cloud de Confiance上部署 .NET 應用程式。
- 探索 Google Cloud 的參考架構、圖表和最佳做法。歡迎瀏覽我們的 Cloud Architecture Center。