Azure Pipeline部署失败:修改文件权限时出错
核心错误分析
部署日志明确提示 Error in changing file permissions : 124,这是ZIP部署过程中Kudu尝试修改文件/目录权限时触发的错误,通常和目标目录权限锁定、部署包内特殊权限文件、App Service运行环境限制有关。
排查与修复步骤
检查部署包内的文件权限配置
构建生成的ZIP包中如果包含带有特殊权限(如Linux下的SUID/SGID位)的文件,Kudu在解压后尝试修改权限时会失败。可以在构建阶段添加步骤,清理这类特殊权限:# Linux/macOS构建环境,递归移除SUID/SGID位 chmod -R u-s,g-s $(Build.ArtifactStagingDirectory)或者在Windows环境下,通过PowerShell重置权限:
Get-ChildItem $(Build.ArtifactStagingDirectory) -Recurse | ForEach-Object { $_.Attributes = $_.Attributes -band (-bnot [System.IO.FileAttributes]::ReadOnly) }启用App Service的“从ZIP运行”模式
跳过解压和权限修改步骤,直接从ZIP包运行应用。在Azure Portal的App Service配置中,开启常规设置里的从包运行选项,或者在Pipeline的Azure App Service部署任务中添加参数:- task: AzureWebApp@1 inputs: azureSubscription: 'Your-Subscription' appName: 'app-dev-django' package: '$(Build.ArtifactStagingDirectory)/**/*.zip' runtimeStack: 'PYTHON|3.9' startUpCommand: 'gunicorn --bind=0.0.0.0 --workers=4 myapp.wsgi' enableCustomDeployment: true deploymentMethod: 'zipDeploy' deployFromZip: true # 启用从ZIP运行手动清理App Service的目标目录
通过App Service的高级工具(Kudu控制台)进入site/wwwroot目录,手动删除现有文件后重新部署。或者在Pipeline中添加前置任务,调用Kudu API清空目录:# 使用curl调用Kudu API删除wwwroot目录下所有内容 curl -X DELETE -u "$(app-username):$(scm-password)" https://<app-name>.scm.azurewebsites.net/api/vfs/site/wwwroot/注:
<app-name>替换为你的App Service名称,$(app-username)和$(scm-password)可从App Service的发布配置文件中获取。检查App Service的文件系统锁定
如果应用进程正在占用某些文件,会导致Kudu无法修改权限。可以在部署前添加步骤,停止App Service,部署完成后再启动:- task: AzureAppServiceManage@0 inputs: azureSubscription: 'Your-Subscription' Action: 'Stop Azure App Service' WebAppName: 'app-dev-django' # 部署任务... - task: AzureAppServiceManage@0 inputs: azureSubscription: 'Your-Subscription' Action: 'Start Azure App Service' WebAppName: 'app-dev-django'切换部署方法至Web Deploy
放弃ZIP Deploy,改用Web Deploy方式,避免权限修改环节的冲突。在Pipeline中修改部署任务为:- task: AzureWebApp@1 inputs: azureSubscription: 'Your-Subscription' appName: 'app-dev-django' package: '$(Build.ArtifactStagingDirectory)/**/*.zip' deploymentMethod: 'webDeploy'
额外提示
如果以上方法无效,可通过App Service高级工具访问Kudu的详细追踪日志(LogFiles/kudu/trace目录),里面会包含权限修改失败的具体文件路径,针对性处理该文件的权限配置即可。
内容的提问来源于stack exchange,提问作者Josh Nassif

