你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure DevOps Services | Azure DevOps Server 2022
本文介绍如何使用 Azure Pipelines 自动生成、测试和将 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 框架 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 项目 ”和“ Zip 已发布项目 ”复选框,然后选择“ 添加”。
- 任务将显示在 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 部署进行部署时,AzureRmWebAppDeployment 任务中会出现此错误,但代理未运行 Windows。 验证 YAML vmImage 参数是否指定 Windows。
pool:
vmImage: windows-latest
为什么禁用基本身份验证时 Web 部署不起作用?
有关使用 Azure 应用服务部署 任务的Microsoft Entra ID 身份验证的故障排除信息,请参阅 我无法使用 Windows 代理中的 Microsoft Entra ID 身份验证 Web 部署到 Azure 应用服务。