使用 Azure Pipelines 和 Compute Engine 建立持續整合/持續推送軟體更新管道

本教學課程說明如何使用 Azure Pipelines 和 Compute Engine,為 ASP.NET MVC 網頁應用程式建立持續整合/持續部署 (CI/CD) 管道。應用程式使用 Microsoft Internet Information Services,並在 Windows Server 上執行。

CI/CD 管道會使用兩個獨立環境,一個用於測試,另一個用於實際工作環境。

在管道的開頭,開發人員會將變更提交至範例程式碼集。這項動作會觸發管道建構應用程式、將其封裝為 ZIP 檔案,並將 ZIP 檔案上傳至 Cloud Storage。

系統會接著使用滾動式更新,將套件自動發布至開發環境。測試完成後,發布管理員即可升級版本,將其部署至正式環境。

本教學課程適用於開發人員和 DevOps 工程師。本文假設您具備 .NET Framework、Windows Server、IIS、Azure Pipelines 和 Compute Engine 的基本知識。此外,您也必須具備 Azure DevOps 帳戶的管理員存取權,才能完成本教學課程。

目標

  • 使用 Compute Engine 代管執行個體群組,實作輪轉部署。
  • 在 Azure Pipelines 中設定 CI/CD 管道來自動化調度管理建構、建立及部署程序。

費用

在本文件中,您會使用下列 Cloud de Confiance by S3NS的計費元件:

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

請參閱 Azure DevOps 定價頁面,瞭解使用 Azure DevOps 可能產生的費用。

事前準備

我們通常建議使用不同的專案來處理開發環境工作負載與實際工作環境工作負載,這樣就能分別授予身分與存取權管理 (IAM) 角色與權限。為簡化教學課程,本課程會使用單一專案做為開發和正式環境。

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

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

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

    前往專案選取器

  2. 如果尚未啟用,請啟用 Compute Engine 和 Cloud Storage API。

    啟用 API 時所需的角色

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

    啟用 API

  3. 確認專案已啟用計費功能 Cloud de Confiance 。

  4. 請確認您擁有 Azure DevOps 帳戶,並具備管理員存取權。 如果還沒有 Azure DevOps 帳戶,請前往 Azure DevOps 首頁註冊。

建立 Azure DevOps 專案

您使用 Azure DevOps 管理原始碼、執行建構和測試,並協調部署至 Compute Engine 的作業。首先,請在 Azure DevOps 帳戶中建立專案。

  1. 前往 Azure DevOps 首頁 (https://dev.azure.com/YOUR_AZURE_DEVOPS_ACCOUNT_NAME)。
  2. 按一下「New Project」。
  3. 輸入專案名稱,例如 CloudDemo。
  4. 將「Visibility」設為 [Private],然後按一下 [Create]。
  5. 建立專案後,請在左側選單中按一下「Repos」。
  6. 按一下「Import」(匯入),從 GitHub 建立 dotnet-docs-samples 存放區分支,然後設定下列值:
    • 存放區類型:Git
    • 複製網址:https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git
  7. 按一下「匯入」。

    匯入程序完成後,您會看到 dotnet-docs-samples 存放區的原始碼。

  8. 在選單中,依序點選「Repos」>「Branches」。

  9. 將滑鼠游標懸停在 main 分支版本上。右側會顯示 ... 按鈕。

  10. 依序點選「...」> 設為預設分支版本。

持續建構

您現在可以使用 Azure Pipelines 設定建構管道。每當有提交內容推送至 Git 存放區,Azure Pipelines 就會建構程式碼、將程式碼封裝成 ZIP 檔案,並將產生的套件發布至 Azure Pipelines 內部儲存空間。

稍後,您會設定發布管道,從 Azure Pipelines 儲存空間使用套件,並將其部署至 Compute Engine。

建立建構定義

在 Azure Pipelines 中建立使用 YAML 語法的新建構定義:

  1. 使用 Visual Studio 或指令列 git 用戶端複製新的 Git 存放區。
  2. 在存放區的根目錄中,建立名為 azure-pipelines.yml 的檔案。
  3. 複製下列程式碼並貼到檔案中:

    resources:
    - repo: self
      fetchDepth: 1
    trigger:
    - main
    variables:
      artifactName: 'CloudDemo.Mvc'
    jobs:
    - job: Build
      displayName: Build application
      condition: succeeded()
      pool:
        vmImage: windows-latest
        demands:
        - msbuild
        - visualstudio
      variables:
        Solution: 'applications/clouddemo/net4/CloudDemo.Mvc.sln'
        BuildPlatform: 'Any CPU'
        BuildConfiguration: 'Release'
        ArtifactName: 'CloudDemo.Web'
      steps:
      - task: NuGetCommand@2
        displayName: 'NuGet restore'
        inputs:
          restoreSolution: '$(Solution)'
      - task: VSBuild@1
        displayName: 'Build solution'
        inputs:
          solution: '$(Solution)'
          msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactstagingdirectory)\\"'
          platform: '$(BuildPlatform)'
          configuration: '$(BuildConfiguration)'
      - task: PublishBuildArtifacts@1
        displayName: 'Publish Artifact'
        inputs:
          PathtoPublish: '$(build.artifactstagingdirectory)/CloudDemo.Mvc.zip'
          ArtifactName: '$(ArtifactName)'
  4. 提交變更並推送至 Azure Pipelines。

    Visual Studio

    1. 開啟 Team Explorer,然後按一下「首頁」圖示。
    2. 按一下 [Changes] (變更)。
    3. 輸入修訂訊息,例如 Add pipeline definition。
    4. 按一下 [Commit All and Push] (全部認可並推送)。

    指令列

    1. 暫存所有已修改的檔案:

      git add -A
      
    2. 將變更提交至本機存放區:

      git commit -m "Add pipeline definition"
      
    3. 將變更推送至 Azure DevOps:

      git push
      
  5. 在 Azure DevOps 選單中,選取「Pipelines」,然後按一下「Create Pipeline」。

  6. 選取「Azure Repos Git」。

  7. 選取存放區。

  8. 在「Review your pipeline YAML」(檢查管道 YAML) 頁面,按一下「Run」(執行)。

    系統會觸發新的建構程序。建構作業大約需要 2 分鐘才能完成。建構完成後,應用程式套件 CloudDemo.Mvc.zip (內含網頁應用程式的所有檔案) 會儲存在 Azure Pipelines 內部構件儲存空間。

持續部署

現在 Azure Pipelines 會在每次提交時自動建構程式碼,因此您可以將注意力轉向部署作業。

與其他持續整合系統不同,Azure Pipelines 會區分建構和部署作業,並提供一組標示為「發布管理」的專用工具,用於處理所有部署相關工作。

Azure Pipelines Release Management 是根據下列概念建構而成:

  • 發行版本是指構成特定應用程式版本的構件組合,通常是建構程序的結果。
  • 「部署」是指建立版本,並將它部署至特定環境中的過程。
  • 部署作業會執行一組工作,這些工作可以分組為工作。
  • 階段可讓您區隔管道,並用於協調部署至多個環境 (例如開發和測試環境)。

您設定發布管道,在完成新版本建構時觸發。這個管線包含三個階段:

  1. 在第一階段,管道會從 Azure Pipelines 構件儲存區取得應用程式套件,並發布至 Cloud Storage bucket,讓 Compute Engine 能夠存取該套件。
  2. 在第二階段,管道會使用滾動式更新,更新開發環境。
  3. 在最後階段,管道會在獲得核准後,使用滾動式更新更新正式環境。

建立 Cloud Storage bucket 來存放建構構件

建立 Cloud Storage bucket,用於儲存應用程式套件。 稍後,您會設定 Compute Engine,讓新的 VM 執行個體可以自動從這個值區提取應用程式套件。

  1. 在 Cloud de Confiance 控制台,切換至新建立的專案。
  2. 開啟 Cloud Shell。

    前往 Cloud Shell

  3. 為節省時間,請設定專案 ID 和 Compute Engine 區域的預設值:

    gcloud config set project PROJECT_ID
    gcloud config set compute/zone ZONE

    將 PROJECT_ID 換成您的 Cloud de Confiance 專案 ID,並將 ZONE 換成您將用於建立資源的區域名稱。如果您不確定要選哪個區域,請使用 us-central1-a。

    範例:

    gcloud config set project devops-test-project-12345
    gcloud config set compute/zone us-central1-a
  4. 為應用程式套件建立新的 Cloud Storage bucket:

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

    如果不想保留所有建構版本的應用程式套件,建議設定物件生命週期規則,刪除超過特定時間的檔案。

設定 Azure Pipelines 的服務帳戶

建立 Azure Pipelines 可用來存取 Cloud de Confiance 專案的Cloud de Confiance 服務帳戶。

  1. 為 Azure Pipelines 建立服務帳戶:

    AZURE_PIPELINES_SERVICE_ACCOUNT=$(gcloud iam service-accounts create azure-pipelines --format "value(email)")
    
  2. 將「Storage 物件檢視者」(roles/storage.objectViewer) 和「Storage 物件建立者」(roles/storage.objectCreator) IAM 角色授予 azure-pipelines 服務帳戶,讓 Azure Pipelines 能將應用程式套件上傳至 Cloud Storage:

    gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \
        --member serviceAccount:$AZURE_PIPELINES_SERVICE_ACCOUNT \
        --role roles/storage.objectViewer
    gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \
        --member serviceAccount:$AZURE_PIPELINES_SERVICE_ACCOUNT \
        --role roles/storage.objectCreator
    
  3. 將 Compute 管理員 (roles/compute.admin) 角色授予 azure-pipelines 服務帳戶,讓 Azure Pipelines 可以管理 VM 執行個體:

    gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \
        --member serviceAccount:$AZURE_PIPELINES_SERVICE_ACCOUNT \
        --role roles/compute.admin
    
  4. 產生服務帳戶金鑰:

    gcloud iam service-accounts keys create azure-pipelines-key.json \
      --iam-account=$AZURE_PIPELINES_SERVICE_ACCOUNT
    
    cat azure-pipelines-key.json | base64 -w 0;echo
    
    rm azure-pipelines-key.json
    

    您會在後續步驟中用到服務帳戶金鑰。

設定開發環境

在您可以使用 Azure Pipelines 設定自動化部署的步驟之前,必須先準備開發環境。準備工作包括建立代管執行個體群組,這個群組將會管理網路伺服器 VM 執行個體。此外,也包括建立 HTTP 負載平衡器。

  1. 在 Cloud Shell 中,為代管執行個體群組建立服務帳戶:

    DEV_SERVICE_ACCOUNT=$(gcloud iam service-accounts create clouddemo-dev --format "value(email)")
    
  2. 將Storage 物件檢視者 IAM 角色 (roles/storage.objectViewer) 授予服務帳戶,讓 VM 執行個體可以從 Cloud Storage 下載應用程式套件:

    gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \
        --member serviceAccount:$DEV_SERVICE_ACCOUNT \
        --role roles/storage.objectViewer
    
  3. 授予 azure-pipelines 服務帳戶使用 clouddemo-dev 服務帳戶的權限:

    gcloud iam service-accounts add-iam-policy-binding $DEV_SERVICE_ACCOUNT \
        --member serviceAccount:$AZURE_PIPELINES_SERVICE_ACCOUNT \
        --role roles/iam.serviceAccountUser
    
  4. 建立使用標準 Windows Server 2019 Core 映像檔的執行個體範本。您只會在最初使用這個範本,因為每次建構都會產生新範本。

    gcloud compute instance-templates create clouddemo-initial \
        --machine-type n1-standard-2 \
        --image-family windows-2019-core \
        --image-project windows-cloud \
        --service-account $DEV_SERVICE_ACCOUNT \
        --scopes https://www.googleapis.com/auth/devstorage.read_only \
        --tags gclb-backend
    
  5. 建立 HTTP 健康狀態檢查。由於應用程式沒有專用的健康狀態檢查端點,因此您可以查詢路徑 /。

    gcloud compute http-health-checks create clouddemo-dev-http \
        --check-interval=10s --unhealthy-threshold=10 \
        --request-path=/
    
  6. 使用初始執行個體範本建立代管執行個體群組。為求簡化,下列指令會建立區域代管執行個體群組。不過,您可以對區域代管執行個體群組採用相同做法,將 VM 執行個體分配到多個可用區。

    gcloud compute instance-groups managed create clouddemo-dev \
        --template=clouddemo-initial \
        --http-health-check=clouddemo-dev-http \
        --initial-delay=2m \
        --size=1 && \
    gcloud compute instance-groups set-named-ports clouddemo-dev --named-ports http:80
    
  7. 建立負載平衡器後端服務,來使用 HTTP 健康狀態檢查和之前建立的代管執行個體群組:

    gcloud compute backend-services create clouddemo-dev-backend \
        --http-health-checks clouddemo-dev-http \
        --port-name http --protocol HTTP --global && \
    gcloud compute backend-services add-backend clouddemo-dev-backend \
        --instance-group clouddemo-dev --global \
        --instance-group-zone=$(gcloud config get-value compute/zone)
    
  8. 建立負載平衡器前端:

    gcloud compute url-maps create clouddemo-dev --default-service clouddemo-dev-backend && \
    gcloud compute target-http-proxies create clouddemo-dev-proxy --url-map=clouddemo-dev && \
    gcloud compute forwarding-rules create clouddemo-dev-fw-rule --global --target-http-proxy clouddemo-dev-proxy --ports=80
    
  9. 建立防火牆規則,允許 Google 負載平衡器將 HTTP 要求傳送至加註 gclb-backend 標記的執行個體。稍後,您會將這個標記套用至網路服務 VM 執行個體。

    gcloud compute firewall-rules create gclb-backend --source-ranges=130.211.0.0/22,35.191.0.0/16 --target-tags=gclb-backend --allow tcp:80
    

設定正式環境

設定正式環境時,需要執行與設定開發環境類似的一連串步驟。

  1. 在 Cloud Shell 中建立 HTTP 健康狀態檢查:

    gcloud compute http-health-checks create clouddemo-prod-http \
        --check-interval=10s --unhealthy-threshold=10 \
        --request-path=/
    
  2. 使用之前建立的初始執行個體範本建立另一個代管執行個體群組:

    gcloud compute instance-groups managed create clouddemo-prod \
        --template=clouddemo-initial \
        --http-health-check=clouddemo-prod-http \
        --initial-delay=2m \
        --size=1 && \
    gcloud compute instance-groups set-named-ports clouddemo-prod --named-ports http:80
    
  3. 建立負載平衡器後端服務,來使用 HTTP 健康狀態檢查和之前建立的代管執行個體群組:

    gcloud compute backend-services create clouddemo-prod-backend --http-health-checks clouddemo-prod-http --port-name http --protocol HTTP --global && \
    gcloud compute backend-services add-backend clouddemo-prod-backend --instance-group clouddemo-prod --global --instance-group-zone=$(gcloud config get-value compute/zone)
    
  4. 建立負載平衡器前端:

    gcloud compute url-maps create clouddemo-prod --default-service clouddemo-prod-backend && \
    gcloud compute target-http-proxies create clouddemo-prod-proxy --url-map=clouddemo-prod && \
    gcloud compute forwarding-rules create clouddemo-prod-fw-rule --global --target-http-proxy clouddemo-prod-proxy --ports=80
    

設定發布管道

建立新的發布定義:

  1. 在 Azure DevOps 選單中,選取「Pipelines」>「Releases」。
  2. 按一下 [New pipeline]。
  3. 從範本清單中選取 [Empty job]。
  4. 系統提示您輸入階段名稱時,請輸入 Publish。
  5. 在畫面頂端為發行內容命名 clouddemo-ComputeEngine。
  6. 在管道圖的 [Artifacts] 旁,按一下 [Add]。
  7. 選取 [Build],並新增下列設定:

    • 來源:選取含有 azure-pipelines.yml 檔案的 Git 存放區。
    • 預設版本:Latest
    • 來源別名:CloudDemo.Web
  8. 按一下「新增」。

  9. 按一下「Artifact」(成品) 方塊中的「Continuous deployment trigger」(持續部署觸發條件) (閃電圖示),即可新增部署觸發條件。

  10. 在「持續部署觸發條件」下方,將切換鈕設為「已啟用」。

  11. 按一下 [儲存]。

  12. 視需要輸入註解,然後按一下 [OK] 確認。

管道現在看起來會像這樣:

Azure Pipelines 中的管道螢幕截圖

發布至 Cloud Storage

建立發布定義後,即可新增步驟,將應用程式套件發布至 Cloud Storage。

  1. 在 Azure Pipelines 中,切換至「Tasks」(工作) 分頁。
  2. 按一下「Agent job」(代理程式工作),然後設定下列項目:
    • 代理程式集區:Azure Pipelines
    • 代理程式規格:ubuntu-latest
  3. 在「Agent job」旁,按一下「Add a task to agent job」(將工作新增至代理工作) 圖示 。
  4. 選取 bash 工作,然後按一下「新增」。
  5. 按一下新增的工作,然後進行下列設定:

    • 顯示名稱:Publish to Cloud Storage
    • 類型:inline
    • 腳本:

      cat << "EOF" > CloudDemo.Mvc.deploy.ps1
          $ErrorActionPreference = "Stop"
      
          # Download application package from Cloud Storage
          gcloud storage cp gs://$(CloudDemo.ProjectId)-artifacts/CloudDemo.Mvc-$(Build.BuildId)-$(Release.ReleaseId).zip $env:TEMP\app.zip
      
          # Install IIS
          Enable-WindowsOptionalFeature -Online -FeatureName `
              NetFx4Extended-ASPNET45, `
              IIS-WebServerRole, `
              IIS-WebServer, `
              IIS-CommonHttpFeatures, `
              IIS-HttpErrors, `
              IIS-HttpRedirect, `
              IIS-ApplicationDevelopment, `
              IIS-HealthAndDiagnostics, `
              IIS-HttpLogging, `
              IIS-LoggingLibraries, `
              IIS-RequestMonitor, `
              IIS-HttpTracing, `
              IIS-Security, `
              IIS-RequestFiltering, `
              IIS-Performance, `
              IIS-WebServerManagementTools, `
              IIS-IIS6ManagementCompatibility, `
              IIS-Metabase, `
              IIS-DefaultDocument, `
              IIS-ApplicationInit, `
              IIS-NetFxExtensibility45, `
              IIS-ISAPIExtensions, `
              IIS-ISAPIFilter, `
              IIS-ASPNET45, `
              IIS-HttpCompressionStatic
      
          # Extract application package to wwwroot
          New-Item -ItemType directory -Path $env:TEMP\app
          Add-Type -AssemblyName System.IO.Compression.FileSystem
          [System.IO.Compression.ZipFile]::ExtractToDirectory("$env:TEMP\app.zip", "$env:TEMP\app")
          Remove-Item $env:TEMP\app.zip
          Move-Item -Path $(dir -recurse $env:TEMP\app\**\PackageTmp | % { $_.FullName }) -Destination c:\inetpub\wwwroot\app -force
      
          # Configure IIS web application pool and application
          Import-Module WebAdministration
          New-WebAppPool clouddemo-net4
          Set-ItemProperty IIS:\AppPools\clouddemo-net4 managedRuntimeVersion v4.0
          New-WebApplication -Name clouddemo -Site 'Default Web Site' -PhysicalPath c:\inetpub\wwwroot\app -ApplicationPool clouddemo-net4
      
          # Grant read/execute access to the application pool user
          &icacls C:\inetpub\wwwroot\app\ /grant "IIS AppPool\clouddemo-net4:(OI)(CI)(RX)"
      EOF
      
      gcloud auth activate-service-account \
          --quiet \
          --key-file <(echo $(ServiceAccountKey) | base64 -d)
      
      gcloud storage cp $(System.ArtifactsDirectory)/CloudDemo.Web/CloudDemo.Web/CloudDemo.Mvc.zip gs://$(CloudDemo.ProjectId)-artifacts/CloudDemo.Mvc-$(Build.BuildId)-$(Release.ReleaseId).zip
      gcloud storage cp CloudDemo.Mvc.deploy.ps1 gs://$(CloudDemo.ProjectId)-artifacts/CloudDemo.Mvc-$(Build.BuildId)-$(Release.ReleaseId).deploy.ps1
      

    這段指令碼會執行下列動作:

    1. 產生設定 IIS 的開機指令碼。
    2. 設定 Google Cloud CLI,使用環境變數中的服務帳戶金鑰向 Cloud de Confiance進行驗證。
    3. 將應用程式套件和開機指令碼上傳至 Cloud Storage。
  6. 切換至「變數」分頁,並新增下列變數。

    名稱 值 密鑰
    ServiceAccountKey 先前建立的服務帳戶金鑰。azure-pipelines-deployer 是
    CloudDemo.ProjectId 專案的專案 ID。 Cloud de Confiance
    CloudDemo.Zone 您先前執行 gcloud config set compute/zone 時指定的可用區 (例如 us-central1-a)
  7. 按一下 [儲存]。

  8. 視需要輸入註解,然後按一下 [OK] 確認。

部署開發環境

您現在可以新增步驟,在開發環境中啟動輪流部署作業。

  1. 在 Azure Pipelines 中,切換至「Pipeline」(管線) 分頁。
  2. 在「階段」方塊中,依序選取「新增」>「新階段」。
  3. 從範本清單中選取 [Empty job]。
  4. 系統提示您輸入階段名稱時,請輸入 Dev。
  5. 按一下新建立階段的閃電圖示。
  6. 進行下列設定:

    • 選取觸發條件:After stage
    • 階段:Publish
  7. 將滑鼠游標懸停在「Tasks」分頁標籤上,然後依序點選「Tasks」>「Dev」。

  8. 按一下「代理程式工作」,然後設定下列項目:

    • 代理程式集區:Azure Pipelines
    • 代理程式規格:ubuntu-latest
  9. 在「Agent job」旁,按一下「Add a task to agent job」(將工作新增至代理工作) 圖示 。

  10. 選取 bash 工作,然後按一下「新增」。

  11. 按一下新增的工作,然後進行下列設定:

    • 顯示名稱:Rolling deploy
    • 類型:inline
    • 腳本:

      INSTANCE_TEMPLATE=clouddemo-$(Build.BuildId)-$(Release.ReleaseId)
      
      gcloud auth activate-service-account \
          --quiet \
          --key-file <(echo $(ServiceAccountKey) | base64 -d)
      
      gcloud compute instance-templates create $INSTANCE_TEMPLATE \
        --machine-type n1-standard-2 \
        --image-family windows-2019-core \
        --image-project windows-cloud \
        --service-account clouddemo-dev@$(CloudDemo.ProjectId).s3ns.iam.gserviceaccount.com \
        --scopes https://www.googleapis.com/auth/devstorage.read_only \
        --tags gclb-backend \
        --metadata sysprep-specialize-script-url=gs://$(CloudDemo.ProjectId)-artifacts/CloudDemo.Mvc-$(Build.BuildId)-$(Release.ReleaseId).deploy.ps1 \
        --project $(CloudDemo.ProjectId) \
      
      gcloud compute instance-groups managed set-instance-template clouddemo-dev \
        --template $INSTANCE_TEMPLATE \
        --project $(CloudDemo.ProjectId) \
        --zone $(CloudDemo.Zone)
      
      gcloud compute instance-groups managed rolling-action start-update clouddemo-dev \
        --version template=$INSTANCE_TEMPLATE \
        --type proactive \
        --max-unavailable 0 \
        --project $(CloudDemo.ProjectId) \
        --zone $(CloudDemo.Zone)
      

    這段指令碼會執行下列動作:

    1. 設定 Google Cloud CLI,使用環境變數中的服務帳戶金鑰向 Cloud de Confiance進行驗證。
    2. 建立新的執行個體範本,使用上一個階段產生的開機指令碼。
    3. 更新現有執行個體群組,以使用新的執行個體範本。請注意,這個指令不會更換或更新任何現有的 VM,而是會確保這個執行個體群組中的任何後續 VM 都會根據新範本來建立。
    4. 啟動滾動式更新,導致現有執行個體群組以滾動方式,將現有 VM 替換為新的 VM。
  12. 按一下 [儲存]。

  13. 視需要輸入註解,然後按一下 [OK] 確認。

部署正式環境

最後,您需要設定部署至正式環境。

  1. 在 Azure Pipelines 中,切換至「Pipeline」(管線) 分頁。
  2. 在「階段」方塊中,依序選取「新增」>「新階段」。
  3. 從範本清單中選取 [Empty job]。
  4. 系統提示您輸入階段名稱時,請輸入 Prod。
  5. 按一下新建立階段的閃電圖示。
  6. 進行下列設定:

    • 選取觸發條件:After stage
    • 階段:Dev
    • 「Pre-deployment approvals」(部署前核准):(啟用)
    • 「Approvers」(核准者):選取您自己的使用者名稱。
  7. 將滑鼠游標懸停在「Tasks」分頁標籤上,然後依序點選「Tasks」>「Prod」。

  8. 按一下「代理程式工作」,然後設定下列項目:

    • 代理程式集區:Azure Pipelines
    • 代理程式規格:ubuntu-latest
  9. 在「代理工作」旁邊,按一下「為代理工作新增工作」 ,即可在階段中新增步驟。

  10. 選取 bash 工作,然後按一下「新增」。

  11. 按一下新增的工作,然後進行下列設定:

    • 顯示名稱:Rolling deploy
    • 類型:inline
    • 腳本:

      INSTANCE_TEMPLATE=clouddemo-$(Build.BuildId)-$(Release.ReleaseId)
      
      gcloud auth activate-service-account \
          --quiet \
          --key-file <(echo $(ServiceAccountKey) | base64 -d)
      
      gcloud compute instance-templates create $INSTANCE_TEMPLATE \
        --machine-type n1-standard-2 \
        --image-family windows-2019-core \
        --image-project windows-cloud \
        --service-account clouddemo-prod@$(CloudDemo.ProjectId).s3ns.iam.gserviceaccount.com \
        --scopes https://www.googleapis.com/auth/devstorage.read_only \
        --tags gclb-backend \
        --metadata sysprep-specialize-script-url=gs://$(CloudDemo.ProjectId)-artifacts/CloudDemo.Mvc-$(Build.BuildId)-$(Release.ReleaseId).deploy.ps1 \
        --project $(CloudDemo.ProjectId) \
      
      gcloud compute instance-groups managed set-instance-template clouddemo-prod \
        --template $INSTANCE_TEMPLATE \
        --project $(CloudDemo.ProjectId) \
        --zone $(CloudDemo.Zone)
      
      gcloud compute instance-groups managed rolling-action start-update clouddemo-prod \
        --version template=$INSTANCE_TEMPLATE \
        --type proactive \
        --max-unavailable 0 \
        --project $(CloudDemo.ProjectId) \
        --zone $(CloudDemo.Zone)
      
  12. 按一下 [儲存]。

  13. 視需要輸入註解,然後按一下 [OK] 確認。

執行管道

您已設定整個管道,現在可以變更原始碼來測試管道:

  1. 在本機電腦上,開啟先前複製的 Git 存放區中的檔案 applications\clouddemo\net4\CloudDemo.Mvc\Views\Home\Index.cshtml。
  2. 將 ViewBag.Title 的值從 Home Page 變更為 This app runs on GKE。
  3. 提交變更,然後推送至 Azure Pipelines。

    Visual Studio

    1. 開啟 Team Explorer,然後按一下「首頁」圖示。
    2. 按一下 [Changes] (變更)。
    3. 輸入修訂訊息,例如 Change site title。
    4. 按一下 [Commit All and Push] (全部認可並推送)。

    指令列

    1. 暫存所有已修改的檔案:

      git add -A
      
    2. 將變更提交至本機存放區:

      git commit -m "Change site title"
      
    3. 將變更推送至 Azure Pipelines:

      git push
      
  4. 在 Azure DevOps 選單中,選取「Pipelines」。

    系統會觸發建構作業。

  5. 建構完成後,依序選取「Pipelines」「Releases」。啟動發布程序。

  6. 按一下「Release-1」開啟詳細資料頁面,並等候「Dev」階段的狀態切換為「Succeeded」。

  7. 在 Cloud de Confiance 控制台中,依序選取「網路服務」>「負載平衡」>「clouddemo-dev」。

    記下前端的 IP 位址。

  8. 開啟新的瀏覽器視窗,然後前往下列網址:

    http://IP_ADDRESS/clouddemo/
    

    其中 IP_ADDRESS 是前端的 IP 位址。

    請注意,應用程式已部署,且正在使用自訂標題。

    您一開始可能會看到錯誤,因為負載平衡器需要幾分鐘的時間才能變為可用。

  9. 在 Azure Pipelines 中,按一下「Prod」階段下方的「Approve」按鈕,將部署作業升級至正式環境。

    如果畫面上沒有按鈕,您可能需要先核准或拒絕先前的發行版本。

  10. 視需要輸入註解,然後按一下 [Approve] 確認。

  11. 等待「Prod」環境的狀態切換為「Succeeded」。

  12. 在 Cloud de Confiance 控制台,依序選取「網路服務」>「負載平衡」>「clouddemo-prod」。

    記下前端的 IP 位址。

  13. 開啟新的瀏覽器視窗,然後前往下列網址:

    http://IP_ADDRESS/clouddemo/
    

    其中 IP_ADDRESS 是前端的 IP 位址。

    請注意,應用程式已部署,且正在使用自訂標題。

清除所用資源

為避免在本教學課程完成後產生額外費用,請刪除您建立的實體。

刪除 Azure Pipelines 專案

如要刪除 Azure Pipelines 專案,請參閱 Azure DevOps Services 說明文件。刪除 Azure Pipelines 專案會導致所有原始碼變更遺失。

刪除 Cloud de Confiance 開發和正式環境專案

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

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

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

後續步驟