Azure Pipelines循环内if条件失效问题排查与解决
排查Azure Pipelines循环内if条件不生效问题
问题场景
配置Azure Pipelines时遇到两个异常:
- 遍历
branchMapping参数,尝试通过if条件匹配Build.SourceBranch为environment变量赋值,但变量输出为空 - 循环内判断
Build.SourceBranchName与分支名的if语句无任何输出
原配置代码如下:
parameters: - name: containerRegistry displayName: Azure Container Registry Service Connection type: string default: 'acr-amaest' values: - acr-amaest - name: deploymentSteps type: stepList default: - script: echo "Add your deployment steps to your template" displayName: Empty deployment step - name: branchMapping type: object default: develop: build staging: staging main: release variables: - name: environment ${{ each branch in parameters.branchMapping }}: ${{ if eq(variables['Build.SourceBranch'], 'refs/heads/${{ branch.Key }}') }}: value: ${{ branch.Value }} stages: - stage: Test displayName: 🚀 Test jobs: - job: steps: # Printing empty string - bash: | echo ${{ variables['environment'] }} # Works, prints everything - ${{ each branch in parameters.branchMapping }}: - bash: echo '${{ branch.Key }} -> ${{ branch.Value }} against ${{ variables['Build.SourceBranch'] }}' # Prints nothing - ${{ each branch in parameters.branchMapping }}: - ${{ if eq(variables['Build.SourceBranchName'], '/${{ branch.Key }}') }}: - bash: echo "Coucou ${{ branch.Key }}"
问题原因
嵌套表达式写法错误:
原变量配置中,'refs/heads/${{ branch.Key }}'属于在字符串中嵌套模板表达式的错误写法。Azure Pipelines模板引擎不会解析单引号内的${{ ... }}表达式,会把整个内容当成普通字符串,导致eq判断永远不成立,environment变量无法被赋值。Build.SourceBranchName匹配错误:
Build.SourceBranchName变量本身就是分支名称(比如develop、main),不需要在前面加斜杠/,原代码中eq(variables['Build.SourceBranchName'], '/${{ branch.Key }}')的匹配条件永远不满足,所以不会执行对应的bash步骤。
修复方案
1. 修正environment变量赋值
使用Azure Pipelines内置的format函数来拼接分支路径字符串,确保表达式能正确解析branch.Key的值:
variables: - name: environment ${{ each branch in parameters.branchMapping }}: ${{ if eq(variables['Build.SourceBranch'], format('refs/heads/{0}', branch.Key)) }}: value: ${{ branch.Value }}
2. 修正Build.SourceBranchName的判断逻辑
去掉分支名前的斜杠,直接比较Build.SourceBranchName和branch.Key:
- ${{ each branch in parameters.branchMapping }}: - ${{ if eq(variables['Build.SourceBranchName'], branch.Key) }}: - bash: echo "Coucou ${{ branch.Key }}"
完整修复后示例
parameters: - name: containerRegistry displayName: Azure Container Registry Service Connection type: string default: 'acr-amaest' values: - acr-amaest - name: deploymentSteps type: stepList default: - script: echo "Add your deployment steps to your template" displayName: Empty deployment step - name: branchMapping type: object default: develop: build staging: staging main: release variables: - name: environment ${{ each branch in parameters.branchMapping }}: ${{ if eq(variables['Build.SourceBranch'], format('refs/heads/{0}', branch.Key)) }}: value: ${{ branch.Value }} stages: - stage: Test displayName: 🚀 Test jobs: - job: steps: - bash: | echo ${{ variables['environment'] }} - ${{ each branch in parameters.branchMapping }}: - bash: echo '${{ branch.Key }} -> ${{ branch.Value }} against ${{ variables['Build.SourceBranch'] }}' - ${{ each branch in parameters.branchMapping }}: - ${{ if eq(variables['Build.SourceBranchName'], branch.Key) }}: - bash: echo "Coucou ${{ branch.Key }}"
内容的提问来源于stack exchange,提问作者Arnaud F.
相关产品推荐
相关产品推荐

