1. 概述

作为开发人员和系统管理员,我们一直在寻找优化流程、提升效率的方法。Jenkins 作为一个流行的开源自动化服务器,是我们的得力工具。但即使如此,我们有时还是会遇到任务串行执行导致的等待问题:能不能让同一个 Jenkins Job 同时运行多个实例?

本文将介绍几种在 Jenkins 中并行执行相同 Job 的方法。我们会从并发执行的基本概念讲起,再分别介绍使用 Parameterized Trigger Plugin、Groovy 脚本和 Parallel Test Executor Plugin 的实现方式。


2. 理解 Jenkins 并行执行机制

2.1. Jenkins 的并发构建

Jenkins 默认情况下一个 Job 是串行执行的,即一次只能运行一个实例。但 Jenkins 支持并发构建(Concurrent Builds),也就是说,同一个 Job 可以同时运行多个实例

这种机制非常适合以下场景:

  • 需要并行执行多个配置(如不同环境、不同参数)
  • 并行运行测试用例
  • 并行部署到多个目标环境

例如,你正在开发一个移动应用,需要在多个设备配置上测试。如果串行执行,每个设备都要等前面的跑完,耗时长。使用并发构建,可以同时跑多个设备的测试,大大节省时间 ✅

2.2. 并行执行的优势

  • 减少整体构建时间:并行执行能显著提升任务完成速度,尤其适用于 CPU 或 I/O 密集型任务。
  • 提高资源利用率:充分利用 Jenkins 的 Executor,避免资源闲置。
  • 支持可扩展性:随着项目规模扩大,任务数量增加,仍能保持较高的执行效率。

⚠️ 注意:并发执行虽然好,但也要注意 Jenkins 的 Executor 数量是否足够,否则任务会排队,反而影响效率 ❌


3. 使用 Parameterized Trigger Plugin 并行触发任务

3.1. 安装插件

该插件允许你从一个主 Job 中触发多个子 Job,并传递参数。安装步骤如下:

  1. 打开 Jenkins 控制台
  2. 登录
  3. 进入 Manage Jenkins > Manage Plugins
  4. Available 标签下搜索 Parameterized Trigger Plugin
  5. 勾选插件,点击 Install without restart
  6. 安装完成后重启 Jenkins

3.2. 配置主 Job

主 Job 负责并行触发多个子 Job。以下是一个 Jenkinsfile 示例:

pipeline {
    agent any
    stages {
        stage('Trigger Parallel Jobs') {
            steps {
                script {
                    def configs = ['config1', 'config2', 'config3']
                    def parallelSteps = [:]
                    
                    configs.each { config ->
                        parallelSteps[config] = {
                            build job: 'TargetJob', 
                                parameters: [string(name: 'CONFIG', value: config)],
                                wait: false
                        }
                    }
                    
                    parallel parallelSteps
                }
            }
        }
    }
}

上述代码中,我们通过 parallel 方法并行触发了多个 TargetJob,每个 Job 都带有不同的 CONFIG 参数。wait: false 表示主 Job 不等待子 Job 完成 ✅

3.3. 配置子 Job(TargetJob)

子 Job 需要配置为参数化 Job,接受主 Job 传入的参数:

  1. 创建一个自由风格项目
  2. 勾选 This project is parameterized
  3. 添加一个字符串参数,名称为 CONFIG
  4. 在 Shell 脚本中使用 ${CONFIG}
echo "Running with configuration: ${CONFIG}"
# 其他构建步骤...

⚠️ 注意:确保 Jenkins 有足够的 Executor 来运行你触发的并行任务,否则任务会排队,影响效率 ❌


4. 使用 Groovy 脚本实现并行执行

4.1. 编写 Groovy 脚本

Groovy 脚本方式更加灵活,可以将整个并行逻辑写在 Jenkinsfile 中,无需依赖外部 Job:

def parallelJobs = [:]

def configurations = ['config1', 'config2', 'config3']

configurations.each { config ->
    parallelJobs["Job for ${config}"] = {
        node {
            stage("Running ${config}") {
                echo "Executing job for ${config}"
                sh "echo 'Performing task for ${config}'"
                sleep 10
            }
        }
    }
}

parallel parallelJobs

这个脚本定义了一个 Map,每个键对应一个并行执行的闭包,内部逻辑可以直接写在 Jenkins Pipeline 中 ✅

4.2. 集成到 Jenkins Pipeline

将上面的脚本封装到一个完整的 Jenkinsfile 中:

pipeline {
    agent none
    stages {
        stage('Run Parallel Jobs') {
            steps {
                script {
                    def parallelJobs = [:]
                    def configurations = ['config1', 'config2', 'config3']

                    configurations.each { config ->
                        parallelJobs["Job for ${config}"] = {
                            node {
                                stage("Running ${config}") {
                                    echo "Executing job for ${config}"
                                    sh "echo 'Performing task for ${config}'"
                                    sleep 10
                                }
                            }
                        }
                    }

                    parallel parallelJobs
                }
            }
        }
    }
}

✅ 优点:

  • 更加灵活,动态调整并行数量
  • 所有逻辑集中在一个文件中,便于版本控制
  • 动态分配节点资源,提升利用率

⚠️ 缺点:

  • 脚本复杂度高,维护成本大
  • 不适合非常复杂的构建流程

5. 使用 Parallel Test Executor Plugin 并行执行测试任务

5.1. 安装插件

Parallel Test Executor 插件专为并行执行测试任务设计,但也适用于其他类型任务。安装步骤如下:

  1. 打开 Jenkins 控制台
  2. 登录
  3. 进入 Manage Jenkins > Manage Plugins
  4. Available 标签下搜索 Parallel Test Executor
  5. 勾选插件,点击 Install without restart

5.2. 配置并行测试执行

在 Jenkins Pipeline 中配置如下:

pipeline {
    agent any
    stages {
        stage('Run Parallel Tests') {
            steps {
                parallelTestExecutor(
                    parallelism: 3,
                    testJob: 'TestJob',
                    testReportParallelism: 3,
                    testReportFiles: '**/target/surefire-reports/*.xml'
                )
            }
        }
    }
}

参数说明:

  • parallelism: 并行执行的任务数
  • testJob: 实际执行测试的 Job 名称
  • testReportParallelism: 处理测试报告的并行数
  • testReportFiles: 测试报告文件路径

对应的 TestJob 示例:

pipeline {
    agent any
    parameters {
        string(name: 'TEST_CASES', defaultValue: '', description: 'Test cases to run')
    }
    stages {
        stage('Run Tests') {
            steps {
                sh "mvn test -Dtest=${params.TEST_CASES}"
            }
        }
    }
}

该插件会自动将不同的测试用例分配给多个 Job 实例并行执行,最后汇总结果 ✅

⚠️ 注意:该插件适合任务能被合理拆分的场景,否则并行效果不明显 ❌


6. 总结

本文介绍了三种在 Jenkins 中并行执行相同 Job 的方法:

方法 描述 优点 适用场景
Parameterized Trigger Plugin 主 Job 并行触发多个参数化子 Job 简单易用,适合已有 Job 多配置任务、环境测试
Groovy 脚本 在 Pipeline 中直接编写并行逻辑 灵活,自包含 自定义并行任务、轻量级任务
Parallel Test Executor Plugin 并行执行测试任务 自动分发和汇总测试结果 单元测试、集成测试

根据你的项目需求和 Jenkins 环境,选择合适的方法可以显著提升 CI/CD 效率。同时,也要注意资源分配和并发控制,避免“并发过度”导致任务排队,反而影响效率 ⚠️

✅ 推荐使用 Groovy 脚本或 Parallel Test Executor 插件来实现更灵活、高效的并行执行机制。


原始标题:Run the Same Jenkins Job Multiple Times in Parallel