你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure DevOps Services | Azure DevOps Server 2022
本文介绍如何使用 Azure Pipelines 自动生成、测试 Web 应用和将 Web 应用部署到 Azure 应用服务。 可以设置持续集成和持续交付 (CI/CD) 管道,每当你将代码更改签入存储库的指定分支时,该管道都会运行。
管道由阶段、作业和步骤组成。 步骤是管道的最小构建基块,可以是脚本或任务(即预打包的脚本)。 有关构成管道的关键概念和组件的详细信息,请参阅关键 Azure Pipelines 概念。
可以使用管道中的 Azure Web 应用任务部署到应用服务。 对于更复杂的应用场景(例如在部署中使用 XML 参数),可以使用 Azure 应用服务部署任务。
先决条件
一个有效的 Azure 应用服务应用,其代码托管在 GitHub 或 Azure Repos 上。 可以使用以下任何快速入门文章来创建示例应用:
- ASP.NET Core:在 Azure 中创建 ASP.NET Core Web 应用
 - ASP.NET:在 Azure 中创建 ASP.NET Framework Web 应用
 - JavaScript:在 Azure 应用服务中创建 Node.js Web 应用
 - Java:在 Azure 应用服务中创建 Java 应用
 - Python:在 Azure 应用服务中创建 Python 应用
 
一个 Azure DevOps 组织,能够在 Microsoft 托管的智能体上运行管道。 需要请求免费层的并行作业或购买并行作业。 有关详细信息,请参阅配置并行作业并为其付费。
在 Azure DevOps 组织中创建的项目,你有权创建和授权管道和 Azure 服务连接。 在 Azure DevOps 中创建项目。
重要
在 GitHub 过程中,系统可能会提示你创建 GitHub 服务连接或重定向到 GitHub 以登录、安装 Azure Pipelines GitHub 应用、授权 Azure Pipelines 或向 GitHub 组织进行身份验证。 按照屏幕上的说明完成必要的过程。 有关详细信息,请参阅访问 GitHub 存储库。
创建管道
本部分中的代码示例适用于 ASP.NET Core Web 应用。 可以调整适用于其他框架的说明。 有关 Azure Pipelines 生态系统支持的详细信息,请参阅 Azure Pipelines 生态系统示例。
通过在代码存储库中创建 azure-pipelines.yml YAML 文件来定义管道。
- 在 Azure DevOps 项目的左侧导航菜单中,选择“管道”。
 - 在“管道”页上,选择“新建管道”,如果此管道是项目中的第一个管道,则选择“创建管道”。
 - 在“代码位置”屏幕上,选择源代码的位置(Azure Repos Git 或 GitHub)。 如有必要,请登录到 GitHub。
 - 在“选择存储库”屏幕上,选择代码存储库。
 - 在 “配置管道 ”屏幕上,选择 “初学者管道”。
 
将 .NET Core (DotNetCoreCLI@2) 任务添加到管道,并生成和发布应用。
- 在“查看管道 YAML”屏幕上,删除行 
steps:后的所有代码。 - 选择文件的末尾,然后选择右侧的“显示助手”。
 - 在“任务”下,选择“.NET Core”。
 - 在 .NET Core 配置屏幕上的“Azure 资源管理器连接”下,选择 Azure 订阅,然后选择“授权”以创建所需的服务连接。
 - 在“命令”下,选择“发布”。
 - 确保选中“发布 Web 项目”和“压缩已发布项目”复选框,然后选择“添加”。
 - 任务将显示在 YAML 管道中。 查看 YAML 代码以查看其用途。 准备就绪后,选择“保存并运行”,然后再次选择“保存并运行”。
 - 在“生成摘要”屏幕上的“作业”下,选择“所需的权限”链接。 在“检查”屏幕上,选择“允许”,然后再次选择“允许”。 在此处授予权限允许使用为此管道的所有运行授权的服务连接。
 
管道将部署 ZIP 文件发布为 Azure 项目,以便部署任务在下一步中使用。
添加部署任务
管道成功运行后,添加部署任务。
- 在管道运行“摘要”屏幕上,选择右上角的“更多操作”图标,然后选择“编辑管道”。
 - 选择 YAML 文件的末尾,如果未显示“任务”列表,则选择“显示助手”。
 - 在“任务”列表中,搜索并选择 Azure Web 应用任务。 或者,可以使用 Azure 应用服务部署任务。
 - 在 Azure Web 应用配置屏幕上的“Azure 订阅”下,选择为上一步设置的相同服务连接。 无需重新授权此连接。
 - 对于“应用类型”,请选择“Linux 上的 Azure Web 应用”或“Windows 上的 Azure Web 应用”,具体取决于代码。
 - 对于“应用名称”,请选择或输入应用服务应用名称。
 - 选择 并添加。
 - 选择“验证并保存”,然后选择“保存”。
 - 选择“运行”,然后选择“再次运行”。
 
完整的 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 应用服务部署任务可以处理更多自定义应用场景,例如:
- 使用 Web 部署进行部署,如果通常使用 Internet Information Services (IIS) 部署过程的话。
 - 部署到虚拟应用程序。
 - 部署到其他应用类型,例如容器应用、函数应用、WebJobs 或 API 和移动应用。
 
注意
单独的文件转换任务还支持在 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 应用服务。