AzureFunctionApp@2 - Azure Functions 部署 v2 任务

使用 .NET、Python、JavaScript、PowerShell、基于 Java 的 Web 应用程序更新函数应用。

语法

# Azure Functions Deploy v2
# Update a function app with .NET, Python, JavaScript, PowerShell, Java based web applications.
- task: AzureFunctionApp@2
  inputs:
    connectedServiceNameARM: # string. Alias: azureSubscription. Required. Azure Resource Manager connection. 
    appType: # 'functionApp' | 'functionAppLinux'. Required. App type. 
    #isFlexConsumption: false # boolean. Is Function App on Flex Consumption Plan. Default: false.
    appName: # string. Required. Azure Functions App name. 
    #deployToSlotOrASE: false # boolean. Optional. Use when appType != "" && isFlexConsumption = false. Deploy to Slot or App Service Environment. Default: false.
    #resourceGroupName: # string. Required when deployToSlotOrASE = true. Resource group. 
    #slotName: 'production' # string. Required when deployToSlotOrASE = true. Slot. Default: production.
    package: '$(System.DefaultWorkingDirectory)/**/*.zip' # string. Required. Package or folder. Default: $(System.DefaultWorkingDirectory)/**/*.zip.
    #runtimeStack: # 'DOTNET|6.0' | 'DOTNET-ISOLATED|6.0' | 'DOTNET-ISOLATED|7.0' | 'DOTNET-ISOLATED|8.0' | 'JAVA|8' | 'JAVA|11' | 'JAVA|17' | 'JAVA|21' | 'NODE|14' | 'NODE|16' | 'NODE|18' | 'NODE|20' | 'PYTHON|3.8' | 'PYTHON|3.9' | 'PYTHON|3.10' | 'PYTHON|3.11'. Optional. Use when appType = functionAppLinux && isFlexConsumption = false. Runtime stack. 
  # Application and Configuration Settings
    #appSettings: # string. App settings. 
  # Additional Deployment Options
    #deploymentMethod: 'auto' # 'auto' | 'zipDeploy' | 'runFromPackage'. Required when appType != "" && isFlexConsumption = false && appType != "" && package NotEndsWith .war && Package NotEndsWith .jar. Deployment method. Default: auto.
# Azure Functions Deploy v2
# Update a function app with .NET, Python, JavaScript, PowerShell, Java based web applications.
- task: AzureFunctionApp@2
  inputs:
    connectedServiceNameARM: # string. Alias: azureSubscription. Required. Azure Resource Manager connection. 
    appType: # 'functionApp' | 'functionAppLinux'. Required. App type. 
    appName: # string. Required. Azure Functions App name. 
    #deployToSlotOrASE: false # boolean. Optional. Use when appType != "". Deploy to Slot or App Service Environment. Default: false.
    #resourceGroupName: # string. Required when deployToSlotOrASE = true. Resource group. 
    #slotName: 'production' # string. Required when deployToSlotOrASE = true. Slot. Default: production.
    package: '$(System.DefaultWorkingDirectory)/**/*.zip' # string. Required. Package or folder. Default: $(System.DefaultWorkingDirectory)/**/*.zip.
    #runtimeStack: # 'DOTNET|2.2' | 'DOTNET|3.1' | 'DOTNET|6.0' | 'DOTNET-ISOLATED|7.0' | 'JAVA|8' | 'JAVA|11' | 'NODE|8' | 'NODE|10' | 'NODE|12' | 'NODE|14' | 'NODE|16' | 'NODE|18' | 'PYTHON|3.6' | 'PYTHON|3.7' | 'PYTHON|3.8' | 'PYTHON|3.9' | 'PYTHON|3.10'. Optional. Use when appType = functionAppLinux. Runtime stack. 
  # Application and Configuration Settings
    #appSettings: # string. App settings. 
  # Additional Deployment Options
    #deploymentMethod: 'auto' # 'auto' | 'zipDeploy' | 'runFromPackage'. Required when appType != "" && package NotEndsWith .war && Package NotEndsWith .jar. Deployment method. Default: auto.

输入

connectedServiceNameARM - Azure 资源管理器连接
输入别名:azureSubscriptionstring。 必填。

选择部署的 Azure 资源管理器订阅。


appType - 应用类型
string。 必填。 允许的值:functionApp(Windows 上的 Function App)、functionAppLinux(Linux 上的 Function App)。

选择部署的 Azure Function App 类型。


isFlexConsumption - 是弹性消耗计划上的 Function App
boolean。 默认值:false

如果函数应用位于 弹性消耗计划,则设置为 true


appName - Azure Functions 应用名称
string。 必填。

指定现有 Azure Functions 应用的名称。 列出的函数应用将基于所选应用类型。


deployToSlotOrASE - 部署到槽或应用服务环境
boolean。 自选。 当 appType != "" && isFlexConsumption = false时使用。 默认值:false

部署到现有部署槽位或 Azure 应用服务环境。 对于这两个目标,任务需要资源组名称。

如果部署目标为槽,则默认为 生产 槽。 还可以提供任何其他现有槽名称。

如果部署目标为 Azure 应用服务环境,请将槽名称保留为 生产 并指定资源组名称。


deployToSlotOrASE - 部署到槽或应用服务环境
boolean。 自选。 当 appType != ""时使用。 默认值:false

部署到现有部署槽位或 Azure 应用服务环境。 对于这两个目标,任务需要资源组名称。

如果部署目标为槽,则默认为 生产 槽。 还可以提供任何其他现有槽名称。

如果部署目标为 Azure 应用服务环境,请将槽名称保留为 生产 并指定资源组名称。


resourceGroupName - 资源组
stringdeployToSlotOrASE = true时是必需的。

当部署目标为部署槽位或应用服务环境时,需要资源组名称。

输入或选择包含上面指定的 Azure 应用服务的 Azure 资源组。


slotName -
stringdeployToSlotOrASE = true时是必需的。 默认值:production

输入或选择现有槽,不包括生产槽。


slotName -
stringdeployToSlotOrASE = true时是必需的。 默认值:production

输入或选择生产槽以外的现有槽。


package - 包或文件夹
string。 必填。 默认值:$(System.DefaultWorkingDirectory)/**/*.zip

包或文件夹的文件路径,其中包含 MSBuild 或压缩 zip 文件生成的应用服务内容。 支持变量(生成 | 版本)和通配符。 例如,$(System.DefaultWorkingDirectory)/**/*.zip


runtimeStack - 运行时堆栈
string。 自选。 当 appType = functionAppLinux && isFlexConsumption = false时使用。 允许的值:DOTNET|6.0DOTNET-ISOLATED|6.0DOTNET-ISOLATED|7.0DOTNET-ISOLATED|8.0JAVA|8JAVA|11JAVA|17JAVA|21NODE|14NODE|16NODE|18NODE|20PYTHON|3.8PYTHON|3.9PYTHON|3.10PYTHON|3.11

指定函数应用将在其上运行的框架和版本。 可以使用任何 支持的运行时版本。 弃用 DOCKER|microsoft/azure-functions-* 等旧值。 新值列在 任务助手的下拉列表中。 如果 支持的运行时版本中提供了较新版本的框架, 即使它不在列表中,也可以指定它。

注意

此值当前不会更新运行站点的 linuxFxVersion 。 这意味着无法将堆栈从节点 18 更新到节点 20。 任务当前仅更新应用设置。


runtimeStack - 运行时堆栈
string。 自选。 当 appType = functionAppLinux时使用。 允许的值:DOTNET|2.2(DOTNET|2.2(functionapp v2))、DOTNET|3.1(DOTNET|3.1(functionapp v3))、DOTNET|6.0(DOTNET|6.0(functionapp v4))、DOTNET-ISOLATED|7.0(DOTNET-ISOLATED|7.0(functionapp v4))、JAVA|8(JAVA|8(functionapp v2/) v3/v4)、JAVA|11(JAVA|11(functionapp v3/v4))、NODE|8(NODE|8(functionapp v2))、NODE|10(NODE|10(functionapp v2/v3))、NODE|12(NODE|12(functionapp v3))、NODE|14(NODE|14(functionapp v3/v4) ) NODE|16(NODE|16(functionapp v4))、NODE|18(NODE|18(functionapp v4))、PYTHON|3.6(PYTHON|3.6(functionapp v2/v3))、PYTHON|3.7(PYTHON|3.7(functionapp v2/v) PYTHON|3.8(PYTHON|3.8(functionapp v3/v4),PYTHON|3.9(PYTHON|3.9(functionapp v3/v4),PYTHON|3.10(PYTHON|3.10(functionapp v3/v4))。

指定函数应用将在其上运行的框架和版本。 可以使用任何 支持的运行时版本。 弃用 DOCKER|microsoft/azure-functions-* 等旧值。 新值列在 任务助手的下拉列表中。 如果 支持的运行时版本中提供了较新版本的框架, 即使它不在列表中,也可以指定它。


appSettings - 应用设置
string

使用语法 -key value 输入应用程序设置(例如:-Port 5000-RequestTimeout 5000-WEBSITE_TIME_ZONE)。 将包含空格的值括在双引号中(例如:"Eastern Standard Time")。

有关应用设置的详细信息,请参阅 Azure 应用服务中的 环境变量和应用设置。


deploymentMethod - 部署方法
stringappType != "" && isFlexConsumption = false && appType != "" && package NotEndsWith .war && Package NotEndsWith .jar时是必需的。 允许的值:auto(自动检测)、zipDeploy(Zip 部署)、runFromPackage(使用运行自包的 Zip 部署)。 默认值:auto

指定应用的 部署方法。 Linux 消耗应用不支持此配置。


deploymentMethod - 部署方法
stringappType != "" && package NotEndsWith .war && Package NotEndsWith .jar时是必需的。 允许的值:auto(自动检测)、zipDeploy(Zip 部署)、runFromPackage(使用运行自包的 Zip 部署)。 默认值:auto

指定应用的 部署方法。 Linux 消耗应用不支持此配置。


deploymentMethod - 部署方法
stringappType != "" && package NotEndsWith .war && Package NotEndsWith .jar时是必需的。 允许的值:auto(自动检测)、zipDeploy(Zip 部署)、runFromPackage(使用运行自包的 Zip 部署)。 默认值:auto

为应用选择 部署方法。 Linux 消耗应用不支持此配置。s


任务控制选项

除任务输入之外,所有任务都具有控制选项。 有关详细信息,请参阅 控件选项和常见任务属性

输出变量

此任务定义以下 输出变量,可以在下游步骤、作业和阶段中使用。

AppServiceApplicationUrl
所选 Azure Function App 的应用程序 URL。

言论

Azure 函数部署任务用于更新 Azure Functions,以便将 Functions 部署到 Azure。 该任务适用于运行 Windows、Linux 或 Mac 的跨平台 Azure Pipelines 代理,并使用 RunFromPackage、Zip 部署和 Kudu REST API的基础部署技术。

该任务适用于 Azure Functions 支持的语言

任务的先决条件

需要在目标计算机中设置以下先决条件才能使任务正常工作。

Azure 函数

该任务用于将 Azure Functions 项目部署到现有的 Azure Function。 运行任务之前,应存在 Azure 函数应用。 可以从 Azure 门户创建 Azure Function App。 或者,Azure PowerShell 任务 可用于 AzureRM PowerShell 脚本 来预配和配置 Azure 函数应用。

该任务可用于部署 Azure Functions (Windows/Linux)。

Azure 订阅

若要部署到 Azure,必须使用“帐户管理”部分中的“服务”选项卡将 Azure 订阅链接到 Azure Pipelines。 通过打开“帐户管理”屏幕(屏幕右上角的齿轮图标),然后单击“服务”选项卡,添加要在“生成”或“发布管理”定义中使用的 Azure 订阅。

创建 ARM 服务终结点,并使用 Azure 资源管理器 终结点类型。 有关详细信息,请按照此处链接 中列出的步骤操作。

该任务不适用于 Azure 经典服务终结点,并且不会在任务中的参数中列出这些连接。

部署方法

此任务提供了多个部署方法。

若要在设计器任务中更改基于包的部署选项,请展开 其他部署选项 并启用 选择部署方法

根据 Azure 应用服务和 Azure Pipelines 代理的类型,该任务使用合适的部署技术。 任务使用的部署技术如下所示:

默认情况下,任务会尝试根据输入包、应用服务类型和代理 OS 选择适当的部署技术。

  • 如果提供了部署后脚本,请使用 Zip 部署。
  • 如果应用服务类型是 Linux 上的 Web 应用,请使用 Zip 部署。
  • 如果提供了 .war 文件,请使用 War Deploy。
  • 如果提供了.jar文件,请使用 Run-From-Zip。
  • 对于所有其他任务,请使用“从包运行”(通过 Zip 部署)。

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

Kudu REST API

当目标为 Windows 上的 Web 应用、Linux 上的 Web 应用(内置源)或函数应用时,Kudu REST API 适用于 Windows 和 Linux 自动化代理。 该任务使用 Kudu 将文件复制到 Azure 应用服务。

Zip 部署

Zip 部署从所选的包或文件夹中创建 .zip 部署包。 然后,它将文件内容部署到 Azure 中应用服务名称函数应用的 wwwroot 文件夹。 此选项覆盖 wwwroot 文件夹中的所有现有内容。 有关详细信息,请参阅 Azure FunctionsZip 部署。

从包运行

从包运行会创建与 Zip 部署相同的部署包。 Functions 运行时将装载整个包,而不是将文件部署到 wwwroot 文件夹。 使用此选项时,wwwroot 文件夹中的文件变为只读。 有关详细信息,请参阅 从包文件运行 Azure Functions。

故障 排除

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

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

SSL 错误

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

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

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

5xx 错误代码

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

Azure 函数突然停止工作

如果自上次部署以来超过一年,Azure Functions 可能会突然停止工作。 如果在“deploymentMethod”中使用“RunFromPackage”进行部署,则会生成过期日期为 1 年的 SAS,并将其设置为应用程序配置中的“WEBSITE_RUN_FROM_PACKAGE”值。 Azure Functions 使用此 SAS 引用包文件来执行函数,因此,如果 SAS 已过期,则不会执行该函数。 若要解决此问题,请再次部署,以生成到期日期为一年的 SAS。

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

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

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

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

  1. 在生成解决方案任务中,将 MSBuild 参数 更改为 /p:DeployOnBuild=true /p:DeployDefaultTarget=WebPublish /p:WebPublishMethod=FileSystem /p:DeleteExistingFiles=True /p:publishUrl="$(System.DefaultWorkingDirectory)\\WebAppContent"

    显示生成解决方案值的屏幕截图。

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

    1. 根文件夹或文件更改为存档$(System.DefaultWorkingDirectory)\\WebAppContent

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

      显示存档值的屏幕截图。

Windows 上的函数应用部署成功,但应用不起作用

如果应用中不存在 web.config 文件,则可能会出现此问题。 可以将 web.config 文件添加到源,也可以使用任务的 应用程序和配置设置 自动生成一个文件。

  1. 选择该任务,然后转到 为 Python、Node.js、Go 和 Java 应用生成 web.config 参数

    显示“生成 web.config 参数”部分的屏幕截图。

  2. 选择“更多”按钮(...)下的“为 Python、Node.js、Go 和 Java 应用生成 web.config 参数, 编辑参数:

    显示生成 web.config 参数的 屏幕截图。

  3. 应用程序框架 列表中选择应用程序类型。

  4. 选择“确定”。 这样做将填充生成 web.config 文件所需的 web.config 参数。

常见问题解答

如何配置服务连接?

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

如何使用 Application Insights 配置 Web 作业部署?

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

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

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

无法使用 Azure 资源管理器服务连接和Microsoft托管代理部署到内部应用服务环境

根据设计,Microsoft托管的代理不适用于应用服务环境。 相反,需要在与应用服务环境位于同一虚拟网络中的虚拟机上配置专用代理。 此外,设置专用 DNS 区域以启用资源之间的通信。

例子

下面是在 Windows 上部署 Azure 函数的示例 YAML 代码片段:


variables:
  azureSubscription: Contoso
  # To ignore SSL error, uncomment the below variable
  # VSTS_ARM_REST_IGNORE_SSL_ERRORS: true

steps:
- task: AzureFunctionApp@2
  displayName: Azure Function App Deploy
  inputs:
    azureSubscription: $(azureSubscription)
    appName: samplefunctionapp
    appType: functionApp
    package: $(System.DefaultWorkingDirectory)/**/*.zip

若要在 Linux 上部署函数,请添加 appType 参数并将其设置为 appType: functionAppLinux。 如果未指定值,则 functionApp 为默认值。

若要将部署方法显式指定为 Zip Deploy,请添加参数 deploymentMethod: zipDeploy。 此参数的另一个支持值是 runFromPackage。 如果未指定值,则 auto 为默认值。

有关如何创建 CI/CD 管道的演练,请参阅 生成 Java 并将其部署到 Azure Functions

要求

要求 描述
管道类型 YAML,经典版本,经典版本
运行时间 代理,DeploymentGroup
需求 没有
功能 此任务不满足作业中后续任务的任何要求。
命令限制 任何
Settable 变量 任何
代理版本 2.104.1 或更高版本
任务类别 部署