練習 - 將 Bicep 部署工作新增至管線

已完成

您已建立基本管線,並將 Azure 和 Azure Pipelines 環境設為彼此連線。 現在您已準備好將網站的 Bicep 檔案從管線部署到 Azure。

在本練習中,您將會:

  • 將 Bicep 檔案新增至您的存放庫。
  • 新增管線步驟以部署 Bicep 檔案。
  • 再次執行您的管線,並確認管線已成功部署您的網站。

將網站的 Bicep 檔案新增至 Git 存放庫

您已備妥網站的 Bicep 檔案。 其可用來根據環境和設定部署不同的網站資源設定。 在這裡,您會將 Bicep 檔案新增至存放庫。

  1. 開啟 Visual Studio Code 檔案總管。

  2. deploy 資料夾中,建立名為 main.bicep 的新檔案。 請務必在 deploy 資料夾內建立檔案,而不是在存放庫的根目錄中:

    Visual Studio Code 檔案總管的螢幕擷取畫面,其中的 deploy 資料夾中已反白顯示 main.bicep 檔案。

  3. 將下列程式碼複製到 main.bicep 檔案中:

    @description('The Azure region into which the resources should be deployed.')
    param location string = resourceGroup().location
    
    @description('The type of environment. This must be nonprod or prod.')
    @allowed([
      'nonprod'
      'prod'
    ])
    param environmentType string
    
    @description('Indicates whether to deploy the storage account for toy manuals.')
    param deployToyManualsStorageAccount bool
    
    @description('A unique suffix to add to resource names that need to be globally unique.')
    @maxLength(13)
    param resourceNameSuffix string = uniqueString(resourceGroup().id)
    
    var appServiceAppName = 'toy-website-${resourceNameSuffix}'
    var appServicePlanName = 'toy-website-plan'
    var toyManualsStorageAccountName = 'toyweb${resourceNameSuffix}'
    
    // Define the SKUs for each component based on the environment type.
    var environmentConfigurationMap = {
      nonprod: {
        appServicePlan: {
          sku: {
            name: 'F1'
            capacity: 1
          }
        }
        toyManualsStorageAccount: {
          sku: {
            name: 'Standard_LRS'
          }
        }
      }
      prod: {
        appServicePlan: {
          sku: {
            name: 'S1'
            capacity: 2
          }
        }
        toyManualsStorageAccount: {
          sku: {
            name: 'Standard_ZRS'
          }
        }
      }
    }
    
    var toyManualsStorageAccountConnectionString = deployToyManualsStorageAccount ? 'DefaultEndpointsProtocol=https;AccountName=${toyManualsStorageAccount.name};EndpointSuffix=${environment().suffixes.storage};AccountKey=${toyManualsStorageAccount.listKeys().keys[0].value}' : ''
    
    resource appServicePlan 'Microsoft.Web/serverfarms@2022-03-01' = {
      name: appServicePlanName
      location: location
      sku: environmentConfigurationMap[environmentType].appServicePlan.sku
    }
    
    resource appServiceApp 'Microsoft.Web/sites@2022-03-01' = {
      name: appServiceAppName
      location: location
      properties: {
        serverFarmId: appServicePlan.id
        httpsOnly: true
        siteConfig: {
          appSettings: [
            {
              name: 'ToyManualsStorageAccountConnectionString'
              value: toyManualsStorageAccountConnectionString
            }
          ]
        }
      }
    }
    
    resource toyManualsStorageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = if (deployToyManualsStorageAccount) {
      name: toyManualsStorageAccountName
      location: location
      kind: 'StorageV2'
      sku: environmentConfigurationMap[environmentType].toyManualsStorageAccount.sku
    }
    
  4. 儲存對檔案所做的變更。

  5. 在 Visual Studio Code 終端機中,執行此命令來暫存變更、認可變更,並將變更推送至存放庫:

    git add deploy/main.bicep
    git commit -m 'Add Bicep file'
    git push
    

取代管線步驟

接下來,您將更新管線定義,以使用服務連線將 Bicep 檔案部署至 Azure。

  1. 在 Visual Studio Code 中,開啟 deploy/azure-pipelines.yml 檔案。

  2. jobs: 行之前,新增 variables: 以定義名為 deploymentDefaultLocation 的變數:

    trigger: none
    
    pool:
      vmImage: ubuntu-latest
    
    variables:
    - name: deploymentDefaultLocation
      value: westus3
    
    jobs:
    
  3. 若要移除管線定義中的 script 步驟,請刪除檔案的底部兩行。

    提示

    當您使用 Visual Studio Code 並已安裝 Azure Pipelines 延伸模組時,請嘗試使用 Ctrl+Space 按鍵組合。 其會在目前游標位置顯示內容功能表與建議新增的元素。

  4. 在檔案底部,新增使用 AzureResourceManagerTemplateDeployment 工作以部署您 Bicep 檔案的工作:

    jobs:
    - job:
      steps:
    
      - task: AzureResourceManagerTemplateDeployment@3
        inputs:
          connectedServiceName: $(ServiceConnectionName)
          deploymentName: $(Build.BuildNumber)
          location: $(deploymentDefaultLocation)
          resourceGroupName: $(ResourceGroupName)
          csmFile: deploy/main.bicep
          overrideParameters: >
            -environmentType $(EnvironmentType)
            -deployToyManualsStorageAccount $(DeployToyManualsStorageAccount)
    

    注意

    建議自行輸入此程式碼,而不要從此課程模組的程式碼複製貼上。 請留意檔案的縮排。 如果縮排不正確,您的 YAML 檔案即無效。 Visual Studio Code 會顯示波浪線以指出錯誤。

    此步驟會使用系統變數 $(Build.BuildNumber) 來命名部署。 此變數可協助您輕鬆地查看部署對應的管線執行狀況。

    AzureResourceManagerTemplateDeployment 工作需要 location 工作屬性。 其會指定要在其中建立資源群組的 Azure 區域。 在此練習中,您已建立資源群組,因此您在這裡指定的位置並不重要。 但您還是需要提供值。 在這裡,您會將其設定為您在上一個步驟中設定的 deploymentDefaultLocation 變數值。

  5. 儲存對檔案所做的變更。 您的檔案看起來應該像下列範例:

    trigger: none
    
    pool:
      vmImage: ubuntu-latest
    
    variables:
    - name: deploymentDefaultLocation
      value: westus3
    
    jobs:
    - job:
      steps:
    
      - task: AzureResourceManagerTemplateDeployment@3
        inputs:
          connectedServiceName: $(ServiceConnectionName)
          deploymentName: $(Build.BuildNumber)
          location: $(deploymentDefaultLocation)
          resourceGroupName: $(ResourceGroupName)
          csmFile: deploy/main.bicep
          overrideParameters: >
            -environmentType $(EnvironmentType)
            -deployToyManualsStorageAccount $(DeployToyManualsStorageAccount)
    
  6. 在 Visual Studio Code 終端機中,暫存變更、將變更認可至存放庫,並將其推送至 Azure Repos:

    git add deploy/azure-pipelines.yml
    git commit -m 'Add deployment task to pipeline'
    git push
    

新增管線變數

  1. 在您的瀏覽器中,選取 [管線]

    Azure DevOps 的螢幕擷取畫面顯示功能表,其中顯示已醒目提示 [管線] 的功能表。

  2. 選取您的管線。

    Azure DevOps 的螢幕擷取畫面,其中顯示已醒目提示玩具網站管線的管線清單。

  3. 選取編輯

    Azure DevOps 的螢幕擷取畫面,其中顯示已醒目提示 [編輯] 的管線。

  4. 選取變數

    Azure DevOps 的螢幕擷取畫面,其中顯示已醒目提示 [變數] 按鈕的管線編輯器。

  5. 選取 [新增變數]

    Azure DevOps 的螢幕擷取畫面,其中顯示已醒目提示 [新增變數] 按鈕的管線變數編輯器。

  6. 在 [名稱] 中,輸入 ServiceConnectionName。 在 [值] 中,輸入 ToyWebsite

    將核取方塊保留為清除狀態,然後選取 [確定]

    Azure DevOps 的螢幕擷取畫面,其中顯示已醒目提示 [確定] 按鈕的管線變數編輯器。

  7. 若要建立更多變數,請選取 [+]。

    Azure DevOps 的螢幕擷取畫面,其中顯示已醒目提示 [+] 按鈕的管線變數清單。

    利用您之前建立 ServiceConnectionName 變數的相同方式來建立下列變數:

    變數名稱
    ResourceGroupName ToyWebsite
    EnvironmentType nonprod
  8. 再次完成相關步驟,建立名為 DeployToyManualsStorageAccount 的變數,並將值設為 true。 針對此變數,請選取 [讓使用者在執行此管線時覆寫此值] 核取方塊。

    Azure DevOps 的螢幕擷取畫面,其中顯示管線變數編輯器。

  9. 建立好這四個變數之後,請選取 [儲存]

    Azure DevOps 的螢幕擷取畫面,其中顯示已醒目提示 [儲存] 按鈕管線的變數編輯器。

執行您的管線

您現在可以隨時執行管線!

您的範本包含一個儲存體帳戶,您的網站團隊會使用此帳戶儲存玩具說明書。 由於您仍在測試環境,因此並不需要在每次部署網站時部署儲存體帳戶。 為此,您建立 Bicep 參數來控制是否要部署儲存體帳戶。 在這裡,您會執行管線並覆寫部署,確保部署不在這時候部署儲存體帳戶。

  1. 選取執行

    顯示管線,並醒目提示 [執行] 按鈕的 Azure DevOps 螢幕擷取畫面。

    執行管線窗格隨即出現。 您可以在此窗格中設定此特定管線執行的設定。

  2. 選取變數

    顯示 [執行管線] 頁面,且醒目提示 [變數] 功能表項目的 Azure DevOps 螢幕擷取畫面。

  3. 選取 DeployToyManualsStorageAccount 變數,並將其值變更為 false。 然後選取 [更新]

    顯示 [執行管線] 變數編輯器,並醒目提示 [更新] 按鈕的 Azure DevOps 螢幕擷取畫面。

  4. 選取上一頁箭號。

    顯示 [執行管線] 頁面,並醒目提示上一步箭頭的 Azure DevOps 螢幕擷取畫面。

  5. 選取 [執行] 啟動新的管線執行。 啟動這個管線可能需要幾分鐘。 管線啟動之後,部署可能需要幾分鐘才能完成。

  6. 若要開啟作業,請在 [作業] 區段中選取 [作業]。 您可以監視正在執行的作業,或等到作業完成後再檢閱其歷程記錄。

    請等候作業完成。

  7. 選取 [工作]

    顯示作業頁面,並醒目提示 [作業] 功能表項目的 Azure DevOps 螢幕擷取畫面。

  8. 選取 [1 queue time variable used] (已使用 1 個佇列時間變數)

    顯示管線記錄,並醒目提示「已使用 1 個佇列時間變數」項目的 Azure DevOps 螢幕擷取畫面。

    隨即顯示此管線執行的覆寫值。 因為您覆寫了原始值,所以 DeployToyManualsStorageAccount 變數的值為 false

  9. 檢查管線輸出的其餘部分。

    管線顯示部署成功。

檢查部署

  1. 前往 Azure 入口網站

  2. 在左側功能表中,選取 [資源群組]

  3. 選取 [ToyWebsite]

  4. 在 [概觀] 中檢視部署狀態。 您會看到一個部署成功。

    Azure 入口網站的螢幕擷取畫面,顯示具有一個成功部署的資源群組。

  5. 選取 [1 成功] 以查看部署的詳細資料。

    Azure 入口網站的螢幕擷取畫面,顯示資源群組部署記錄並醒目提示部署。

    部署名稱與管線執行名稱相同。

  6. 若要查看所部署的資源,請選取部署。 若要展開部署以查看更多詳細資料,請選取 [部署詳細資料]。 本例中會看到 Azure App Service 方案與應用程式。

    Azure 入口網站的螢幕擷取畫面,顯示資源群組部署詳細資料,並反白顯示 App Service 資源。