策略矩阵变量在displayName可用但condition无效的原因及报错解决
Azure Pipelines Matrix变量在Condition中失效的原因及解决方法
原因
Azure Pipelines的变量替换分为编译时和运行时两个阶段:
$(model_name)属于运行时替换,步骤执行时已经实例化了matrix中的变量,所以能在displayName里正常显示。- 用
${{ variables['model_name'] }}或${{ matrix.model_name }}时,是强制触发编译时表达式求值,但matrix变量是作业运行时才生成的实例化变量,编译阶段(模板解析、表达式计算时)根本不存在这些变量,自然会提示无效或报错。
解决方法
要基于matrix变量判断步骤是否执行,必须用运行时表达式,不要用${{ }}包裹,直接在condition中使用运行时变量语法:
jobs: - job: TestModels strategy: matrix: resnet: model_name: resnet other_var: val1 vgg: model_name: vgg other_var: val2 steps: - script: echo "Processing $(model_name)" displayName: "Process $(model_name)" # 直接用运行时表达式判断 condition: eq(variables.model_name, 'resnet')
如果确实需要在编译阶段做判断(比如模板复用场景),可以将matrix的变量提前定义为模板参数,再通过参数传递生成matrix,但这种场景较少,因为matrix本身就是为运行时多实例执行设计的。
内容的提问来源于stack exchange,提问作者Ytsen de Boer
相关产品推荐
相关产品推荐

