部署 Azure Web 应用

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018

注意

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

使用Azure Pipelines自动将 Web 应用部署到每次成功生成时Azure 应用服务。 利用 Azure Pipelines,可以使用 Azure DevOps 通过持续集成 (CI) 和持续交付 (CD) 来进行生成、测试和部署。

YAML 管道是使用存储库中的 YAML 文件定义的。 步骤是管道最小的生成块,并且可以是脚本或任务(预打包的脚本)。 了解构成管道的关键概念和组件

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

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

先决条件

确保具有以下内容:

  • GitHub 帐户,可在其中创建存储库。 免费创建一个

  • Azure DevOps 组织。 免费创建一个。 如果你的团队已创建帐户,请确保你是要使用的 Azure DevOps 项目的管理员。

  • 能够在 Microsoft 托管的代理上运行管道。 可以购买并行作业,也可以请求免费层。

在Azure 门户中创建Azure 应用服务

使用 Azure Cloud Shell 在 Linux 或 Windows 上创建Azure 应用服务。 开始操作:

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

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

在 Linux 上创建Azure 应用服务。

# 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 生成应用

创建 .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 app task.

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

  3. 在 Linux 上选择 Web 应用并输入你的 azureSubscriptionWeb appName应用,然后package。 完整的 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 管道从 Azure DevOps Server 2019 进行部署。 如果你是经验丰富的管道用户,并且已经有一个 YAML 管道来生成 .NET Core 应用,则你可能会发现以下示例很有用。

TFS 不支持 YAML。

现在,你已准备好阅读本主题的其余部分,了解用户对自定义 Azure Web 应用部署所做的一些更常见的更改。

使用 Azure Web 应用任务

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

部署 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 文件中的生成步骤在代理上的 $(System.DefaultWorkingDirectory) 文件夹中生成 zip 存档。

有关 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 应用。 如果应用程序没有Web.config文件并在 Azure Web 应用上启动 iisnode 处理程序,则此代码片段还会在部署过程中生成一个Web.config文件:

- 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:为 Python、Node.js、Go 和 Java 应用生成web.config参数。 如果应用程序没有标准web.config文件,则会生成标准文件并将其部署到Azure 应用服务。

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

TFS 不支持 YAML。

使用服务连接

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

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

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

TFS 不支持 YAML。

部署到虚拟应用程序

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

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

TFS 中不支持 YAML pis。

部署到槽

可以将 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: (可选) 用于 webAppLinux 部署到 Linux 上的 Web 应用。
  • appName:现有应用服务的名称。
  • deployToSlotOrASE:布尔值。 部署到现有部署槽位或Azure 应用服务环境。
  • resourceGroupName:资源组的名称。 如果 deployToSlotOrASE 为 true,则是必需的。
  • slotName:槽的名称,默认为 production。 如果 deployToSlotOrASE 为 true,则是必需的。
  • SourceSlot:如果 SwapWithProduction 为 true,则发送到生产槽。
  • SwapWithProduction:布尔值。 将源槽的流量与生产交换。

TFS 不支持 YAML。

部署到多个 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:
      source: 'current'
      artifact: 'drop'
      path: '$(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'

TFS 不支持 YAML。

配置更改

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

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

Azure 应用服务部署任务允许用户根据指定的阶段名称修改配置文件中的配置设置, (*.config文件) Web 包和 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

TFS 不支持 YAML piis。

有条件地部署

可以选择仅将某些版本部署到 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>'

若要了解有关条件的详细信息,请参阅 “指定条件”。

TFS 不支持 YAML。

使用发布管道 (经典) 部署

可以使用发布管道选取生成发布的项目,然后将其部署到 Azure 网站。

  1. 执行下列操作之一以开始创建发布管道:

    • 如果刚刚完成 CI 生成,请选择链接 (例如 内部版本 20170815.1) 打开生成摘要。 然后选择 “发布 ”以启动自动链接到生成管道的新发布管道。

    • Azure Pipelines中打开“发布”选项卡,打开+发布管道列表中的下拉列表,然后选择“创建发布管道”。

  2. 创建发布管道的最简单方法是使用模板。 如果要部署Node.js应用,请选择“部署Node.js应用”以Azure 应用服务模板。 否则,请选择Azure 应用服务部署模板。 然后选择 “应用”。

    注意

    这些模板之间的唯一区别是,Node.js模板将任务配置为生成包含启动 iisnode 服务的参数的web.config文件。

  3. 如果从生成摘要创建了新版本管道,请检查生成管道和项目是否显示在“管道”选项卡上的“Artifacts”部分中。如果从“发布”选项卡创建了一个新的发布管道,请选择“+ 添加”链接并选择生成项目。

  4. 选择“Artifacts”部分中的“连续部署”图标,检查是否启用了连续部署触发器,并添加一个筛选器以包含分支。

    注意

    从“ 发布 ”选项卡创建新的发布管道时,默认情况下不会启用持续部署。

  5. 打开 “任务 ”选项卡,选中 阶段 1 后,按如下所示配置任务属性变量:

    • Azure 订阅:“可用 Azure 服务连接 ”下的列表中选择连接,或创建与 Azure 订阅的更受限的权限连接。 如果使用Azure Pipelines,如果看到输入旁边的“授权”按钮,请单击该按钮以授权Azure Pipelines连接到 Azure 订阅。 如果使用 TFS,或者在订阅列表中未看到所需的 Azure 订阅,请参阅 Azure 资源管理器服务连接以手动设置连接。

    • App 服务名称:从订阅中选择 Web 应用的名称。

    注意

    从模板创建发布管道时,任务的某些设置可能已自动定义为 阶段变量 。 无法在任务设置中修改这些设置;而必须选择父阶段项才能编辑这些设置。

  6. 保存发布管道。

创建发布以部署应用

现在,你已准备好创建发布,这意味着使用特定生成生成的项目运行发布管道。 这会导致部署生成:

  1. 选择“+ 发布”,然后选择“创建发布”。

  2. 在“创建新发布”面板中,检查你要使用的项目版本是否已选中,然后选择“创建”。

  3. 选择信息栏消息中的发布链接。 例如:“发布 Release-1 已创建”。

  4. 在管道视图中,选择管道阶段中的状态链接以查看日志和代理输出。

  5. 发布完成后,使用 Web 应用 URL http://{web_app_name}.azurewebsites.net导航到在 Azure 中运行的站点,并验证其内容。

部署到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 代码片段,了解一些示例: