如何动态在池内所有测试计算机上运行Job?
动态遍历代理池所有Agent运行Job的解决方案
针对你需要在代理池所有测试机上自动运行Job、无需手动维护yml配置的需求,这里提供两种原生Azure Pipelines的实现方案:
方案一:通过REST API动态生成Agent矩阵
这种方法先调用Azure DevOps REST API获取目标代理池的Agent列表,再将其作为动态矩阵的数据源,实现自动遍历所有Agent。
步骤1:添加前置阶段获取Agent列表
在pipeline中新增一个阶段,用脚本调用API获取指定代理池的Agent信息,并将Agent名称整理为JSON数组存入pipeline变量:
stages: - stage: GetAgents jobs: - job: FetchAgents pool: vmImage: 'ubuntu-latest' # 用托管代理运行这个获取脚本 steps: - powershell: | $orgUrl = "$(System.CollectionUri)" $projectName = "$(System.TeamProject)" $poolId = "你的代理池ID" # 替换为实际代理池ID,可在代理池页面URL中找到 $pat = "$(System.AccessToken)" # 调用REST API获取代理池内的Agent $agentsUrl = "$orgUrl/$projectName/_apis/distributedtask/pools/$poolId/agents?api-version=7.1-preview.1" $headers = @{ Authorization = "Bearer $pat" } $response = Invoke-RestMethod -Uri $agentsUrl -Headers $headers -Method Get # 提取在线Agent的名称(如需包含离线Agent可去掉where条件) $agentNames = $response.value | Where-Object { $_.status -eq 'online' } | Select-Object -ExpandProperty name $agentJson = $agentNames | ConvertTo-Json -Compress # 将结果设置为pipeline变量,供后续阶段使用 Write-Host "##vso[task.setvariable variable=agentList;isOutput=true]$agentJson" name: FetchAgentStep
步骤2:基于动态变量生成Job矩阵
在后续阶段中,引用上一步生成的agentList变量,用each关键字遍历每个Agent创建Job:
- stage: RunOnAllAgents dependsOn: GetAgents jobs: - ${{ each agent in fromJson(dependencies.GetAgents.outputs['FetchAgentStep.agentList']) }}: - job: RunOn_${{ replace(agent, ' ', '_') }} # 替换Agent名称中的空格避免Job名称非法 pool: name: '你的代理池名称' # 替换为实际代理池名称 demands: - Agent.Name -equals ${{ agent }} # 指定运行当前Job的Agent steps: - script: | echo "正在Agent: ${{ agent }}上运行任务" # 这里添加你的测试Job逻辑 displayName: "执行测试任务"
方案二:使用代理池的"Run on every agent"内置功能
Azure Pipelines代理池提供了一个简易选项,直接让Job在池内所有在线Agent上运行,无需手动处理矩阵:
jobs: - job: RunOnAllAgents pool: name: '你的代理池名称' demands: Agent.Name # 这个需求会强制Job在池内每个Agent上各运行一次 steps: - script: | echo "当前运行Agent: $(Agent.Name)" # 添加你的测试任务 displayName: "执行测试"
注意:这个方法会自动在池内所有在线Agent上触发Job,但无法对单个Agent的Job进行自定义配置(比如不同参数)。如果需要更灵活的控制,优先选择方案一。
关键说明
- 方案一中的代理池ID可在Azure DevOps代理池页面的URL中获取(格式类似
.../pools/123/agents,123即为池ID) - 使用
System.AccessToken需要确保运行FetchAgents任务的代理有访问代理池的权限(可在项目设置中配置) - 若需包含离线Agent,只需去掉方案一脚本中的
Where-Object { $_.status -eq 'online' }条件
内容的提问来源于stack exchange,提问作者C. Javier González Chamorro
相关产品推荐
相关产品推荐

