为何Azure DevOps构建管道Initialize job及NuGet任务耗时过长?
问题原因说明
两个自托管代理版本一致但运行行为不同,核心原因是对接的Azure DevOps组织不同,触发了不同的任务缓存策略:
- Azure DevOps内置了任务压缩下载特性,该特性可由DevOps组织后台的灰度开关、代理端配置参数共同控制。运行速度快的代理要么对接的组织禁用了该特性,要么代理本身配置了
DISABLE_TASK_ZIP_DOWNLOAD=true参数,因此会直接将解压后的任务文件持久化存储在_tasks目录,每次管道运行直接调用无需重复处理。 - 运行慢的代理对接的组织启用了任务压缩下载特性,且代理端未禁用该逻辑,因此会将任务以zip压缩包形式下载到
_taskzips目录,每次管道运行都需要临时将压缩包解压到_tasks目录,体积较大的任务(如NuGetCommand)解压过程会消耗大量时间。 - 若慢代理的运行身份对
_tasks目录没有长期写入权限,也会导致解压后的任务无法被持久缓存,每次运行都要重复执行解压操作。
优化方案
按照以下步骤操作即可让慢代理的运行效率和快代理一致:
- 在慢代理所在的服务器上添加系统环境变量,变量名为
DISABLE_TASK_ZIP_DOWNLOAD,值设为true,强制代理禁用任务压缩下载策略。 - 重启Azure DevOps代理服务,让环境变量配置生效。
- 手动删除慢代理工作目录下的
_taskzips文件夹,以及_tasks文件夹内的所有旧任务目录,触发代理首次运行时重新拉取未压缩的任务文件并持久化缓存。 - 确认慢代理的运行身份对
E:\Agent3\_work目录拥有完全控制权限,避免缓存写入失败。
如果需要快速生效,也可以直接将快代理_tasks目录下的所有任务文件夹完整复制到慢代理的_tasks目录,保持文件夹结构一致即可,代理检测到已存在解压后的任务文件,会直接跳过解压步骤。
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

