练习 - 将 Bicep 部署任务添加到管道

已完成

你已创建一个基本管道,并且已将 Azure 和 Azure Pipelines 环境配置为连接。 现在,已可以将网站的 Bicep 文件从管道部署到 Azure。

通过学习本练习,你将能够:

  • 将 Bicep 文件添加到存储库。
  • 添加管道步骤以部署 Bicep 文件。
  • 再次运行管道并验证其是否成功部署了网站。

将网站的 Bicep 文件添加到 Git 存储库

你已准备好网站的 Bicep 文件。 现在可以使用 Bicep 文件根据环境和配置来部署不同的网站资源配置。 此处将 Bicep 文件添加到存储库。

  1. 打开 Visual Studio Code 资源管理器。

  2. 在部署文件夹中,创建一个名为 main.bicep 的新文件。 确保在 deploy 文件夹中而不是在存储库的根目录下创建文件:

    Visual Studio Code 资源管理器的屏幕截图,其中突出显示了 main.bicep 文件(位于 deploy 文件夹中)。

  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) 来命名部署。 变量可以帮助你轻松查看与部署相对应的管道运行。

    location 任务属性对于 AzureResourceManagerTemplateDeployment 任务是必需的。 该属性指定了应在其中创建资源组的 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 的屏幕截图,其中显示了管道列表,并突出显示了 toy-website 管道。

  3. 选择“编辑”。

    Azure DevOps 的屏幕截图,其中显示了管道,并突出显示了“编辑”。

  4. 选择“变量”。

    Azure DevOps 的屏幕截图,其中显示了管道编辑器,并突出显示了“变量”按钮。

  5. 选择“New variable”。

    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 个队列时间变量”。

    Azure DevOps 的屏幕截图,其中显示了管道日志,并突出显示了“使用了 1 个队列时间变量”项。

    将显示此管道运行的重写值。 DeployToyManualsStorageAccount 变量的值为 false,因为会重写原始值。

  9. 检查管道输出的其余部分。

    管道显示成功的部署。

验证部署

  1. 转到 Azure 门户

  2. 在左侧菜单中,选择“资源组”

  3. 选择“ToyWebsite”。

  4. 在“概述”中,查看部署状态。 你会看到一个成功的部署。

    Azure 门户的屏幕截图,其中显示了一个成功部署的资源组。

  5. 选择“1 个已成功”以查看部署的详细信息。

    Azure 门户的屏幕截图,其中显示了资源组部署历史记录,并突出显示了部署。

    部署名称与管道运行名称相同。

  6. 若要查看已部署的资源,请选择部署。 若要展开部署以查看更多详细信息,请选择“部署详细信息”。 在这种情况下,有一个应用服务计划和一个应用。

    Azure 门户的屏幕截图,其中显示了资源组部署详细信息,并突出显示了应用服务资源。