Azure DevOps YAML管道加载报错:重复键已添加问题求助
问题分析与解决
错误原因
你遇到的An error occurred while loading the YAML build pipeline. An item with the same key has already been added错误,核心原因是阶段名称重复。
你的嵌套循环逻辑会生成12个阶段(3个namespace × 2个DCR × 2个OSC),但你定义的阶段名称仅依赖namespace,这意味着同一个namespace(比如development)对应的4个阶段都会使用完全相同的名称deploy-"development"。Azure DevOps不允许管道中存在重复的阶段标识,因此触发报错。
另外还有两个小问题:
HELM_VALUES里的global.data_center=${{ DCR }}引用了大写的DCR参数,而非循环变量dcr,会导致取到整个数据中心数组而非当前循环的具体值。- 部署作业的
displayName写死为Deploy to DCR1,无法区分不同数据中心的部署任务。
解决方案
修改阶段名称,将dcr和osc的信息纳入,确保每个阶段名称唯一。同时修正变量引用和显示名称的问题。
修改后的deploy-env.yaml
parameters: - name: OPENSHIFT_NAMESPACE displayName: 'OpenShift namespace' type: object values: [] - name: DCR displayName: 'Data Center' type: object values: [] - name: OSC displayName: 'Openshift service connection' type: object values: [] stages: - ${{ each namespace in parameters.OPENSHIFT_NAMESPACE }}: - ${{ each dcr in parameters.DCR }}: - ${{ each osc in parameters.OSC }}: - stage: deploy-${namespace}-${dcr}-${osc} jobs: - deployment: deploy_to_${dcr}_${osc} environment: ${{ namespace }} displayName: 'Deploy to ${{ dcr }} (${{ osc }})' strategy: runOnce: deploy: steps: - template: steps/deploy_to_cluster_with_helm_templating.yml@pipeline_templates parameters: DATA_CENTER: ${{ dcr }} OPENSHIFT_NAMESPACE: ${{ namespace }} OPENSHIFT_SERVICE_CONNECTION: '${{ osc }}' HELM_VALUES: - 'global.namespace=${{ namespace }}' - 'global.data_center=${{ dcr }}'
关键修改点
- 阶段名称改为
deploy-${namespace}-${dcr}-${osc},确保每个组合的阶段名称唯一(比如deploy-development-dcr1-OCP4DCR1)。 - 部署作业名称改为
deploy_to_${dcr}_${osc},避免潜在的作业名称重复问题。 - 修正
HELM_VALUES中的变量引用为${{ dcr }},确保取到当前循环的具体数据中心值。 - 动态设置
displayName为'Deploy to ${{ dcr }} (${{ osc }})',清晰展示部署目标。
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

