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

如何并行化Jenkins任务并将测试阶段分配至不同节点?

Jenkins并行测试阶段分配至独立节点的解决方案

一、让并行测试阶段跑在不同节点

你当前的Jenkinsfile里,顶级agent { label 'win10' }会把所有阶段(包括并行的测试阶段)都绑定到同一个节点上,这就是导致测试互相干扰的核心原因。要强制每个测试阶段用独立节点,得这么改:

  1. 把全局agent改成agent none,让每个阶段自己指定运行节点
  2. 代码拉取和构建阶段还是用同一个节点(比如win10),完成后把构建产物存起来
  3. 每个并行的测试阶段单独指定不同的节点标签(比如win10-test-1、win10-test-2,前提是Jenkins集群里有对应标签的节点),并取出之前存的构建产物

修改后的Jenkinsfile示例:

pipeline {
  options {
    timeout(time: 120, unit: 'MINUTES')
    buildDiscarder(logRotator(numToKeepStr: env.BRANCH_NAME == 'master' ? '30' : '5'))
    skipDefaultCheckout()
  }
  agent none // 全局不指定节点,各阶段自行配置
  stages {
    stage('cleanWs and checkoutCode') {
      agent { label 'win10' } // 代码拉取和构建用同一个节点
      steps {
        cleanWs()
        script {
          checkoutCode()
        }
      }
    }
    stage('build') {
      agent { label 'win10' }
      steps {
        bat 'gradlew showJavaVersion'
        bat 'gradlew printVersion'
        bat 'gradlew compileKotlin compileTestKotlin compileJava compileTestJava compileIntTestJava --parallel'
        bat 'git status'
      }
      post {
        success {
          stash includes: '**/*', name: 'build-artifacts' // 保存构建产物供测试阶段使用
        }
      }
    }
    stage('tests') {
      parallel {
        stage("unit tests without ui") {
          agent { label 'win10-test-1' } // 指定第一个测试节点
          environment {
            BDP_HTTP_MOCK_PORT = 0
          }
          steps {
            unstash 'build-artifacts' // 取出构建产物
            bat 'gradlew test -x :ui:test -x :bdp-ui:test -x :bdp-mock:test -P headless=true -P maxParallelIntegrationTests=3 -P os=win --parallel'
          }
        }

        stage("mock tests") {
          agent { label 'win10-test-2' } // 指定第二个测试节点
          environment {
            BDP_HTTP_MOCK_PORT = 0
          }
          steps {
            unstash 'build-artifacts'
            bat 'gradlew :bdp-mock:test -P headless=true -P maxParallelIntegrationTests=3 -P os=win --parallel'
          }
        }
        stage("unit tests with ui") {
          agent { label 'win10-test-3' } // 指定第三个测试节点
          environment {
            BDP_HTTP_MOCK_PORT = 0
          }
          steps {
            unstash 'build-artifacts'
            bat 'gradlew :ui:test :bdp-ui:test -P headless=true -P maxParallelIntegrationTests=3 -P os=win --parallel'
          }
        }
      }
    }
  }
}

二、解决Mockito会话异常

你碰到的UnfinishedMockingSessionException,本质是同一节点上多个测试任务并行时,Mockito的会话没正确关闭导致的冲突。把每个测试阶段分到独立节点后,环境完全隔离,这个问题基本会自动消失。如果还有残留问题,检查这两点:

  • 测试代码里所有MockitoSession是否都调用了finishMocking(),确保会话收尾
  • 给单个测试阶段的Gradle任务加上--no-parallel或者设置maxParallelForks=1,避免阶段内部的并行测试也出现会话冲突

三、处理时间表现差异问题

不同节点的硬件配置可能不一样,会导致测试耗时波动。可以这么优化:

  • 尽量让所有测试节点的CPU、内存、磁盘配置保持一致
  • 给每个测试阶段单独设置超时时间,根据节点性能灵活调整
  • 重新划分测试用例,让每个并行阶段的测试量尽量均衡,避免某个节点任务过重

内容的提问来源于stack exchange,提问作者Martin Bammer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:55:25