从Azure DevOps部署时,Linux上的Azure功能打破了需要节点v12的节点功能

时间:2020-10-08 22:29:07

标签: azure-devops azure-functions

我有一个使用计时器触发器的Nodejs Azure函数。它使用Node v12支持的一些现代Javascript语法(await,flatMap等)。

我已经用Terraform部署了基础架构,并将linuxFxVersion指定为“ node | 12”。到现在为止还挺好。当我使用内置的AzureFunctionApp @ 1任务从Azure DevOps部署代码时,它将导致该函数部署运行Node v8的新映像。这会导致我的功能中断。

这是版本定义:

steps:
- task: AzureFunctionApp@1
  displayName: 'Azure Function App Deploy: XXXXXXXXX'
  inputs:
    azureSubscription: 'XXXXXXXXX'
    appType: functionAppLinux
    appName: 'XXXXXXXXX'
    package: '$(System.DefaultWorkingDirectory)/_XXXXXXXXX/drop/out.zip'
    runtimeStack: 'DOCKER|microsoft/azure-functions-node8:2.0'
    configurationStrings: '-linuxFxVersion: node|12'

您可以看到我明确尝试强制linuxFxVersion在发行版中保持“ node | 12”。

在发行日志中,您可以看到发行尝试将linuxFxVersion 2x的配置设置为一次错误的映像,而第二次设置为“ node | 12”。 deployment task logs

释放代码后,该功能仍将运行,但是当我打印节点版本时,它将显示版本8,并且在运行时遇到不支持的语法会失败。

如果我重新运行terraform脚本,它将显示我的函数应用程序的linuxFxVersion现在设置为'DOCKER | microsoft / azure-functions-node8:2.0',并将其重新设置为“ node | 12” ”。运行之后,我的函数现在可以工作了。如果我更新代码并再次部署,它会以相同的方式再次中断。

令我更加困惑的是,这是一个v3功能应用程序,从理论上讲它根本不支持Node v8。

我是否在这里遗漏了一些明显的信息,或者只是针对Linux Functions打破了Function App发布任务?

1 个答案:

答案 0 :(得分:0)

在写下了整个大问题并进行了证明之后……我注意到了发行任务YAML中的这个小片段(我之前从未见过,因为它是一个发行版本,并且使用AzDO GUI进行编辑):

runtimeStack: 'DOCKER|microsoft/azure-functions-node8:2.0'

事实证明,如果将堆栈指定为“ JavaScript”(选项是.NET和JavaScript),则该任务会将“ runtimeStack”设置为该字符串。这是在Function App的linuxFxVersion设置中设置的。即使您在配置设置中覆盖该设置。

解决方法是将“运行时”字段保留为空白,然后它将尊重您的设置。很棒。