如何并行化Jenkins任务并将测试阶段分配至不同节点?
Jenkins并行测试阶段分配至独立节点的解决方案
一、让并行测试阶段跑在不同节点
你当前的Jenkinsfile里,顶级agent { label 'win10' }会把所有阶段(包括并行的测试阶段)都绑定到同一个节点上,这就是导致测试互相干扰的核心原因。要强制每个测试阶段用独立节点,得这么改:
- 把全局agent改成
agent none,让每个阶段自己指定运行节点 - 代码拉取和构建阶段还是用同一个节点(比如win10),完成后把构建产物存起来
- 每个并行的测试阶段单独指定不同的节点标签(比如
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
相关产品推荐
相关产品推荐

