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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:05:23