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

