如何在Azure DevOps YAML流水线的参数化stepList内部引用参数
问题原因与解决方案
报错根因
这是Azure DevOps YAML 模板的固有语法限制:参数的默认值在参数解析阶段处理,此时同层级的其他参数还未完成解析,因此不允许在stepList类型参数的默认值内部使用模板表达式引用同层级的其他参数。
可行解决方法
不要把默认步骤逻辑写在preBuildSteps的default配置里,改在模板的执行步骤部分做分支判断,完全可以满足兼容现有调用方、支持自定义传入的需求,操作如下:
- 调整参数配置,将
preBuildSteps的默认值设为空数组
parameters: - name: artifactName displayName: Name of the app artifact published to the pipeline type: string - name: preBuildSteps displayName: 'Pre-Build Steps' type: stepList default: []
- 在模板的
steps执行段增加逻辑判断:如果调用方没有传入自定义的preBuildSteps,就执行你预设的默认下载步骤,否则执行调用方传入的步骤
steps: # 无自定义前置步骤时走默认逻辑 - ${{ if eq(length(parameters.preBuildSteps), 0) }}: - task: DownloadPipelineArtifact@2 displayName: Download app artifact inputs: artifact: '${{parameters.artifactName}}' path: '$(Build.ArtifactStagingDirectory)/app' # 有自定义前置步骤时执行传入内容 - ${{ else }}: - ${{ parameters.preBuildSteps }} # 此处接你原有模板的其余构建步骤
该方案没有任何破坏性变更:现有调用方不需要修改任何代码,会自动执行默认的下载步骤;需要自定义前置步骤的调用方传入对应的stepList即可生效。
之前尝试方案无效的原因
- 不管加不加单引号,模板表达式
${{}}在参数默认值上下文都是被禁止的,和写法无关 - 宏语法
$()是运行时解析的规则,而参数默认值是编译期解析阶段处理的,时序上不匹配 - 参数默认值的解析优先级高于变量赋值,所以先赋值变量再引用的方式也无法生效
内容的提问来源于stack exchange,提问作者Vergil C.
相关产品推荐
相关产品推荐

