Azure DevOps管道DeleteFiles@1因目录被占用持续失败求助
问题场景
在Azure DevOps经典CI构建管道中,最后一步执行DeleteFiles@1清理CI文件时持续失败,报错:
##[error]Error: Failed rmRF: Command failed: rd /s /q "c:\agent_work\173\s"
提示文件被其他进程占用,但此时仅剩余s目录,资源监视器未检测到进程占用该目录,且手动通过文件资源管理器可正常删除。已设置10次重试,每次均报相同错误。手动删除该目录后重试,又出现新错误:
##[warning]RetryHelper encountered exception, will retry (attempt #: 7 An error occurred trying to start process 'c:\agent\externals\node16\bin\node.exe' with working directory 'c:\agent_work\173\s'. The directory name is invalid.) afer 49000 ms
怀疑node.exe与删除命令存在目录访问冲突,或node.exe本身参与了删除操作。当前DeleteFiles@1步骤配置如下:
Source Folder: $(Agent.BuildDirectory) Contents: * Remove SourceFolder: yes Remove files starting with a dot: yes
解决方法
拆分删除操作,避免直接删除根目录
不要直接将Source Folder设为$(Agent.BuildDirectory)并勾选Remove SourceFolder,改为分两步执行:- 第一步
DeleteFiles@1配置:Source Folder: $(Agent.BuildDirectory)\s Contents: * Remove SourceFolder: no Remove files starting with a dot: yes - 第二步添加
CmdLine@2步骤,执行命令删除空的s目录:if exist "$(Agent.BuildDirectory)\s" rd /s /q "$(Agent.BuildDirectory)\s"
- 第一步
强制清理残留node进程
在删除步骤前添加命令行步骤,终止所有关联的node.exe进程,消除潜在的后台占用:taskkill /f /im node.exe >nul 2>&1调整删除步骤的工作目录
显式设置DeleteFiles@1的WorkingDirectory为$(Agent.BuildDirectory),避免node.exe重试时尝试在已删除的s目录启动。改用PowerShell命令替代DeleteFiles@1
使用PowerShell的递归删除命令,增加重试逻辑确保目录被移除:Remove-Item -Path "$(Agent.BuildDirectory)\s" -Recurse -Force -ErrorAction SilentlyContinue do { Start-Sleep -Seconds 2 } while (Test-Path "$(Agent.BuildDirectory)\s")
内容的提问来源于stack exchange,提问作者komodosp

