Azure Pipeline同一流水线多次checkout同一仓库报相同键已添加如何解决
问题根源
Azure DevOps YAML流水线在编译解析阶段,会自动将所有checkout步骤中引用的远程仓库注册为流水线资源,同一个仓库重复注册时就会触发你遇到的报错:
An error occurred while loading the YAML build pipeline. An item with the same key has already been added.
该错误是YAML预校验阶段触发,和运行期agent的实际拉取行为无关。
可行解决方案
以下两种方案都可以满足多隔离环境agent独立拉取代码的需求:
方案1:主流水线前置声明仓库资源(优先推荐)
改动最小,无需调整原有流水线的阶段、作业结构:
- 在主
azure-pipelines.yml的最顶部(trigger节点上方)添加全局资源声明,提前注册需要拉取的仓库并设置固定别名:
resources: repositories: - repository: srcRepo type: git name: xxxxx/yyyyy # 和你原有checkout语句中的仓库路径保持一致 trigger: none # 原有参数、阶段配置保持不变
- 修改
Procedures/Common.yml中的checkout步骤,直接引用提前声明的别名即可,不会触发重复资源注册:
steps: - checkout: srcRepo # 替换原有git://开头的仓库路径 ref: $(Build.SourceBranchName) clean: true enabled: true timeoutInMinutes: 1 # 后续Python版本选择、依赖安装步骤保持不变
方案2:自定义独立检出路径
如果不想添加全局资源声明,也可以通过给每个checkout指定全局唯一的检出路径避免冲突:
修改Procedures/Common.yml的checkout步骤,添加path参数,使用流水线内置的唯一变量保证路径不重复:
steps: - checkout: git://xxxxx/yyyyy@$(Build.SourceBranchName) path: $(System.JobId) # 每个Job的ID全局唯一,不会出现路径冲突 clean: true enabled: true timeoutInMinutes: 1 # 后续步骤保持不变
采用该方案需要同步调整Procedures/Export.yml中Python脚本的路径,代码会被检出到$(Agent.BuildDirectory)/$(System.JobId)目录下,修改scriptPath参数匹配对应路径即可。
一键多环境部署优化
如果你需要一次触发同时完成多个vLAN的部署,直接删除主流水线中两个stage的condition判断即可,两个环境的stage会并行执行,无需用户手动选择参数,完全符合你简化操作的需求。
内容的提问来源于stack exchange,提问作者Mike0684
相关产品推荐
相关产品推荐

