传递Pipeline步骤参数时env变量解析失败的技术求助
解决Azure DevOps Pipeline模板参数中表达式解析失败的问题
问题原因
你在pipeline.yaml里把带${{ env.region }}的步骤传给模板的prePlanSteps参数时,这个表达式会在父流水线的解析阶段就被执行,但此时模板循环里的env对象还不存在,所以触发了"Unrecognized value: 'env'"错误。而模板内联的步骤因为在循环上下文里解析,所以能正常运行。
解决方案
有两种可行的方法让表达式延迟到模板执行时再解析:
方法1:双重美元符号转义表达式
把${{ env.region }}改成${{ '${{ env.region }}' }},这样父流水线会把内部的表达式当作字符串传递,到模板循环的上下文里再执行解析:
修改后的pipeline.yaml:
extends: template: template.yml parameters: envList: - name: dev region: myRegion prePlanSteps: - bash: | echo region = ${{ '${{ env.region }}' }} displayName: preplansteps_test name: preplansteps_test
方法2:通过Job变量间接引用
先在模板的Job里把env.region定义为变量,再在传递的步骤里引用这个变量:
第一步修改template.yaml:
parameters: - name: envList type: object - name: prePlanSteps type: stepList default: [] - ${{ each env in parameters.envList }}: - stage: "${{ env.name }}Build" jobs: - job: 'Plan' variables: currentRegion: ${{ env.region }} # 把模板循环的region存为Job变量 steps: - bash: | echo region = ${{ env.region }} - ${{ parameters.prePlanSteps }}
第二步修改pipeline.yaml:
extends: template: template.yml parameters: envList: - name: dev region: myRegion prePlanSteps: - bash: | echo region = $(currentRegion) displayName: preplansteps_test name: preplansteps_test
原理说明
Azure DevOps Pipeline的表达式解析分两个阶段:
- 第一阶段是父流水线解析,会先处理父文件里的所有表达式,包括传给模板的参数内容;
- 第二阶段是模板执行,在模板内部循环、渲染时,才会解析模板上下文里的表达式。
转义或者用变量间接引用,都是为了让表达式避开父阶段的解析,等到模板循环时,env对象已经存在,就能正确获取到region的值了。
内容的提问来源于stack exchange,提问作者SiBush
相关产品推荐
相关产品推荐

