我有一个使用计时器触发器的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”。
释放代码后,该功能仍将运行,但是当我打印节点版本时,它将显示版本8,并且在运行时遇到不支持的语法会失败。
如果我重新运行terraform脚本,它将显示我的函数应用程序的linuxFxVersion现在设置为'DOCKER | microsoft / azure-functions-node8:2.0',并将其重新设置为“ node | 12” ”。运行之后,我的函数现在可以工作了。如果我更新代码并再次部署,它会以相同的方式再次中断。
令我更加困惑的是,这是一个v3功能应用程序,从理论上讲它根本不支持Node v8。
我是否在这里遗漏了一些明显的信息,或者只是针对Linux Functions打破了Function App发布任务?
答案 0 :(得分:0)
在写下了整个大问题并进行了证明之后……我注意到了发行任务YAML中的这个小片段(我之前从未见过,因为它是一个发行版本,并且使用AzDO GUI进行编辑):
runtimeStack: 'DOCKER|microsoft/azure-functions-node8:2.0'
事实证明,如果将堆栈指定为“ JavaScript”(选项是.NET和JavaScript),则该任务会将“ runtimeStack”设置为该字符串。这是在Function App的linuxFxVersion设置中设置的。即使您在配置设置中覆盖该设置。
解决方法是将“运行时”字段保留为空白,然后它将尊重您的设置。很棒。