部署 Azure Web 应用

创建 .NET 项目

如果没有要处理的 .NET 项目,请创建一个新项目,将代码上传到 GitHub 存储库或Azure Repos。 首先安装最新的 .NET 6.0 SDK。

创建新的 .NET 6 Web 应用。

dotnet new webapp -f net6.0

在同一终端会话中,使用项目目录中的 命令 dotnet run 在本地运行应用程序。

dotnet run

上载代码

Upload代码到新的 Web 应用GitHub或Azure Repos:

创建管道

  1. 登录到 Azure DevOps 组织,并导航到你的项目。

  2. 转到"Pipelines",然后选择"新建管道"。

  3. 首先选择“GitHub”作为源代码位置,完成向导的各个步骤 。

  4. 可能会重定向到 GitHub 进行登录。 如果是这样,请输入 GitHub 凭据。

  5. 显示存储库列表时,选择你的存储库。

  6. 你可能会被重定向到 GitHub 来安装 Azure Pipelines 应用。 如果是这样,请选择"批准 安装"。

  7. 当"配置"选项卡出现时,选择"ASP.NET Core"。

  8. 当新管道出现时,查看 YAML 以查看其功能。 准备就绪后,选择"保存并运行"。

添加 Azure Web 应用任务

  1. 使用任务助手添加 Azure Web 应用 任务。

    Azure Web 应用任务。

  2. 选择Azure 资源管理器"连接类型",然后选择Azure 订阅。 请确保 授权连接

  3. 选择 "Linux 上的 Web 应用 "并输入 、 和 appNamepackage 。 完整的 YAML 应如下所示。

    variables:
      buildConfiguration: 'Release'
    
    steps:
    - script: dotnet build --configuration $(buildConfiguration)
      displayName: 'dotnet build $(buildConfiguration)'
    - task: DotNetCoreCLI@2
      inputs:
        command: 'publish'
        publishWebProjects: true
    - task: AzureWebApp@1
      inputs:
        azureSubscription: '<Azure service connection>'
        appType: 'webAppLinux'
        appName: '<Name of web app>'
        package: '$(System.DefaultWorkingDirectory)/**/*.zip'
    
    • azureSubscription:你的 Azure 订阅。
    • appName:现有应用服务的名称。
    • package:包的文件路径或包含应用服务内容的文件夹。 支持通配符。

我们尚未建议新用户使用 YAML 管道从 2019 Azure DevOps Server部署。 如果你是经验丰富的管道用户,并且已有用于生成 .NET Core 应用的 YAML 管道,你可能会发现以下示例很有用。

YAML 管道在 TFS 上不可用。

现在,可以通读本主题的其余部分,了解用户为自定义 Azure Web 应用部署而进行一些更常见的更改。

使用 Azure Web 应用任务

部署到 Azure Web 应用的最简单方法就是使用 Azure Web 应用 () 任务。

部署Web 部署包 (ASP.NET)

若要将 .zip Web 部署 包 (例如,从ASP.NET Web应用) 部署到 Azure Web 应用,将以下代码片段添加到 azure-pipelines.yml 文件:

- task: AzureWebApp@1
  inputs:
    azureSubscription: '<Azure service connection>'
    appName: '<Name of web app>'
    package: $(System.DefaultWorkingDirectory)/**/*.zip    
  • azureSubscription:你的 Azure 订阅。
  • appName:现有应用服务的名称。
  • package:包的文件路径或包含应用服务内容的文件夹。 支持通配符。

代码片段假定 YAML 文件的生成步骤在代理上的 文件夹中生成 zip $(System.DefaultWorkingDirectory) 存档。

有关 Azure 服务连接的信息,请参阅 以下部分

部署 .NET 应用

如果要生成 .NET Core 应用,请使用以下裁剪将生成部署到应用。

variables:
  buildConfiguration: 'Release'

steps:
- script: dotnet build --configuration $(buildConfiguration)
  displayName: 'dotnet build $(buildConfiguration)'
- task: DotNetCoreCLI@2
  inputs:
    command: 'publish'
    publishWebProjects: true
- task: AzureWebApp@1
  inputs:
    azureSubscription: '<Azure service connection>'
    appType: 'webAppLinux'
    appName: '<Name of web app>'
    package: '$(System.DefaultWorkingDirectory)/**/*.zip'
  • azureSubscription:你的 Azure 订阅。
  • appType:你的 Web 应用类型。
  • appName:现有应用服务的名称。
  • package:包的文件路径或包含应用服务内容的文件夹。 支持通配符。

部署 JavaScript Node.js应用

如果要构建 JavaScript Node.js应用,将工作目录的全部内容发布到 Web 应用。 如果应用程序没有 iisnode 处理程序Web.config,此代码片段还会在部署期间生成一个 iisnode 处理程序:

- task: AzureWebApp@1
  inputs:
    azureSubscription: '<Azure service connections>'
    appName: '<Name of web app>'
    package: '$(System.DefaultWorkingDirectory)'
    customWebConfig: '-Handler iisnode -NodeStartFile server.js -appType node'
  • azureSubscription:你的 Azure 订阅。
  • appName:现有应用服务的名称。
  • package:包的文件路径或包含应用服务内容的文件夹。 支持通配符。
  • customWebConfig:web.configPython、Node.js、Go 和 Java 应用生成参数。 如果 web.config 应用程序没有标准文件,将生成Azure 应用服务部署到其中。

有关 Azure 服务连接的信息,请参阅 以下部分

YAML 管道在 TFS 上不可用。

使用服务连接

若要部署到 Azure 应用服务,需要使用 Azure 资源管理器 服务连接。 Azure 服务连接存储凭据,这些凭据用于从 Azure Pipelines 或 Azure DevOps Server Azure。

详细了解如何 Azure 资源管理器连接。 如果服务连接未如预期工作,请参阅 服务连接疑难解答

任务需要 Azure 服务 AzureWebApp 连接。 Azure 服务连接存储从 Azure 连接到 azure Azure Pipelines凭据。 请参阅 创建 Azure 服务连接

YAML 管道在 TFS 上不可用。

部署到虚拟应用程序

默认情况下,部署发生在 Azure Web 应用中的根应用程序。 可以使用任务的 属性部署到 VirtualApplication 特定的虚拟 AzureRmWebAppDeployment 应用程序:

- task: AzureRmWebAppDeployment@4
  inputs:
    VirtualApplication: '<name of virtual application>'
  • VirtualApplication:已在虚拟机中配置的虚拟应用程序Azure 门户。 有关 更多详细信息, 请参阅Azure 门户应用服务应用。

YAML 管道在 TFS 上不可用。

部署到槽

可以将 Azure Web 应用配置为具有多个槽。 使用槽位可以安全地部署应用并测试应用,然后再将其提供给客户。

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

- task: AzureWebApp@1
  inputs:
    azureSubscription: '<Azure service connection>'
    appType: webAppLinux
    appName: '<name of web app>'
    deployToSlotOrASE: true
    resourceGroupName: '<name of resource group>'
    slotName: staging

- task: AzureAppServiceManage@0
  inputs:
    azureSubscription: '<Azure service connection>'
    appType: webAppLinux
    WebAppName: '<name of web app>'
    ResourceGroupName: '<name of resource group>'
    SourceSlot: staging
    SwapWithProduction: true
  • azureSubscription:你的 Azure 订阅。
  • appType: (可选) 使用 部署到 Linux 上的 Web 应用。
  • appName:现有应用服务的名称。
  • deployToSlotOrASE:布尔值。 部署到现有部署槽位或Azure 应用服务环境。
  • resourceGroupName:资源组的名称。 如果 deployToSlotOrASE 为 true,则是必需的。
  • slotName:槽的名称,默认为 。 如果 deployToSlotOrASE 为 true,则是必需的。
  • SourceSlot:当 为 true 时发送到 生产环境的槽。
  • SwapWithProduction:布尔值。 将源槽的流量与生产交换。

YAML 管道在 TFS 上不可用。

部署到多个 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: '<Azure service connection>'
      appType: <app type>
      appName: '<name of test stage web app>'
      deployToSlotOrASE: true
      resourceGroupName: <resource 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:
      buildType: 'current'
      artifactName: 'drop'
      targetPath: '$(Pipeline.Workspace)'

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

YAML 管道在 TFS 上不可用。

配置更改

对于大多数语言堆栈, 应用设置连接字符串 可在运行时设置为环境变量。 也可以使用 Key Vault 引用从 Key Vault 解析应用设置。

对于 ASP.NET 开发人员 ASP.NET Core,在应用服务中设置应用设置就像在 <appSettings> Web.config。在部署到 Web 应用目标之前,可能需要为 Web 应用目标应用特定配置。 将同一生成部署到管道中的多个 Web 应用时,这非常有用。 例如,如果Web.config包含名为 的连接字符串,可以在部署到每个 Web 应用之前更改 connectionString 其值。 为此,可以应用Web.config转换,或将变量Web.config文件中。

Azure 应用服务 部署任务允许用户根据指定的阶段名称修改配置文件 (*.config 文件) 中的配置设置和 XML 参数文件 (parameters.xml) 。

注意

单独的文件转换任务也支持文件转换和变量替换,以用于Azure Pipelines。 可以使用文件转换任务将文件转换和变量替换应用于任何配置和参数文件。

以下代码片段显示了变量替换的示例:

jobs:
- job: test
  variables:
    connectionString: <test-stage connection string>
  steps:
  - task: AzureRmWebAppDeployment@4
    inputs:
      azureSubscription: '<Test stage Azure service connection>'
      WebAppName: '<name of test stage web app>'
      enableXmlVariableSubstitution: true

- job: prod
  dependsOn: test
  variables:
    connectionString: <prod-stage connection string>
  steps:
  - task: AzureRmWebAppDeployment@4
    inputs:
      azureSubscription: '<Prod stage Azure service connection>'
      WebAppName: '<name of prod stage web app>'
      enableXmlVariableSubstitution: true

YAML 管道在 TFS 上不可用。

有条件地部署

可以选择仅将某些生成部署到 Azure Web 应用。

若要在 YAML 中实现此用途,可以使用以下方法之一:

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

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

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

若要详细了解条件,请参阅 指定条件

YAML 管道在 TFS 上不可用。

部署到云Azure 政府云或Azure Stack

创建合适的服务连接:

部署机制

前面的示例依赖于内置的 Azure Web 应用任务 ,该任务提供与 Azure 的简化集成。

如果使用 Windows 代理,此任务将使用Web 部署技术与 Azure Web 应用进行交互。 Web 部署提供了几个方便的部署选项,例如重命名锁定的文件和在部署期间从 App_Data 文件夹中排除文件。

如果使用 Linux 代理,则任务依赖于 Kudu REST API

在部署之前,值得检查的一件事Azure 应用服务访问限制列表。 此列表可以包含 IP 地址或 Azure 虚拟网络子网。 如果存在一个或多个条目,则在列表末尾会存在一个隐式的“拒绝所有”。 若要修改应用的访问限制规则,请参阅在 中添加 和编辑访问Azure 门户。 还可以修改 /限制对 scm 站点 (源代码管理) 的访问

"Azure 应用服务管理"任务是另一个可用于部署的任务。 可以使用此任务在部署之前或之后启动、停止或重启 Web 应用。 还可使用此任务交换槽、安装站点扩展或启用对 Web 应用的监视。

您可以使用 文件转换任务 对任何配置和参数文件应用文件转换和变量替换。

如果内置任务不能满足您的需要,则可以使用其他方法编写部署脚本。 查看以下每个任务中的 YAML 代码片段,了解一些示例:

Azure Pipelines | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018 | TFS 2017

注意

在 Microsoft Team Foundation Server (TFS) 2018 和更低版本中,生成和发布管道被称为“定义”,运行被称为“生成”,服务连接被称为“服务终结点”,阶段被称为“环境”,而作业被称为“阶段” 。

你可以使用 Azure Pipelines 连续部署 web 应用,以便在每个成功的生成上Azure App Service

Azure App Service 是一种托管的环境,用于托管 web 应用程序、REST Api 和移动后端。 你可以采用最喜欢的语言(包括 .NET、Python 和 JavaScript)进行开发。

使用 Azure Web 应用任务 部署到管道中的 Azure App Service。 对于更复杂的方案(例如需要在部署中使用 XML 参数),可以使用 Azure App Service 部署任务

若要了解如何部署到适用于 Linux 容器的 Azure Web 应用,请参阅 部署 Azure Web 应用容器

注意

本指南适用于 Team Foundation Server (TFS) 版本2017.3 及更高版本。

先决条件

  • GitHub 帐户,可在其中创建存储库。 如果你没有此类帐户,可免费创建一个

  • Azure DevOps 组织。 如果你没有此类帐户,可免费创建一个。 (Azure DevOps 组织与 GitHub 组织不同。 如果希望 DevOps 组织与 GitHub 组织同名,可以为两者指定相同的名称。)

    如果你的团队已创建帐户,请确保你是要使用的 Azure DevOps 项目的管理员。

  • 能够在 Microsoft 托管的代理上运行管道。 可以购买并行作业,也可以请求免费层。 若要请求免费层,请按照本文中的说明进行操作。 请注意,授予免费层可能需要 2-3 个工作日。

在 Azure 门户中创建 Azure App Service

使用 Azure Cloud Shell 在 Linux 或 Windows 上创建 Azure App Service。 开始操作:

  1. 登录到 Azure 门户
  2. 在门户的顶部导航窗格中启动 Cloud Shell。 打开 Cloud Shell。

有关详细信息,请参阅 Azure Cloud Shell 概述

在 Linux 上创建 Azure App Service。

# Create a resource group
az group create --location eastus2 --name myapp-rg

# Create an app service plan of type Linux
az appservice plan create -g myapp-rg -n myapp-service-plan --is-linux

# Create an App Service from the plan 
az webapp create -g myapppipeline-rg -p myapp-service-plan -n my-app-dotnet --runtime "DOTNETCORE|3.1" 

通过 Azure Pipelines 生成应用