You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何动态在池内所有测试计算机上运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 12:55:33