如何让Azure DevOps Pipeline的each迭代任务按顺序或分批并行执行?
Azure Pipeline 动态任务的串行执行与并行数量控制
一、让任务按顺序串行运行
在原有动态任务生成逻辑中,给每个任务添加依赖关系,让后一个任务必须等待前一个任务完成后再启动:
variables: - name: fruitList value: mango,peach stages: - stage: Dev jobs: - ${{ each fruitName in split(variables.fruitList, ',') }}: - job: "HELLO_${{ fruitName }}" # 除第一个任务外,其余任务依赖前一个任务 ${{ if ne(index(split(variables.fruitList, ','), fruitName), 0) }}: dependsOn: "HELLO_${{ split(variables.fruitList, ',')[index(split(variables.fruitList, ','), fruitName) - 1] }}" steps: - task: AzureCLI@2 displayName: "Step dynamic ${{ fruitName }}" inputs: scriptType: "bash" scriptLocation: "inlineScript" inlineScript: | set -xe set -o nounset echo "${{ fruitName }}"
原理:通过index函数获取当前水果在列表中的位置,第一个任务不设置依赖,后续每个任务都依赖列表中前一个水果对应的任务,从而实现串行执行。
二、控制最大并行任务数量(更优方案)
推荐使用Matrix 策略生成动态任务,通过maxParallel参数直接控制同时运行的最大任务数,这种方式比手动设置依赖更简洁:
variables: - name: fruitList value: mango,peach stages: - stage: Dev jobs: - job: HelloFruits strategy: matrix: # 遍历水果列表生成矩阵项 ${{ each fruitName in split(variables.fruitList, ',') }}: ${{ fruitName }}: fruitName: ${{ fruitName }} # 设置最大并行任务数,例如设为1则串行,设为2则最多2个任务同时运行 maxParallel: 2 steps: - task: AzureCLI@2 displayName: "Step dynamic $(fruitName)" inputs: scriptType: "bash" scriptLocation: "inlineScript" inlineScript: | set -xe set -o nounset echo "$(fruitName)"
原理:Matrix 策略会自动为每个水果生成独立的任务实例,maxParallel参数直接限制并行运行的任务数量,无需手动管理依赖,适合批量任务的并行度控制。
内容的提问来源于stack exchange,提问作者Joost Döbken
相关产品推荐
相关产品推荐

