如何在单个Azure DevOps YAML构建中按顺序同步不同测试作业?
解决方案
核心思路
利用Azure DevOps Server 2020支持的YAML模板表达式循环+阶段串行控制能力,不需要硬编码16个作业的依赖关系,仅需少量通用配置即可实现要求的同步逻辑:
- 按
MaxDOP降序拆分独立阶段,阶段间串行执行,天然保证不同MaxDOP的作业不会并发 - 每个MaxDOP阶段内用矩阵并行跑对应所有
AgentCount的测试作业,自动满足同AgentCount下高MaxDOP作业先完成的要求 - 首尾单独配置Prepare和Cleanup阶段,统一管控依赖
完整YAML示例
trigger: none # 定义测试维度变量 variables: - name: maxDopList value: 4,3,2,1 - name: agentCountList value: 3,4,5,6 stages: # 首个Prepare阶段 - stage: Prepare jobs: - job: PrepareJob pool: 你的驱动构建代理池 steps: - pwsh: | # 这里写你的准备逻辑,比如SUT环境重置、测试参数初始化等 Write-Host "测试环境准备完成" displayName: 执行准备操作 # 循环生成每个MaxDOP对应的测试阶段 - ${{ each maxDop in split(variables.maxDopList, ',') }}: - stage: Test_MaxDOP_${{ maxDop }} # 第一个MaxDOP阶段依赖Prepare,其余依赖前一个更高MaxDOP的阶段 dependsOn: ${{ if eq(maxDop, 4) }}: Prepare ${{ else }}: Test_MaxDOP_${{ add(int(maxDop), 1) }} jobs: # 每个阶段内用矩阵并行跑所有AgentCount的作业 - job: Test_Job strategy: matrix: ${{ each agentCount in split(variables.agentCountList, ',') }}: Agent_${{ agentCount }}: AgentCount: ${{ agentCount }} MaxDOP: ${{ maxDop }} pool: 你的驱动构建代理池 steps: - pwsh: | # 这里写你的构建触发逻辑,调用REST API给SUT队列对应参数的PR构建 Write-Host "启动测试:MaxDOP=$(MaxDOP), AgentCount=$(AgentCount)" # 轮询等待SUT上$(AgentCount)个并发构建全部完成再结束当前作业 displayName: 执行测试(MaxDOP: $(MaxDOP), 代理数: $(AgentCount)) # 最终Cleanup阶段,依赖最后一个MaxDOP=1的测试阶段 - stage: Cleanup dependsOn: Test_MaxDOP_1 jobs: - job: CleanupJob pool: 你的驱动构建代理池 steps: - pwsh: | # 这里写清理逻辑,比如SUT环境重置、测试结果汇总等 Write-Host "所有测试完成,执行清理操作" displayName: 执行清理操作
逻辑说明
- 阶段执行顺序固定为
Prepare → MaxDOP4 → MaxDOP3 → MaxDOP2 → MaxDOP1 → Cleanup,完全满足不同MaxDOP作业不并发的要求 - 同AgentCount的测试作业按MaxDOP从高到低依次执行,天然满足同AgentCount下高MaxDOP作业的前置依赖要求
- 每个MaxDOP阶段内4个AgentCount作业并行执行,符合并发控制逻辑
- 无需硬编码16个作业的依赖关系,后续调整测试矩阵仅需修改
maxDopList和agentCountList变量即可
内容的提问来源于stack exchange,提问作者mark
相关产品推荐
相关产品推荐

