Azure DevOps构建失败:ArchiveFiles@2任务报ENOBUFS错误求助
Azure DevOps ArchiveFiles@2任务失败:ENOBUFS错误分析与解决建议
错误详情
执行ArchiveFiles@2任务时触发以下错误:
stderr: error: Error: spawnSync /usr/bin/zip ENOBUFS at Object.spawnSync (node:internal/child_process:1111:20) at Object.spawnSync (node:child_process:814:24) at ToolRunner.execSync (/home/vsts/work/_tasks/ArchiveFiles_d8b84976-e99a-4b86-b885-4849694435b0/2.211.0/node_modules/azure-pipelines-task-lib/toolrunner.js:879:23) at zipArchive (/home/vsts/work/_tasks/ArchiveFiles_d8b84976-e99a-4b86-b885-4849694435b0/2.211.0/archivefiles.js:152:33) at createArchive (/home/vsts/work/_tasks/ArchiveFiles_d8b84976-e99a-4b86-b885-4849694435b0/2.211.0/archivefiles.js:278:13) at doWork (/home/vsts/work/_tasks/ArchiveFiles_d8b84976-e99a-4b86-b885-4849694435b0/2.211.0/archivefiles.js:338:9) at Object.<anonymous> (/home/vsts/work/_tasks/ArchiveFiles_d8b84976-e99a-4b86-b885-4849694435b0/2.211.0/archivefiles.js:347:1) at Module._compile (node:internal/modules/cjs/loader:1105:14) at Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10) at Module.load (node:internal/modules/cjs/loader:981:32) { errno: -105, code: 'ENOBUFS', syscall: 'spawnSync /usr/bin/zip', path: '/usr/bin/zip', spawnargs: [Array] }; ##[error]Error: Archive creation failed for archive file: /home/vsts/work/1/a/release/53059.zip
当前任务配置:
- task: ArchiveFiles@2 condition: eq(variables.IS_AFFECTED, 'true') inputs: rootFolderOrFile: $(Pipeline.Workspace)/dist/${{ folder }} includeRootFolder: false archiveType: zip archiveFile: $(Build.ArtifactStagingDirectory)/release/$(Build.BuildId).zip replaceExistingArchive: true
原因分析
ENOBUFS是系统级错误,含义为无可用缓冲区空间。具体到该场景:
- ArchiveFiles@2任务通过Node.js的
spawnSync同步调用/usr/bin/zip命令,这种同步调用的缓冲区大小存在固定限制。 - 当需要打包的文件数量过多、总体积过大,或zip命令输出的日志信息超出缓冲区上限时,就会触发该错误。
解决建议
1. 精简归档内容
排除不必要的文件,减少zip命令需处理的内容与输出日志量:
修改ArchiveFiles@2任务,添加excludeFiles参数:
- task: ArchiveFiles@2 condition: eq(variables.IS_AFFECTED, 'true') inputs: rootFolderOrFile: $(Pipeline.Workspace)/dist/${{ folder }} includeRootFolder: false archiveType: zip archiveFile: $(Build.ArtifactStagingDirectory)/release/$(Build.BuildId).zip replaceExistingArchive: true excludeFiles: '**/node_modules/**, **/*.log, **/temp/**, **/*.map' # 根据实际场景调整排除规则
2. 替换为直接调用zip命令的脚本任务
绕过ArchiveFiles@2的同步缓冲区限制,用Bash任务直接执行zip命令(异步执行无缓冲区大小限制):
- bash: | mkdir -p $(Build.ArtifactStagingDirectory)/release zip -r $(Build.ArtifactStagingDirectory)/release/$(Build.BuildId).zip $(Pipeline.Workspace)/dist/${{ folder }} -x "**/node_modules/**" # 按需添加排除规则 condition: eq(variables.IS_AFFECTED, 'true')
3. 调整代理资源(若适用)
- 自托管代理:检查代理机器的内存、磁盘空间是否充足,缓冲区不足可能与系统资源紧张相关,可升级机器配置或清理磁盘冗余。
- 微软托管代理:切换到更高规格的代理实例(如
ubuntu-22.04-large),提升系统可用资源。
4. 尝试切换归档格式
将archiveType改为7z,7z的处理逻辑与zip不同,可避开缓冲区限制:
- task: ArchiveFiles@2 condition: eq(variables.IS_AFFECTED, 'true') inputs: rootFolderOrFile: $(Pipeline.Workspace)/dist/${{ folder }} includeRootFolder: false archiveType: 7z archiveFile: $(Build.ArtifactStagingDirectory)/release/$(Build.BuildId).7z replaceExistingArchive: true
内容的提问来源于stack exchange,提问作者Ultra GC
相关产品推荐
相关产品推荐

