如何在Jenkins中多次顺序运行同一个脚本化流水线?
问题描述
我在网上查找多次运行同一流水线的方法但未找到答案。该流水线包含5个阶段,我希望它按代码中的阶段顺序连续运行5次。
原流水线代码:
node{ def build_ok = true try{ stage('#1 SoftSync 4.5.1 CPU Usage Test') { build job: 'SoftSync_4.5.1_CPU_Usage_Test', parameters: [string(name: 'LOG_LEVEL', value: 'debug'), string(name: 'FILE_PATH', value: 'TLV_SoftSync/Management_Bundle/SoftSync_CPU_Usage_Test.robot')] } } catch(e) { build_ok = false echo e.toString() } try{ stage ('#2 SoftSync 4.5.1 Improvments to system time management Test '){ build job: 'SoftSync_4.5.1_Improvments_To_System_TimeManagement_Test', parameters: [string(name: 'LOG_LEVEL', value: 'debug'), string(name: 'FILE_PATH', value: 'TLV_SoftSync/Management_Bundle/SoftSync_Improvments_to_system_time_management.robot')] } }catch(e) { build_ok = false echo e.toString() } try { stage ('#3 SoftSync 4.5.1 Telematics and statistics Test'){ build job: 'SoftSync_4.5.1_Telematics_and_statistics_Test', parameters: [string(name: 'LOG_LEVEL', value: 'debug'), string(name: 'FILE_PATH', value: 'TLV_SoftSync/Management_Bundle/SoftSync_Telementry_and_Statistics.robot')] } }catch(e) { build_ok = false echo e.toString() } //try{ //stage ('#4 SoftSync 4.5.1 PTP Profiles Slave Lock Test'){ build job: 'SoftSync_4.5.1_PTP_Profiles_SlaveLock_Test', parameters: [string(name: 'LOG_LEVEL', value: 'debug'), string(name: 'FILE_PATH', value: 'TLV_SoftSync/PTP_Bundle/SoftSync_PTP_Lock_validation.robot')] //} //}catch(e) { // build_ok = false // echo e.toString() //} try{ stage ('#5 SoftSync 4.5.1 Alarms Test'){ build job: 'SoftSync_4.5.1_Alarms_Test', parameters: [string(name: 'LOG_LEVEL', value: 'debug'), string(name: 'FILE_PATH', value: 'TLV_SoftSync/Management_Bundle/SoftSync_Alarms_Test.robot')] } }catch(e) { build_ok = false echo e.toString() } if(build_ok) { currentBuild.result = "SUCCESS" } else { currentBuild.result = "FAILURE" } post{ always{ junit allowEmptyResults: true, testResults: '/var/lib/jenkins/output/*.xml' } } }
我见过使用数组和.each函数的用法,但均为并行运行场景,对我的需求没有帮助,请问有什么解决思路?
解决思路
方法1:封装流水线逻辑为函数,通过循环串行执行
把现有5个阶段的执行逻辑封装成独立函数,然后用Groovy的times方法或for循环连续调用5次。每一轮的所有阶段完成后才会启动下一轮,完全满足串行重复执行的需求。
修改后的示例代码:
node{ def build_ok = true // 封装单次流水线的执行逻辑 def runPipelineCycle() { def cycle_ok = true try{ stage('#1 SoftSync 4.5.1 CPU Usage Test') { build job: 'SoftSync_4.5.1_CPU_Usage_Test', parameters: [string(name: 'LOG_LEVEL', value: 'debug'), string(name: 'FILE_PATH', value: 'TLV_SoftSync/Management_Bundle/SoftSync_CPU_Usage_Test.robot')] } } catch(e) { cycle_ok = false build_ok = false echo e.toString() } try{ stage ('#2 SoftSync 4.5.1 Improvments to system time management Test '){ build job: 'SoftSync_4.5.1_Improvments_To_System_TimeManagement_Test', parameters: [string(name: 'LOG_LEVEL', value: 'debug'), string(name: 'FILE_PATH', value: 'TLV_SoftSync/Management_Bundle/SoftSync_Improvments_to_system_time_management.robot')] } }catch(e) { cycle_ok = false build_ok = false echo e.toString() } try { stage ('#3 SoftSync 4.5.1 Telematics and statistics Test'){ build job: 'SoftSync_4.5.1_Telematics_and_statistics_Test', parameters: [string(name: 'LOG_LEVEL', value: 'debug'), string(name: 'FILE_PATH', value: 'TLV_SoftSync/Management_Bundle/SoftSync_Telementry_and_Statistics.robot')] } }catch(e) { cycle_ok = false build_ok = false echo e.toString() } // 注释掉的阶段可按需恢复 // try{ // stage ('#4 SoftSync 4.5.1 PTP Profiles Slave Lock Test'){ // build job: 'SoftSync_4.5.1_PTP_Profiles_SlaveLock_Test', parameters: [string(name: 'LOG_LEVEL', value: 'debug'), string(name: 'FILE_PATH', value: 'TLV_SoftSync/PTP_Bundle/SoftSync_PTP_Lock_validation.robot')] // } // }catch(e) { // cycle_ok = false // build_ok = false // echo e.toString() // } try{ stage ('#5 SoftSync 4.5.1 Alarms Test'){ build job: 'SoftSync_4.5.1_Alarms_Test', parameters: [string(name: 'LOG_LEVEL', value: 'debug'), string(name: 'FILE_PATH', value: 'TLV_SoftSync/Management_Bundle/SoftSync_Alarms_Test.robot')] } }catch(e) { cycle_ok = false build_ok = false echo e.toString() } return cycle_ok } // 连续执行5轮流水线 5.times { cycleNum -> echo "开始执行第 ${cycleNum + 1} 轮流水线" runPipelineCycle() // 若需要某一轮失败就终止后续执行,可取消下方注释 // if (!build_ok) { // error "第 ${cycleNum + 1} 轮执行失败,终止后续运行" // } } currentBuild.result = build_ok ? "SUCCESS" : "FAILURE" post{ always{ junit allowEmptyResults: true, testResults: '/var/lib/jenkins/output/*.xml' } } }
方法2:为阶段添加轮次标识(可选)
如果需要在Jenkins的阶段视图中清晰区分每一轮的执行,可以给阶段名称加上轮次编号,修改封装函数时传入轮次参数:
def runPipelineCycle(int cycleNum) { def cycle_ok = true try{ stage("第${cycleNum}轮 #1 SoftSync 4.5.1 CPU Usage Test") { // 执行逻辑不变 } } catch(e) { // 错误处理不变 } // 其余阶段同理修改名称 } // 调用时传入轮次序号 5.times { cycleNum -> runPipelineCycle(cycleNum + 1) }
关键说明
- 循环执行是串行的,每一轮的5个阶段全部完成后才会启动下一轮,完全匹配你的需求。
- 错误处理可按需调整:要么继续执行完5轮,只要有一次失败就标记整体构建失败;要么某一轮失败就立即终止后续所有轮次。
- 原有的
post块保留在最外层,会在所有轮次执行完毕后统一处理测试报告。
内容的提问来源于stack exchange,提问作者omer tesler
相关产品推荐
相关产品推荐

