你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 Azure Pipelines 将应用程序部署到 Azure 应用服务

Azure DevOps Services | Azure DevOps Server 2022

本文介绍如何使用 Azure Pipelines 自动生成、测试 Web 应用和将 Web 应用部署到 Azure 应用服务。 可以设置持续集成和持续交付 (CI/CD) 管道,每当你将代码更改签入存储库的指定分支时,该管道都会运行。

管道由阶段、作业和步骤组成。 步骤是管道的最小构建基块,可以是脚本或任务(即预打包的脚本)。 有关构成管道的关键概念和组件的详细信息,请参阅关键 Azure Pipelines 概念

可以使用管道中的 Azure Web 应用任务部署到应用服务。 对于更复杂的应用场景(例如在部署中使用 XML 参数),可以使用 Azure 应用服务部署任务。

先决条件

重要

在 GitHub 过程中,系统可能会提示你创建 GitHub 服务连接或重定向到 GitHub 以登录、安装 Azure Pipelines GitHub 应用、授权 Azure Pipelines 或向 GitHub 组织进行身份验证。 按照屏幕上的说明完成必要的过程。 有关详细信息,请参阅访问 GitHub 存储库

创建管道

本部分中的代码示例适用于 ASP.NET Core Web 应用。 可以调整适用于其他框架的说明。 有关 Azure Pipelines 生态系统支持的详细信息,请参阅 Azure Pipelines 生态系统示例

通过在代码存储库中创建 azure-pipelines.yml YAML 文件来定义管道

  1. 在 Azure DevOps 项目的左侧导航菜单中,选择“管道”
  2. 在“管道”页上,选择“新建管道”,如果此管道是项目中的第一个管道,则选择“创建管道”
  3. 在“代码位置”屏幕上,选择源代码的位置(Azure Repos Git 或 GitHub)。 如有必要,请登录到 GitHub。
  4. 在“选择存储库”屏幕上,选择代码存储库
  5. “配置管道 ”屏幕上,选择 “初学者管道”。

.NET Core (DotNetCoreCLI@2) 任务添加到管道,并生成和发布应用。

  1. 在“查看管道 YAML”屏幕上,删除行 steps: 后的所有代码
  2. 选择文件的末尾,然后选择右侧的“显示助手”
  3. 在“任务”下,选择“.NET Core”
  4. 在 .NET Core 配置屏幕上的“Azure 资源管理器连接”下,选择 Azure 订阅,然后选择“授权”以创建所需的服务连接
  5. 在“命令”下,选择“发布”
  6. 确保选中“发布 Web 项目”和“压缩已发布项目”复选框,然后选择“添加”
  7. 任务将显示在 YAML 管道中。 查看 YAML 代码以查看其用途。 准备就绪后,选择“保存并运行”,然后再次选择“保存并运行”
  8. 在“生成摘要”屏幕上的“作业”下,选择“所需的权限”链接。 在“检查”屏幕上,选择“允许”,然后再次选择“允许”。 在此处授予权限允许使用为此管道的所有运行授权的服务连接。

管道将部署 ZIP 文件发布为 Azure 项目,以便部署任务在下一步中使用。

添加部署任务

管道成功运行后,添加部署任务。

  1. 在管道运行“摘要”屏幕上,选择右上角的“更多操作”图标,然后选择“编辑管道”
  2. 选择 YAML 文件的末尾,如果未显示“任务”列表,则选择“显示助手”
  3. 在“任务”列表中,搜索并选择 Azure Web 应用任务。 或者,可以使用 Azure 应用服务部署任务。
  4. 在 Azure Web 应用配置屏幕上的“Azure 订阅”下,选择为上一步设置的相同服务连接。 无需重新授权此连接。
  5. 对于“应用类型”,请选择“Linux 上的 Azure Web 应用”或“Windows 上的 Azure Web 应用”,具体取决于代码
  6. 对于“应用名称”,请选择或输入应用服务应用名称
  7. 选择 并添加
  8. 选择“验证并保存”,然后选择“保存”
  9. 选择“运行”,然后选择“再次运行”

完整的 YAML 管道应类似于以下代码:

trigger:
- <branch-specification>

pool:
  vmImage: <agent-specification>

steps:
- task: DotNetCoreCLI@2
  inputs:
    azureSubscription: '<your-authorized-service-connection>'
    command: 'publish'
    publishWebProjects: true

- task: AzureWebApp@1
  inputs:
    azureSubscription: '<your-authorized-service-connection>'
    appType: 'webApp'
    appName: '<your-app-name>'
    package: '$(System.DefaultWorkingDirectory)/**/*.zip'
    deploymentMethod: 'auto'  
  • azureSubscription:与 Azure 订阅的授权服务连接的名称。
  • appName:现有应用的名称。
  • package:包含应用服务内容的包或文件夹的文件路径。 支持通配符。

例子

以下部分讨论如何创建不同类型的生成和发布管道。

部署到虚拟应用程序

Azure Web 应用任务部署到 Azure Web 应用中的根应用程序。 可以使用 Azure 应用服务部署任务的 VirtualApplication 属性部署到特定虚拟应用程序。

- task: AzureRmWebAppDeployment@5
  inputs:
    VirtualApplication: '<name of virtual application>'

VirtualApplication 是 Azure 门户中配置的虚拟应用程序的名称。 有关详细信息,请参阅在 Azure 门户中配置应用服务应用

部署到槽

以下示例演示如何部署到过渡槽,然后交换到生产槽:

- task: AzureWebApp@1
  inputs:
    azureSubscription: '<service-connection-name>'
    appType: webAppLinux
    appName: '<app-name>'
    deployToSlotOrASE: true
    resourceGroupName: '<name of resource group>'
    slotName: staging
    package: '$(Build.ArtifactStagingDirectory)/**/*.zip'

- task: AzureAppServiceManage@0
  inputs:
    azureSubscription: '<service-connection-name>'
    WebAppName: '<app-name>'
    ResourceGroupName: '<name of resource group>'
    SourceSlot: staging
    SwapWithProduction: true
  • azureSubscription:Azure 服务连接。
  • appType:可选应用类型,例如 webAppLinux 部署到 Linux 上的 Web 应用。
  • appName:现有应用的名称。
  • deployToSlotOrASE:Boolean。 是部署到现有部署槽位还是应用服务环境。
  • resourceGroupName:要部署到的资源组的名称(如果 deployToSlotOrASE 为 true 则是必需的)。
  • slotName:要部署到的槽的名称(如果 deployToSlotOrASE 为 true 则是必需的)。 默认为 production
  • package:包含应用内容的包或文件夹的文件路径。 支持通配符。
  • SourceSlot:当 SwapWithProduction 为 true 时发送到生产环节的槽。
  • SwapWithProduction:Boolean。 是否将源槽的流量与生产交换。

部署到多个 Web 应用

可以使用 YAML 文件中的作业来设置部署管道。 使用作业可以控制部署到多个 Web 应用时所遵循的顺序。

jobs:
- job: buildandtest
  pool:
    vmImage: ubuntu-latest
 
  steps:
  # publish an artifact called drop
  - task: PublishPipelineArtifact@1
    inputs:
      targetPath: '$(Build.ArtifactStagingDirectory)' 
      artifactName: drop
  
  # deploy to Azure Web App staging
  - task: AzureWebApp@1
    inputs:
      azureSubscription: '<service-connection-name>'
      appType: <app type>
      appName: '<staging-app-name>'
      deployToSlotOrASE: true
      resourceGroupName: <group-name>
      slotName: 'staging'
      package: '$(Build.ArtifactStagingDirectory)/**/*.zip'

- job: deploy
  dependsOn: buildandtest
  condition: succeeded()

  pool: 
    vmImage: ubuntu-latest
  
  steps:
    # download the artifact drop from the previous job
  - task: DownloadPipelineArtifact@2
    inputs:
      source: 'current'
      artifact: 'drop'
      path: '$(Pipeline.Workspace)'

  - task: AzureWebApp@1
    inputs:
      azureSubscription: '<service-connection-name>'
      appType: <app type>
      appName: '<production-app-name>'
      resourceGroupName: <group-name>
      package: '$(Pipeline.Workspace)/**/*.zip'

有条件地部署

要在 YAML 中有条件地部署,请使用以下技术之一:

  • 向步骤添加条件。
  • 将部署步骤隔离到单独的作业中,并向该作业添加条件。

以下示例演示如何使用步骤条件仅部署源自主分支的成功生成:

- task: AzureWebApp@1
  condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
  inputs:
    azureSubscription: '<service-connection-name>'
    appName: '<app-name>'

有关条件的详细信息,请参阅指定条件

使用 Web 部署进行部署

Azure 应用服务部署任务可以使用 Web 部署部署到应用服务。

trigger:
- main

pool:
  vmImage: windows-latest

variables:
  buildConfiguration: 'Release'

steps:
- task: DotNetCoreCLI@2
  inputs:
    command: 'publish'
    publishWebProjects: true
    arguments: '--configuration $(buildConfiguration)'
    zipAfterPublish: true

- task: AzureRmWebAppDeployment@5
  inputs:
    ConnectionType: 'AzureRM'
    azureSubscription: '<service-connection-name>'
    appType: 'webApp'
    WebAppName: '<app-name>'
    packageForLinux: '$(System.DefaultWorkingDirectory)/**/*.zip'
    enableCustomDeployment: true
    DeploymentType: 'webDeploy'

常见问题

AzureWebApp 任务和 AzureRmWebAppDeployment 任务有什么区别?

Azure Web 应用任务是部署到 Azure Web 应用的最简单方法。 默认情况下,在 Azure Web 应用中部署根应用程序。

Azure 应用服务部署任务可以处理更多自定义应用场景,例如:

注意

单独的文件转换任务还支持在 Azure Pipelines 中使用的文件转换和变量替换。 可以使用 文件转换 任务对任何配置和参数文件应用文件转换和变量替换。

为什么收到消息“提供的应用服务包或文件夹路径无效”?

在 YAML 管道中,生成 Web 包的保存位置与部署任务查找的位置可能不匹配。 默认 AzureWebApp 任务从 $(System.DefaultWorkingDirectory)/**/*.zip 中选取用于部署的 Web 包。 如果 Web 包存放在其他位置,请修改 package 参数的值。

为什么我会收到“使用 Webdeploy 选项发布仅在使用 Windows 代理时受支持”的消息?

将任务配置为使用 Web 部署进行部署,但智能体未运行 Windows 时,AzureRmWebAppDeployment 任务中会出现此错误。 验证 YAML vmImage 参数是否指定 Windows。

pool:
  vmImage: windows-latest

为什么禁用基本身份验证时 Web 部署不起作用?

有关如何使 Microsoft Entra ID 身份验证与 Azure 应用服务部署任务配合使用的故障排除信息,请参阅无法从 Windows 代理使用 Microsoft Entra ID 身份验证将 Web 部署到 Azure 应用服务