You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Function部署后偶现运行旧代码问题排查求助

Azure Function部署后仍运行旧代码:原因分析与解决方案

我之前也遇到过类似的棘手问题——部署完.NET Core Azure Function后,偶尔还是会跑旧代码,部署日志全绿、手动重启也不管用,只能删了重建凑活。结合你提供的ARM模板和CI/CD配置,我来拆解可能的原因和靠谱的解决办法:

可能的问题根源

1. Azure Files存储同步延迟或文件锁定

你已经在ARM里加了WEBSITE_ENABLE_SYNC_UPDATE_SITE: true来强制同步内容,但因为你的函数用了Azure Files作为内容存储(配置了WEBSITE_CONTENTAZUREFILECONNECTIONSTRING和WEBSITE_CONTENTSHARE),有时候会出现文件被进程锁定、或者存储层同步慢半拍的情况,导致新代码没被正确加载。

2. 实例没被彻底回收(尤其是消耗计划)

如果用的是消耗计划,Azure会动态增减实例,旧实例可能没被及时杀掉,还在跑旧代码;就算是专用计划,进程里的旧程序集可能没被卸载,内存里还留着老版本。

3. 部署包缓存没清干净

AzureFunctionApp@1任务默认会缓存部署包,如果没配置清理参数,偶尔会出现复用旧包的情况,看起来部署成功了,其实代码根本没换。

4. 运行时版本不匹配

你的ARM里FUNCTIONS_EXTENSION_VERSION设的是~3,对应.NET Core 3.1。如果你的项目实际是.NET 6或更高版本,版本不兼容会导致加载异常,间接出现“跑旧代码”的假象(其实是加载失败 fallback到旧代码)。

针对性解决办法

1. 改用Run From Package模式部署

这是解决文件锁定问题的终极方案——让函数直接从部署包运行,绕开文件系统操作。修改你的YAML部署任务:

- task: AzureFunctionApp@1
  displayName: 'Azure functions app deploy'
  inputs:
    azureSubscription: '$(azureSubscription)'
    appType: functionApp
    appName: $(myAppName)
    package: '$(Pipeline.Workspace)/drop/$(Build.BuildId).zip'
    deploymentMethod: 'runFromPackage' # 强制用包运行模式
    additionalArguments: '--clean true' # 清理旧文件残留

同时在ARM模板的appSettings里加一行,强制开启这个模式:

{
  "name": "WEBSITE_RUN_FROM_PACKAGE",
  "value": "1",
  "slotSetting": false
}

2. 部署后强制重启所有实例

部署完直接用Azure CLI重启函数应用,确保所有实例都加载新代码,别依赖自动重启:

- task: AzureCLI@2
  displayName: 'Force Restart Function App'
  inputs:
    azureSubscription: '$(azureSubscription)'
    scriptType: 'bash'
    scriptLocation: 'inlineScript'
    inlineScript: |
      az functionapp restart --name $(myAppName) --resource-group $(resourceGroupName)

记得把$(resourceGroupName)换成你的资源组名称,这个步骤能彻底杀掉旧进程,加载新代码。

3. 核对运行时版本

确认FUNCTIONS_EXTENSION_VERSION和你的项目目标框架匹配:

  • .NET Core 3.1 → ~3
  • .NET 6 → ~4
  • .NET 7/8 → ~4(目前Function runtime 4.x支持这两个版本)
    版本不匹配会导致各种加载异常,一定要对齐。

4. 检查构建输出完整性

确认你的DotNetCoreCLI构建任务生成的包是完整的,--output $(System.DefaultWorkingDirectory)/publish_output这个路径下的文件要包含所有函数的dll、配置文件等,避免部署包缺失导致旧代码被复用。

额外排查技巧

  • 去函数应用的部署中心看详细日志,有时候表面部署成功,实际有文件复制失败的警告,藏在日志里。
  • 用Application Insights追踪函数执行时的程序集版本,确认是不是真的在跑旧代码,别把业务逻辑缓存当成代码没更新。
  • 如果用了部署槽位,确认部署到了正确的槽位,并且完成了槽位交换(如果需要的话)。

内容的提问来源于stack exchange,提问作者Michael Kreeger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 19:12:56