Azure DevOps:如何防止agent phases结束后artifacts被删除?
解决Release Pipeline多Agent Phase切换时Artifacts被清空的问题
我之前也碰到过一模一样的情况!本质原因是每个Agent Phase(也就是咱们常说的Agent Job)默认会使用独立的临时工作目录,而且很多Agent配置会在Job结束后自动清理目录,导致之前下载好的Artifacts直接丢失。下面给你几个亲测有效的解决办法:
1. 把Artifacts存到Agent的全局共享目录
默认的$(System.DefaultWorkingDirectory)是每个Job专属的临时目录,Job跑完大概率会被清掉。你可以换个思路,把Artifacts下载到Agent机器上的全局共享路径:
- 在下载Artifacts的任务里,把「下载路径」改成
$(Agent.WorkFolder)/SharedTestArtifacts(这个路径是Agent的全局工作文件夹,所有Job都能访问到) - 后面所有Phase里的任务,都用这个固定路径去引用Artifacts,别再用默认的工作目录了
只要所有Phase都跑在同一台Agent上,就能直接复用已经下载好的文件,不用重复下载。
2. 关掉Agent Job的自动清理开关
你可以检查下Agent Job的设置,看看是不是开了自动清理:
- 编辑对应的Agent Job,找到「高级」或者「附加选项」
- 找到「清理」(Clean)这个选项,把它设为
false(或者选「不清理工作目录」) - 这样Job结束后就不会删掉目录里的内容,后续Phase就能直接用之前的Artifacts了
⚠️ 注意:如果你的Pipeline会分配到不同的Agent机器上运行多个Phase,这个方法就没用了,毕竟不同机器的本地目录是完全独立的。
3. 强制所有Phase用同一台Agent
如果你的Agent池有多台机器,默认是随机分配的,这时候得让所有Phase都绑定到同一台Agent:
- 编辑每个Agent Job的「需求」设置
- 添加一个自定义需求,比如直接指定Agent的名称:
Agent.Name -equals YourSpecificAgentName;或者给目标Agent加个自定义Capability(比如在Agent配置里加TestEnv -equals true),然后在Job需求里加上TestEnv -equals true - 这样所有Phase都会被分配到满足需求的那台Agent上,再结合上面的固定路径或者关闭清理选项,就能完美复用Artifacts了
特殊情况处理
如果你的Pipeline必须跨Agent运行(比如要测试不同环境),那本地复用Artifacts就行不通了。这时候可以把Artifacts发布到Pipeline的共享存储库,每个Phase都从共享库下载,虽然会多花点下载时间,但能保证每个Agent都拿到最新的Artifacts。
内容的提问来源于stack exchange,提问作者Konzy262
相关产品推荐
相关产品推荐

