Azure DevOps Pipeline运行正常但网站代码未更新问题排查
Azure DevOps Pipeline部署后代码不更新问题排查与解决方案
核心问题根因
结合你提供的Pipeline配置和F1层Linux Azure App Service的运行特性,问题出在以下几个可复现的场景:
- Pipeline工作区复用导致旧代码残留
Azure DevOps默认会复用Pipeline运行的工作区目录,拉取新代码时仅做增量更新,旧的构建产物、发布包不会被主动清理。首次创建Pipeline时工作区为全新状态,构建的是最新代码,后续运行时工作区存在旧文件,会导致打包的发布包包含旧代码。
修复方案:在Pipeline根层级添加工作区清理配置,强制每次运行前清空所有旧文件:
同时在dotnet publish的arguments参数中添加workspace: clean: all--force,强制覆盖输出目录的旧文件。 - 部署未触发应用进程重启
你的AzureRmWebAppDeployment@4步骤没有显式配置重启应用的参数,Linux App Service默认会复用运行中的进程,即使文件更新了,旧进程加载的还是内存中的旧代码。F1层资源受限,进程自动重启的触发阈值更高,经常不会主动重启。
修复方案:在部署任务的inputs中添加RestartApp: true参数,强制部署完成后重启应用进程:
额外添加的- task: AzureRmWebAppDeployment@4 inputs: # 原有配置保持不变 RestartApp: true AppSettings: '-WEBSITE_LOCAL_CACHE_OPTION Off'WEBSITE_LOCAL_CACHE_OPTION参数会关闭Azure App Service的本地文件缓存,避免文件更新后缓存未失效。 - 通配符匹配导致部署旧包
你的dotnet publish步骤用**/*.csproj匹配所有项目,发布产物全部放到同一个目录,部署步骤用*.zip匹配包文件,当存在多个zip包时,会优先匹配旧的包文件,导致部署的不是最新构建的产物。
修复方案:- 将
publishWebProjects设为true,自动匹配Web项目,排除类库等非Web项目 - 显式指定Web项目的路径,不要用全量通配符
- 发布时指定独立的输出目录,部署时直接指定完整包路径,避免通配符匹配错误
- 将
- F1层资源不足导致文件替换失败
F1层的CPU、内存配额极低,应用运行时会占用大量资源,部署过程中替换文件时会因为文件被进程占用、IO超时等问题导致部分文件未更新。
修复方案:在部署前后添加启停应用的步骤,部署前停止应用,避免文件被占用,部署完成后再启动:# 部署前停止应用 - task: AzureCLI@2 inputs: azureSubscription: '...nameOfSubscription' scriptType: 'bash' scriptLocation: 'inlineScript' inlineScript: 'az webapp stop --name ...nameOfWebApp --resource-group <你的资源组名称>' # 原有部署步骤放在中间 # 部署完成后启动应用 - task: AzureCLI@2 inputs: azureSubscription: '...nameOfSubscription' scriptType: 'bash' scriptLocation: 'inlineScript' inlineScript: 'az webapp start --name ...nameOfWebApp --resource-group <你的资源组名称>'
内容的提问来源于stack exchange,提问作者Taladan
相关产品推荐
相关产品推荐

