在Jenkins中实现多任务并行可以通过两种方式实现:在stage级别并行执行和在job级别并行执行。以下是具体的实现方法:
在Stage级别并行执行
在Jenkins Pipeline中,可以通过使用parallel
关键字来实现stage级别的并行执行。以下是一个示例代码,展示了如何在同一个job中并行执行多个不同的stages:
pipeline { agent { label "${params.AGENT_LABEL ?: ''}" } parameters { // 定义参数 string(name: 'PARAM_1', defaultValue: '', description: '') string(name: 'PARAM_2', defaultValue: '', description: '') // ... string(name: 'TEST_BRANCH', defaultValue: 'develop', description: '测试代码分支') string(name: 'AGENT_LABEL', defaultValue: 'build-arm64', description: '选择运行环境的Jenkins节点标签', trim: true) } stages { stage('Checkout Script') { steps { checkout([$class: 'GitSCM', branches: [[name: "*/${params.TEST_BRANCH}"]], doGenerateSubmoduleConfigurations: false, submoduleCfg: [], userRemoteConfigs: [[credentialsId: scm.userRemoteConfigs[0].credentialsId, url: 'code repo from github']]]) script { // 声明测试结果文件夹 TEST_RESULT_PATH = 'test/reports' sh "sudo rm -rf ${TEST_RESULT_PATH}" sh "mkdir -p ${TEST_RESULT_PATH}" // 可以准备一些其他的前提条件 } } } stage('Test in Parallel') { parallel { stage('Group AAA Test') { steps { script { dir('aaa') { // 运行测试组 'aaa' } } } } stage('Group BBB Test') { steps { script { dir('bbb') { // 运行测试组 'bbb' } } } } stage('Group CCC Test') { steps { script { dir('ccc') { // 运行测试组 'ccc' } } } } } } } post { always { script { System.setProperty('hudson.model.DirectoryBrowserSupport.CSP', '') publishHTML([allowMissing: false, alwaysLinkToLastBuild: false, keepAll: true, reportDir: TEST_RESULT_PATH]) } } } }
在Job级别并行执行
在job级别并行执行,可以通过创建一个master job来调度多个子jobs,这些子jobs可以并行执行不同的任务。以下是一个示例代码,展示了如何在job级别实现并行执行:
pipeline { agent { label "${params.AGENT_LABEL ?: ''}" } parameters { // 定义参数 string(name: 'PARAM_1', defaultValue: '', description: '') string(name: 'PARAM_2', defaultValue: '', description: '') // ... string(name: 'TEST_BRANCH', defaultValue: 'develop', description: '测试代码分支') string(name: 'TEST_ENVS', defaultValue: 'chrome,safari,firefox', description: '测试环境') string(name: 'AGENT_LABEL', defaultValue: 'build-arm64', description: '选择运行环境的Jenkins节点标签', trim: true) } stages { stage('Checkout Script') { steps { checkout([$class: 'GitSCM', branches: [[name: "*/${params.TEST_BRANCH}"]], doGenerateSubmoduleConfigurations: false, submoduleCfg: [], userRemoteConfigs: [[credentialsId: scm.userRemoteConfigs[0].credentialsId, url: 'code repo from github']]]) script { // 声明测试结果文件夹 TEST_ENVIRONMENTS = params.TEST_BRANCH.split(',') // 可以准备一些其他的前提条件 } } } stage('Test in Parallel') { steps { def jobs = [:] for (env in TEST_ENVIRONMENTS) { jobs[env] = build(job: 'run_test_cases', parameters: [string(name: 'TEST_ENV', value: env), string(name: 'AGENT_LABEL', value: params.AGENT_LABEL)], propagate: false) } parallel jobs } } } }
在这个示例中,master job会根据参数TEST_ENVS
的值,调度多个子job run_test_cases
同时执行,每个子job会根据master job传给它的不同参数在不同的环境中运行测试。
通过以上两种方式,可以在Jenkins中实现多任务并行,从而提高持续集成的效率和效能。