Azure 应用服务部署任务

参数说明
ConnectionType
(连接类型)
(必需) 选择要用于部署 Web 应用的服务连接类型。
默认值:AzureRM
已连接
ServiceName

(Azure 订阅)
(ConnectionType = AzureRM) 选择部署Azure 资源管理器订阅时需要。
参数别名: azureSubscription
PublishProfilePath
(发布配置文件路径)
(ConnectionType = PublishProfile) 为包含发布信息的文件的路径时为必需。
默认值:$(System.DefaultWorkingDirectory)/**/*.pubxml
PublishProfilePassword
(发布配置文件密码)
(ConnectionType = PublishProfile) 配置文件的密码时为必需。 请考虑将密码存储在机密变量中,并在此处使用该变量。 示例:$ (密码)
WebAppKind
(应用服务类型)
(ConnectionType = AzureRM) Windows 上的 Web 应用、Linux 上的 Web 应用、用于容器的 Web 应用、函数应用、Linux 上的函数应用、用于容器的函数应用和移动应用,则必需
默认值:webApp
参数别名: appType
WebAppName
(应用服务名称)
(ConnectionType = AzureRM) Enter 或选择现有资源的名称时,Azure 应用服务。 仅列出基于所选应用类型的应用服务。
DeployTo
SlotOrASEFlag

(部署到槽或应用服务环境)
(可选) 选择要部署到现有部署槽位或Azure 应用服务的选项。 对于这两个目标,任务都需要资源组名称。
如果部署目标是槽,则默认情况下,部署将部署到 生产槽 。 可以提供任何其他现有的槽名。
如果部署目标是一个Azure 应用服务环境,请保留槽名作为 生产 ,并仅指定资源组名称。
默认值:false
参数别名: deployToSlotOrASE
ResourceGroupName
(资源组)
(部署目标是部署槽位或应用服务环境时,如果 DeployToSlotOrASEFlag = true) 则资源组名称是必需的。 输入或选择包含上面指定的Azure 应用服务 Azure 资源组。
SlotName
(槽)
(,如果 DeployToSlotOrASEFlag = true) Enter 或选择生产槽外的现有
默认值:production
DockerNamespace
(注册表或命名空间)
(WebAppKind = webAppContainer 时需要
或 WebAppkind = functionAppContainer) 特定注册表或命名空间的全局唯一顶级域名。 注意:完全限定的映像名称的格式为 :{registry or namespace}/{repository}:{tag}。 例如 ,myregistry.azurecr.io/nginx:latest
DockerRepository
(图像)
(WebAppKind = webAppContainer 时需要
或 WebAppkind = functionAppContainer) 存储容器映像的存储库的名称。 注意: 完全限定的映像名称的格式为 :{registry or namespace}/{repository}:{tag}。 例如 ,myregistry.azurecr.io/nginx:latest
DockerImageTag
(标记)
(可选) 标记是可选的,但是注册表用于将版本信息应用于 Docker 映像的机制。 注意: 完全限定的映像名称的格式为 :{registry or namespace}/{repository}:{tag}。 例如 ,myregistry.azurecr.io/nginx:latest
VirtualApplication
(虚拟应用程序)
(可选) 指定已在虚拟机中配置的虚拟应用程序Azure 门户。 部署到网站根目录不需要此选项。 部署 Web 项目之前 必须已配置虚拟应用程序。
Package
(包或文件夹)
(ConnectionType = PublishProfile 或 WebAppKind = webApp、apiApp、functionApp、mobileApp、webAppLinux 或 functionAppLinux) 文件路径或包含 MSBuild 生成的应用服务内容的文件夹或压缩 zip 或 war 文件,则是必需的。
支持生成变量或发布) 和通配符。 例如,$(System.DefaultWorkingDirectory)/**/*.zip$(System.DefaultWorkingDirectory)/**/*.war
默认值:30$(System.DefaultWorkingDirectory)/**/*.zip
参数别名: packageForLinux
RuntimeStack
(运行时堆栈)
(可选) 选择框架和版本。 这适用于适用于 Linux 的 Web 应用。
RuntimeStackFunction
(运行时堆栈)
(可选) 选择框架和版本。 这适用于 Linux 上的函数应用。
StartupCommand
(启动命令)
(可选) 输入启动命令。
ScriptType
(部署脚本类型)
(可选) 通过提供在部署成功后在 Azure 应用服务 运行的脚本来自定义部署。 选择内联部署脚本或脚本文件的路径和名称。 了解详细信息
InlineScript
(内联脚本)
(ScriptType == 内联脚本) 脚本时为必需。 可以在此处提供部署命令,每行一个命令。 请参阅此示例
ScriptPath
(部署脚本路径)
(ScriptType == 文件路径) 脚本的路径和名称时为必需。
Web
ConfigParameters

(Python web.config、Node.js、Go 和 Java 应用生成)
(可选) 将生成web.config一个标准应用程序,Azure 应用服务应用程序没有标准参数。 可以编辑web.config中的值,这些值将因应用程序框架而异。 例如,对于Node.js,web.config将具有启动文件和iis_node值。 此编辑功能仅适用于生成的web.config文件。 了解详细信息
AppSettings
(应用设置)
(可选) 使用语法 -key 值编辑 Web 应用应用程序设置。 包含空格的值必须用双引号引起来。 示例:-Port 5000 -RequestTimeout 5000-WEBSITE_TIME_ZONE"东部标准时间"。
ConfigurationSettings
(配置设置)
(语法) -key值 编辑 Web 应用配置设置的可选选项。 包含空格的值必须用双引号引起来。 示例: -phpVersion 5.6-linuxFxVersion: node | 6.11
UseWebDeploy
(选择部署方法)
(可选) 如果未选中,任务会自动检测基于应用类型、包格式和其他参数的最佳部署方法。 选择选项以查看支持的部署方法,并选择一个选项来部署应用。
参数别名: enableCustomDeployment
DeploymentType
(部署方法)
如果 UseWebDeploy = = true) 为应用选择部署方法,则 (必选。
默认值: webDeploy
TakeAppOfflineFlag
(使应用脱机)
(可选) 选择此选项可在同步操作开始之前将 app_offline.htm 文件放在根目录中,以使 Azure App Service 脱机。 同步成功完成后,将删除该文件。
默认值:true
SetParametersFile
(SetParameters 文件)
要使用的 SetParameters.xml 文件 (可选) 位置。
RemoveAdditional
FilesFlag

(删除目标) 的其他文件
(可选) 选择该选项以删除在应用服务包或文件夹中没有匹配文件的 Azure App Service 上的文件。
注意: 这也会删除与此 Azure App Service 上安装的任何扩展相关的所有文件。 若要防止出现这种情况,请设置 从 App_Data 文件夹中排除文件 复选框。
默认值:false
ExcludeFiles
FromAppDataFlag

(从 App_Data 文件夹中排除文件)
(可选) 选择该选项以防止 App_Data 文件夹中的文件部署到 Azure App Service 或从中删除。
默认值:true
AdditionalArguments
(其他参数)
(可选) 语法 键:值后附加 Web 部署参数。 部署 Azure App Service 时将应用这些。 示例: -disableLink: AppPoolExtension-disableLink: ContentExtension。更多示例
默认值: -retryAttempts: 6-retryInterval: 10000
RenameFilesFlag
(重命名锁定的文件)
(可选) 选择此选项以在 Azure App Service 应用程序设置中启用 Msdeploy.exe 标志 MSDEPLOY_RENAME_LOCKED_FILES = 1 。 设置后,它会使 Msdeploy.exe 能够重命名在应用部署期间锁定的文件。
默认值:true
XmlTransformation
(XML 转换)
(可选) 将为运行配置转换 。 Release.config 。 {EnvironmentName} .config* .config文件。 在变量替换之前运行配置转换。 只有 Windows 平台支持 XML 转换。 了解详细信息
默认值:false
参数别名: enableXmlTransform
XmlVariable
替换

(XML 变量替换)
生成或发布管道中定义 (可选) 变量将与任何配置文件的appSettingsapplicationSettingsconnectionStrings节中的名称条目相匹配,并与parameters.xml文件相匹配。 在配置转换后运行变量替换。
注意: 如果在发布管道和阶段中定义了相同的变量,则阶段变量将取代 release 管道变量。 了解详细信息
默认值:false
参数别名: enableXmlVariableSubstitution
JSONFiles
(JSON 变量替换)
(可选) 提供一个用换行符分隔的 JSON 文件列表来替换变量值。 文件名必须是相对于根文件夹的相对路径。 若要替换嵌套或层次结构的 JSON 变量,请使用 JSONPath 表达式指定它们。 例如,若要在下面的示例中替换 ConnectionString 的值,请在 "生成" 或 "发布" 管道中定义一个名为 DefaultConnection 的变量, (或发布管道阶段) 。

{
  "Data": {
    "DefaultConnection": {
      "ConnectionString": "Server = (localdb) \SQLEXPRESS; 数据库 = MyDB;Trusted_Connection = True "
    }
  }
}

在配置转换后运行变量替换。 注意:将从替换中排除生成和发布管道变量。 了解详细信息

此 YAML 示例 (Linux) 部署到 Azure Web 应用容器。

pool:
  vmImage: ubuntu-latest

variables:
  azureSubscriptionEndpoint: Contoso
  DockerNamespace: contoso.azurecr.io
  DockerRepository: aspnetcore
  WebAppName: containersdemoapp

steps:

- task: AzureRMWebAppDeployment@4
  displayName: Azure App Service Deploy
  inputs:
    appType: webAppContainer
    ConnectedServiceName: $(azureSubscriptionEndpoint)
    WebAppName: $(WebAppName)
    DockerNamespace: $(DockerNamespace)
    DockerRepository: $(DockerRepository)
    DockerImageTag: $(Build.BuildId)

下面是另一个示例,该示例将 web 应用部署到跨部署槽的 Windows 应用服务。

pool:
  vmImage: 'windows-latest'

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'

steps:
 - stage: DeployDevStage
    displayName: 'Deploy App to Dev Slot'
    jobs:
      - job:  DeployApp
        displayName: 'Deploy App'
        steps:
        - task: DownloadPipelineArtifact@2
          inputs:
            buildType: 'current'
            artifactName: 'drop'
            targetPath: '$(System.DefaultWorkingDirectory)'
        - task: AzureRmWebAppDeployment@4
          inputs:
            ConnectionType: 'AzureRM'
            azureSubscription: 'Fabrikam Azure Subscription - PartsUnlimited'
            appType: 'webApp'
            WebAppName: 'partsunlimited'
            deployToSlotOrASE: true
            ResourceGroupName: 'rgPartsUnlimited'
            SlotName: 'Dev'
            packageForLinux: '$(System.DefaultWorkingDirectory)/**/*.zip'

  - stage: DeployStagingStage
    displayName: 'Deploy App to Staging Slot'
    dependsOn: DeployDevStage
    jobs:
      - job:  DeployApp
        displayName: 'Deploy App'
        steps:
        - task: DownloadPipelineArtifact@2
          inputs:
            buildType: 'current'
            artifactName: 'drop'
            targetPath: '$(System.DefaultWorkingDirectory)'
        - task: AzureRmWebAppDeployment@4
          inputs:
            appType: webApp
            ConnectionType: AzureRM            
            ConnectedServiceName: 'Fabrikam Azure Subscription - PartsUnlimited'
            ResourceGroupName: 'rgPartsUnlimited'
            WebAppName: 'partsunlimited'
            Package: '$(System.DefaultWorkingDirectory)/**/*.zip'
            deployToSlotOrASE: true
            SlotName: 'staging'

  • 若要部署到特定的应用类型,请将设置 appType 为以下任何可接受的值: webApp Windows) 上的 (web 应用、 webAppLinux Linux) 上的 (web 应用、 webAppContainer (用于容器的 Web 应用-linux) 、 functionAppfunctionAppLinuxfunctionAppContainerapiAppmobileApp (Function App Windows) (Function App) (API Function App) ( 如果未提到, webApp 将被视为默认值。

  • 若要启用任何高级部署选项,请添加参数, enableCustomDeployment: true 并根据需要包含以下参数。

        # deploymentMethod: 'runFromPackage' # supports zipDeploy as well
        # appOffline: boolean    # Not applicable for 'runFromPackage'
        # setParametersFile: string
        # removeAdditionalFilesFlag: boolean
        # additionalArguments: string
    

输出变量

  • Web 应用托管的 URL:为使用 Azure App Service 托管 URL 填充的变量提供名称,例如。 变量可用作 $ (variableName。例如,AppServiceApplicationUrl) 引用后续任务中 Azure App Service 的托管 URL。

使用注意事项

  • 该任务仅适用于 Azure 资源管理器 api
  • 若要忽略 SSL 错误,请 VSTS_ARM_REST_IGNORE_SSL_ERRORStrue 在发布管道中定义一个名为的变量。
  • 对于针对 Windows 上的 Web 应用的 .net 应用,请 ERROR_FILE_IN_USE 确保启用 "ERROR_FILE_IN_USE使应用脱机设置",以避免部署失败并出现错误。 对于零停机部署,请使用槽交换选项。
  • 当部署到已 Application Insights 配置的应用服务,并且已启用 "删除目标中的其他文件" 时,请确保同时启用 App_Data 文件夹中的 "排除文件",以使 Application Insights 扩展处于安全状态。 这是必需的,因为 Application Insights 连续 web 作业安装到 App_Data 文件夹中。

示例后期部署脚本

此任务提供一个选项,通过提供一个脚本,该脚本将在应用程序的项目成功复制到应用服务后在 Azure App Service 上运行。 你可以选择在项目文件夹中提供内联部署脚本或脚本文件的路径和名称。

当你希望直接在应用服务上还原应用程序依赖项时,此方法非常有用。 当应用程序依赖项导致将大型项目从代理复制到 Azure App Service 时,为节点、PHP 和 Python 应用还原包有助于避免超时。

部署脚本的一个示例是:

@echo off
if NOT exist requirements.txt (
 echo No Requirements.txt found.
 EXIT /b 0
)
if NOT exist "$(PYTHON_EXT)/python.exe" (
 echo Python extension not available >&2
 EXIT /b 1
)
echo Installing dependencies
call "$(PYTHON_EXT)/python.exe" -m pip install -U setuptools
if %errorlevel% NEQ 0 (
 echo Failed to install setuptools >&2
 EXIT /b 1
)
call "$(PYTHON_EXT)/python.exe" -m pip install -r requirements.txt
if %errorlevel% NEQ 0 (
 echo Failed to install dependencies>&2
 EXIT /b 1
)

部署方法

此任务中提供多种部署方法。 默认情况下,Web 部署 (msdeploy.exe) 。 若要更改部署选项,请展开 " 其他部署选项 ",然后启用 " 选择部署方法 " 以从其他基于包的部署选项中进行选择。

根据 Azure App Service 和代理的类型,该任务选择合适的部署技术。 该任务使用的不同部署技术如下:

默认情况下,该任务会尝试基于输入包类型、应用服务类型和代理操作系统选择适当的部署技术。

自动检测逻辑

对于基于 windows 的代理。

应用服务类型包类型部署方法
Linux 上的 Web 应用或 Linux 上的函数应用Folder/Zip/jar
战争
Zip 部署
War 部署
用于容器的 Web (Linux) 或适用于容器的函数应用 (Linux) 更新应用设置NA
webApp on Windows、function App on Windows、API App 或移动应用战争
Jar
MsBuild 包类型或部署到虚拟应用程序


Folder/Zip
War 部署
Zip 部署
Web Deploy

如果 postDeploymentScript == true,则 Zip 部署
else,从包运行

在非 Windows代理 (任何应用服务类型) ,任务依赖于Kudu REST API 来部署应用。

Web Deploy

Web 部署 (msdeploy.exe) 可用于使用 Windows 代理将 Windows 上的 Web 应用或函数Azure 应用服务部署到 Windows 应用。 Web 部署功能丰富,并提供以下选项:

  • 重命名锁定的文件: 在 web 服务器设置中启用 msdeploy 标志 MSDEPLOY_RENAME_LOCKED_FILES=1,重命名 web 服务器仍在Azure 应用服务文件。 如果设置了此选项,则允许 msdeploy 重命名在应用部署期间锁定的文件。

  • 删除目标位置的其他文件: 删除部署的应用Azure 应用服务包或文件夹中没有匹配文件的文件。

  • 从 App_Data 文件夹中排除文件: 防止要部署到App_Data (项目包/文件夹中的) 文件夹中的文件Azure 应用服务

  • 其他Web 部署参数: 部署应用程序时将应用Azure 应用服务。 示例:-disableLink:AppPoolExtension -disableLink:ContentExtension。 有关操作设置的Web 部署,请参阅 Web 部署操作设置。

使用 Web 部署 在代理上安装Microsoft Web 平台安装程序。 Web 部署安装 3.5,且不支持捆绑SQL版本。 安装时无需选择任何自定义Web 部署。 Web 部署安装在 C:\Program Files (x86) \IIS\Microsoft Web 部署 V3。

Kudu REST API

如果目标是 Windows 上的 Web 应用、Linux 上的 Web 应用 (内置源应用或函数应用) ,则 Kudu REST API 同时在 Windows 和 Linux 自动化代理上工作。 该任务使用 Kudu 将文件复制到 Azure 应用 服务。

容器注册表

当目标Windows时,适用于 Windows 和 Linux 自动化用于容器的 Web 应用。 该任务通过设置相应的容器注册表、存储库、映像名称和标记信息来更新应用。 还可使用 任务传递容器映像的启动命令。

Zip 部署

需要.zip包,将文件内容部署到 Azure 中应用服务或函数应用的 wwwroot 文件夹。 此选项覆盖 wwwroot 文件夹中的所有现有内容。 有关详细信息,请参阅zip deployment for Azure Functions。

从包运行

需要与 Zip Deploy 相同的部署包。 但是,Functions 运行时不将文件部署到 wwwroot 文件夹,而是将整个包装载, 并且 wwwroot 文件夹中的文件变为只读。 有关详细信息,请参阅从包文件运行 Azure Functions

War 部署

需要 .war 部署包,将文件内容部署到 Azure 中应用服务的 wwwroot 文件夹或 webapps 文件夹。

疑难解答

错误:无法提取 Azure 的访问令牌。 验证所使用的服务主体是否有效且未过期。

该任务使用服务连接中的服务主体向 Azure 进行身份验证。 如果服务主体已过期或无权访问应用服务,任务将失败并出现此错误。 验证所使用的服务主体的有效性,以及它是否存在于应用注册中。 有关详细信息,请参阅 使用基于角色的访问控制来管理对 Azure 订阅资源的访问此博客文章 还包含有关使用服务主体身份验证详细信息。

SSL 错误

如果要在应用服务中使用证书,则必须由受信任的证书颁发机构对证书进行签名。 如果 Web 应用显示证书验证错误,可能是因为使用了自签名证书。 将名为 的 VSTS_ARM_REST_IGNORE_SSL_ERRORS 变量设置为生成 true 或发布管道中的 值,以解决错误。

发布长时间挂起,然后失败

此问题可能是应用服务计划中容量不足的结果。 若要解决此问题,可以扩展应用服务实例以增加可用的 CPU、RAM 和磁盘空间,或者尝试使用其他应用服务计划。

5xx 错误代码

如果看到 5xx 错误, 请检查 Azure 服务 的状态

错误:找不到具有指定模式的包

检查任务中提及的包是否在生成或上一阶段中作为项目发布,以及是否已在当前作业中下载。

错误:msBuild 包类型不支持使用 zip 部署选项进行发布

使用默认参数MSBuild任务 (创建的 Web 包具有) 嵌套文件夹结构,该结构仅可通过Web 部署。 publish-to-zip 部署选项不能用于部署这些包。 若要转换打包结构,请执行以下步骤:

  1. 在"生成解决方案"任务中,将MSBuild参数更改为

    Screenshot that shows the Build solution values.

  2. 添加存档任务并更改值,如下所示:

    1. 根文件夹或文件更改为 存档 到 。

    2. 清除" 将根文件夹名称预置到存档路径" 复选框:

      Screenshot that shows the Archive values.

Windows 上的 Web 应用部署成功,但应用无法正常运行

这可能是因为web.config应用中不存在此应用。 可以将一个web.config文件添加到源,或者使用任务的"文件转换"和"变量替换选项"自动生成一个。

  • 单击该任务,然后转到"为 Python、web.config、Go 和 Java 应用Node.js生成参数。

    Generate web.config parameters Dialog

  • 单击"生成 Python、web.config、Node.js Go 和 Java 应用的参数"按钮以编辑参数。

    Drop Down Dialog

  • 从下拉列表中选择应用程序类型。

  • 单击“确定”。 这会填充web.config生成数据所需的web.config。

注意

此部分已弃用,已替换为文件 转换 任务。

ERROR_FILE_IN_USE

将 .NET 应用部署到 Windows 上的 Web 应用时,部署可能会失败,错误代码ERROR_FILE_IN_USE。 若要解决此错误,请确保任务中启用了"重命名锁定的文件"和"使应用脱机"选项。 对于零故障时间部署,请使用槽交换。

你还可以使用“从包运行部署”方法来避免资源锁定。

Web 部署错误

如果使用 Web 部署来部署应用,则在某些错误情况下,Web 部署将在日志中显示错误代码。 若要排查 Web 部署错误, 请参阅此

应用服务环境 (ASE) 上的 Web 应用部署无法正常运行

  • 确保Azure DevOps代理位于同一 VNET (子网中) ASE 的内部负载均衡器 (ILB) 不同。 这将使代理能够从客户端请求Azure DevOps并部署到 ASE。
  • 如果使用的是 Azure DevOps,则无需从 Internet 访问代理,但只需进行出站访问,Azure DevOps服务。
  • 如果使用的是在虚拟网络中部署的 TFS/Azure DevOps Server,则可以完全隔离代理。
  • 生成代理必须配置为需要部署到的 Web 应用的 DNS 配置。 由于虚拟网络中的专用资源没有 Azure DNS 的条目,因此需要将其添加到代理计算机上的 hosts 文件中。
  • 如果自签名证书用于 ASE 配置,则需要在 MSDeploy.It 的部署任务中设置 "-allowUntrusted" 选项,以便将变量 VSTS_ARM_REST_IGNORE_SSL_ERRORS 设置为 true。 如果证书颁发机构中的证书用于 ASE 配置,则不需要这样做。

常见问题解答

如何配置服务连接?

此任务需要 Azure 资源管理器服务连接

如何配置 Application Insights 的 web 作业部署?

部署到应用服务时,如果已配置Application Insights并已启用 ,则还需要启用 Exclude files from the App_Data folder 。 启用此选项会使 Application Insights 扩展处于安全状态。 此步骤是必需的,因为 Application Insights 连续 WebJob 安装到 App_Data 文件夹中。

部署到应用服务时,应如何配置代理,以使其位于代理后面?

如果你的自承载代理需要 web 代理,则可以在配置过程中通知代理有关代理的信息。 这样做可以使代理通过代理连接到 Azure Pipelines 或 Azure DevOps Server。 详细了解如何在 web 代理后运行自承载代理

开放源代码

此任务是GitHub 上的开放源代码。 欢迎提供反馈和建议。

Azure Pipelines

使用此任务部署到 Azure 上的一系列应用服务。 该任务在运行 Windows、Linux 或 Mac 的跨平台代理上工作,并使用多种不同的基础部署技术

该任务适用于ASP.NETASP.NET CorePHPJavaPython中转和基于Node.js的 web 应用程序。

该任务可用于部署到多种 Azure 应用服务,例如:

任务的先决条件

要使任务正常工作,必须在目标计算机 () 中设置以下必备项。

  • 应用服务实例。 任务用于将 Web 应用项目或 Azure 函数项目部署到现有 Azure App Service 实例,该实例必须在任务运行之前存在。 可从 Azure 门户 创建应用服务实例,并在其中进行 配置 。 或者, Azure PowerShell 任务可用于运行AzureRM PowerShell 脚本来设置和配置 Web 应用。

  • Azure 订阅。 若要部署到 Azure,必须将 Azure 订阅 链接到管道。 此任务不适用于 Azure 经典服务连接,并且不会在任务的设置中列出这些连接。