Azure Pipelines:能否基于触发分支动态选择变量组?
分支触发流水线时动态选择变量组失败问题
我的配置尝试
我定义了两个变量组,想根据触发流水线的源分支选择使用其中一个,配置如下:
trigger: branches: include: - test - release/* variables: - name: isStaging value: $[eq(variables['Build.SourceBranch'], 'refs/heads/test')] - name: isRelease value: $[startsWith(variables['Build.SourceBranch'], 'refs/heads/release/')] - name: variableGroup ${{ if eq(variables['Build.SourceBranch'], 'refs/heads/test') }}: value: test_env_vars ${{ if startsWith(variables['Build.SourceBranch'], 'refs/heads/release/') }}: value: prod_env_vars
之后尝试在阶段中通过$(variableGroup)引用变量组:
stages: - stage: Intro variables: - group: $(variableGroup) jobs: [...]
触发的错误
运行后出现以下错误:
The pipeline is not valid. Stage Intro: Variable group $(variableGroup) could not be found. The variable group does not exist or has not been authorized for use.
我的疑问
我猜测目前无法通过运行时变量指定变量组,请问是否确实如此?
解答
没错,你猜的是对的——无法通过运行时变量来指定要加载的变量组。
原因在于Azure DevOps流水线的执行顺序:
- 变量组的加载是在流水线初始化阶段完成的,这一步早在运行时变量求值之前就已经执行了。
- 你用
$(variableGroup)这种方式引用的是运行时变量,但此时流水线还没到解析运行时变量的阶段,它会直接把$(variableGroup)当成变量组的名称去查找,自然找不到对应的组。
正确的做法
要实现分支对应不同变量组的需求,应该直接在阶段的变量配置里用模板表达式(${{ ... }})来判断,而不是先存成变量再引用:
stages: - stage: Intro variables: ${{ if eq(variables['Build.SourceBranch'], 'refs/heads/test') }}: - group: test_env_vars ${{ if startsWith(variables['Build.SourceBranch'], 'refs/heads/release/') }}: - group: prod_env_vars jobs: [...]
这种方式下,模板表达式会在流水线初始化阶段就求值,直接确定要加载的变量组名称,就能正常找到对应的组了。
内容的提问来源于stack exchange,提问作者mangafaua
相关产品推荐
相关产品推荐

