Azure DevOps Services

开始使用 Azure 资源管理器模板(ARM 模板) 通过 MySQL 部署 Linux Web 应用。 ARM 模板提供了一种在代码中保存配置的方法。 使用 ARM 模板是基础结构即代码方法的一个示例,并且是良好的 DevOps 做法。

ARM 模板 是定义项目基础结构和配置的 JavaScript 对象表示法 (JSON) 文件。 模板使用声明性语法。 在声明性语法中,你可以在不编写创建部署的编程命令序列的情况下,描述预期部署。

可以使用 JSON 或 Bicep 语法 部署 Azure 资源。 详细了解模板的 JSON 和 Bicep 之间的差异

开始前,需要具备:

  • 具有活动订阅的 Azure 帐户。 免费创建帐户
  • 一个有效的 Azure DevOps 组织。 注册 Azure Pipelines
  • (对于 Bicep 部署)一个现有的资源组。 使用 Azure 门户 Azure CLI Azure PowerShell 创建一个资源组。
  • 创建 GitHub 上此存储库的分支:

    https://github.com/Azure/azure-quickstart-templates/tree/master/quickstarts/microsoft.web/webapp-linux-managed-mysql
    
  • 映射机密变量 $(adminPass),使其在 Azure 资源组部署任务中可用。 在 YAML 文件的顶部,将 $(adminPass) 映射到 $(ARM_PASS)

    variables:
      ARM_PASS: $(adminPass)
    trigger:
    - none
    pool:
      vmImage: 'ubuntu-latest'
    
  • 将“复制文件”任务添加到 YAML 文件。 你将使用 101-webapp-linux-managed-mysql 项目。 有关详细信息,请参阅使用 Azure Database for MySQL 在 Linux 上生成 Web 应用存储库。

    variables:
      ARM_PASS: $(adminPass)
    trigger:
    - none
    pool:
      vmImage: 'ubuntu-latest'
    steps:
    - task: CopyFiles@2
      inputs:
        SourceFolder: 'quickstarts/microsoft.web/webapp-linux-managed-mysql/'
        Contents: '**'
        TargetFolder: '$(Build.ArtifactStagingDirectory)'
    
  • 添加并配置“Azure 资源组部署”任务。

    该任务引用你使用“复制文件”任务生成的工件和管道变量。 在配置任务时已设置这些值。

  • 部署范围(deploymentScope):将部署范围设置为 Resource Group。 可将部署目标设定为管理组、Azure 订阅或资源组。
  • Azure 资源管理器连接(azureResourceManagerConnection):选择你的 Azure 资源管理器服务连接。 若要配置新的服务连接,请从列表中选择 Azure 订阅,然后单击“授权”。 有关更多详细信息,请参阅连接到 Microsoft Azure
  • 订阅(subscriptionId):选择应部署到的订阅。
  • 操作(action):设置为 Create or update resource group 以创建新资源组或更新现有资源组。
  • 资源组:设置为 ARMPipelinesLAMP-rg 以命名新资源组。 如果这是现有的资源组,则会更新它。
  • 位置(location):部署资源组的位置。 设置为最近的位置(例如“美国西部”)。 如果订阅中已存在资源组,则会忽略此值。
  • 模板位置(templateLocation):设置为 Linked artifact。 这是模板和参数文件的位置。
  • 模板(csmFile):设置为 $(Build.ArtifactStagingDirectory)/azuredeploy.json。 这是 ARM 模板的路径。
  • 模板参数(csmParametersFile):设置为 $(Build.ArtifactStagingDirectory)/azuredeploy.parameters.json。 这是 ARM 模板的参数文件的路径。
  • 替代模板参数(overrideParameters):设置为 -siteName $(siteName) -administratorLogin $(adminUser) -administratorLoginPassword $(ARM_PASS) 以使用之前创建的变量。 这些值将替换模板参数文件中设置的参数。
  • 部署模式(deploymentMode):部署资源的方式。 设置为 Incremental。 设置为 Incremental 会保留不包含在 ARM 模板中的资源,并且速度比 Complete 更快。 使用 Validate 模式可以在部署之前发现模板的问题。
  • variables:
      ARM_PASS: $(adminPass)
    trigger:
    - none
    pool:
      vmImage: 'ubuntu-latest'
    steps:
    - task: CopyFiles@2
      inputs:
        SourceFolder: 'quickstarts/microsoft.web/webapp-linux-managed-mysql/'
        Contents: '**'
        TargetFolder: '$(Build.ArtifactStagingDirectory)'
    - task: AzureResourceManagerTemplateDeployment@3
      inputs:
        deploymentScope: 'Resource Group'
        azureResourceManagerConnection: '<your-resource-manager-connection>'
        subscriptionId: '<your-subscription-id>'
        action: 'Create Or Update Resource Group'
        resourceGroupName: 'ARMPipelinesLAMP-rg'
        location: '<your-closest-location>'
        templateLocation: 'Linked artifact'
        csmFile: '$(Build.ArtifactStagingDirectory)/azuredeploy.json'
        csmParametersFile: '$(Build.ArtifactStagingDirectory)/azuredeploy.parameters.json'
        overrideParameters: '-siteName $(siteName) -administratorLogin $(adminUser) -administratorLoginPassword $(ARM_PASS)'
        deploymentMode: 'Incremental'
    
  • 单击“保存并运行”以部署模板。 管道作业随即会启动,在几分钟后,根据你的代理,作业状态应指示 Success

  • 创建三个变量:siteNameadministratorLoginadministratorLoginPasswordadministratorLoginPassword 需是机密变量。

  • 选择“变量”。
  • 使用 + 符号添加三个变量。 创建 adminPass 时,请选择“将此值保密”。
  • 完成后,单击“保存”。
  • 在 YAML 文件的顶部,映射 locationresourceGroupName 的值。 你的位置应是资源组的位置。 资源组需要事先存在。

    variables:
      vmImageName: 'ubuntu-latest'
      resourceGroupName: '<resource-group-name>' # Needs to already exist
      location: '<your-closest-location>'
      templateFile: './main.bicep'
      sourceFolder: 'quickstarts/microsoft.web/webapp-linux-managed-mysql/'
    
  • 如果你没有 Azure 资源管理器服务连接,请创建一个服务连接。 详细了解如何连接到 Azure

  • 服务连接与 resourceGroupName 位于同一资源组中。
  • 添加 Azure CLI 任务以使用 Bicep 进行部署。 该任务使用 az deployment group create Azure CLI 命令。 请将 administratorLoginadministratorLoginPassword 参数值作为变量传递。

  • 将“Azure 资源管理器连接”设置为你的服务连接。
  • “脚本类型”为“Shell”。
  • “脚本位置”为“内联脚本”。
  • variables:
      vmImageName: 'ubuntu-latest'
      resourceGroupName: '<resource-group-name>' # Needs to already exist
      location: '<your-closest-location>'
      templateFile: './main.bicep'
      sourceFolder: 'quickstarts/microsoft.web/webapp-linux-managed-mysql/'
    trigger:
    - none
    pool:
      vmImage: $(vmImageName)
    name: Bicep deploy template
    steps:
    - task: AzureCLI@2
      inputs:
        azureSubscription: '<service-connection-name>'
        scriptType: bash
        scriptLocation: inlineScript
        inlineScript: |
          az deployment group create --resource-group $(resourceGroupName) --template-file $(sourceFolder)$(templateFile) \
          --parameters administratorLogin=$(administratorLogin) administratorLoginPassword=$(administratorLoginPassword)
    

    还可以使用 Azure CLI 来验证资源。

    az resource list --resource-group ARMPipelinesLAMP-rg --output table
    
  • 转到新站点。 如果已将 siteName 设置为 armpipelinetestsite,则该站点位于 https://armpipelinetestsite.azurewebsites.net/

    还可以使用 Azure CLI 来验证资源。

    az resource list --resource-group <resource-group-name> --output table
    
  • 转到新站点。 如果已将 siteName 设置为 armpipelinetestsite,则该站点位于 https://armpipelinetestsite.azurewebsites.net/

    还可以使用 ARM 模板来删除资源。 将“Azure 资源组部署”任务中的 action 值更改为 DeleteRG。 还可以删除 templateLocationcsmFilecsmParametersFileoverrideParametersdeploymentMode 的输入。

    variables:
      ARM_PASS: $(adminPass)
    trigger:
    - none
    pool:
      vmImage: 'ubuntu-latest'
    steps:
    - task: CopyFiles@2
      inputs:
        SourceFolder: 'quickstarts/microsoft.web/webapp-linux-managed-mysql/'
        Contents: '**'
        TargetFolder: '$(Build.ArtifactStagingDirectory)'
    - task: AzureResourceManagerTemplateDeployment@3
      inputs:
        deploymentScope: 'Resource Group'
        azureResourceManagerConnection: '<your-resource-manager-connection>'
        subscriptionId: '<your-subscription-id>'
        action: 'DeleteRG'
        resourceGroupName: 'ARMPipelinesLAMP-rg'
        location: ''<your-closest-location>'
    
  •