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

Jenkins报错:triggers与post块中找不到DSL方法'steps'

解决Jenkins流水线No such DSL method 'steps'错误

报错信息

java.lang.NoSuchMethodError: No such DSL method 'steps' found among steps

问题场景

在triggers和post代码块中均触发该错误,查阅相关帖子未找到适配方案。

原流水线代码

node{
     
    triggers {
        cron 'H */2 * * *'  
    }
    def build_ok = true
    def itrList = ["Run1", "Run2", "Run3"]
    itrList.each { val ->
 
        
    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')]
        }
     
    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')]
        }        
        
    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')]
        }
        
    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')]
        }   
        
    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')]
        }
        
    stage ('#6 SoftSync_4.5.1_EP_BP_DelayResp_DealyReq_method Test'){
           build job: 'SoftSync_4.5.1_EP_BP_Default_Profiles_DelayResp_DelayReq_method_Test', parameters: [string(name: 'LOG_LEVEL', value: 'debug'), string(name: 'FILE_PATH', value: 'TLV_SoftSync/Management_Bundle/SoftSync_EP_BP_Default_Profiles_DelayResp_DealyReq_method.robot')]
        }        
        
    stage ('#7 SoftSync TimeTraceability Status Test'){
           build job: 'SoftSync_4.5.1_TimeTraceability_Status_Test', parameters: [string(name: 'LOG_LEVEL', value: 'debug'), string(name: 'FILE_PATH', value: 'TLV_SoftSync/Management_Bundle/Softsync_Time_Traceability_Status.robot')]
        }    
    
    stage ('#8 SoftSync 4.5.1 NTP Clock Test'){
           build job: 'SoftSync_4.5.1_NTP_Clock_Test', parameters: [string(name: 'LOG_LEVEL', value: 'debug'), string(name: 'FILE_PATH', value: 'TLV_SoftSync/Management_Bundle/Softsync_NTP_Clock.robot')]
        }        
    
    
    if(build_ok) {
        currentBuild.result = "SUCCESS"
    } else {
        currentBuild.result = "FAILURE"
       
    }
    
    post{
        always{
            junit allowEmptyResults: true, testResults: '/var/lib/jenkins/output/*.xml'
        }
    }
    } 
    
    
}

问题根源

你的流水线混合了Scripted Pipeline(node块写法)和Declarative Pipeline(triggers、post块)的语法,Jenkins无法识别这种混合写法,从而抛出错误。

修正方案

方案1:改为标准Declarative Pipeline(推荐)

Declarative语法更规范,原生支持triggers、post等指令,修正后的代码如下:

pipeline {
    agent any
    triggers {
        cron 'H */2 * * *'  
    }
    stages {
        stage('批量执行测试') {
            steps {
                script {
                    def itrList = ["Run1", "Run2", "Run3"]
                    itrList.each { val ->
                        stage("#1 SoftSync 4.5.1 CPU使用率测试") {
                            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')
                            ]
                        }
                        stage("#2 SoftSync 4.5.1 系统时间管理优化测试") {
                            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')
                            ]
                        }
                        stage("#3 SoftSync 4.5.1 远程信息处理与统计测试") {
                            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')
                            ]
                        }
                        stage("#4 SoftSync 4.5.1 PTP从设备锁定测试") {
                            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')
                            ]
                        }
                        stage("#5 SoftSync 4.5.1 告警测试") {
                            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')
                            ]
                        }
                        stage("#6 SoftSync_4.5.1_EP_BP延迟响应请求测试") {
                            build job: 'SoftSync_4.5.1_EP_BP_Default_Profiles_DelayResp_DelayReq_method_Test', parameters: [
                                string(name: 'LOG_LEVEL', value: 'debug'), 
                                string(name: 'FILE_PATH', value: 'TLV_SoftSync/Management_Bundle/SoftSync_EP_BP_Default_Profiles_DelayResp_DealyReq_method.robot')
                            ]
                        }
                        stage("#7 SoftSync 时间可追溯性状态测试") {
                            build job: 'SoftSync_4.5.1_TimeTraceability_Status_Test', parameters: [
                                string(name: 'LOG_LEVEL', value: 'debug'), 
                                string(name: 'FILE_PATH', value: 'TLV_SoftSync/Management_Bundle/Softsync_Time_Traceability_Status.robot')
                            ]
                        }
                        stage("#8 SoftSync 4.5.1 NTP时钟测试") {
                            build job: 'SoftSync_4.5.1_NTP_Clock_Test', parameters: [
                                string(name: 'LOG_LEVEL', value: 'debug'), 
                                string(name: 'FILE_PATH', value: 'TLV_SoftSync/Management_Bundle/Softsync_NTP_Clock.robot')
                            ]
                        }
                    }
                }
            }
        }
    }
    post {
        always {
            junit allowEmptyResults: true, testResults: '/var/lib/jenkins/output/*.xml'
        }
        success {
            script {
                currentBuild.result = "SUCCESS"
            }
        }
        failure {
            script {
                currentBuild.result = "FAILURE"
            }
        }
    }
}

关键修正点

  • 用pipeline顶层块包裹整个流水线,符合Declarative语法规范
  • triggers放在pipeline块内作为顶层指令
  • 所有stage归到stages块中,循环逻辑用script块包裹(Declarative中执行脚本逻辑需用script块)
  • post块直接放在pipeline块内,支持always/success/failure等条件分支
  • 用agent any指定执行节点,替代原代码的node块

方案2:坚持使用Scripted Pipeline

如果需要保留Scripted写法,需用properties()设置触发器,并用try-catch模拟post always逻辑:

properties([
    pipelineTriggers([cron('H */2 * * *')])
])

node {
    def build_ok = true
    def itrList = ["Run1", "Run2", "Run3"]
    itrList.each { val ->
        stage('#1 SoftSync 4.5.1 CPU使用率测试') {
            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')
            ]
        }
        // 其他stage代码与原代码一致,此处省略重复内容
    }

    if(build_ok) {
        currentBuild.result = "SUCCESS"
    } else {
        currentBuild.result = "FAILURE"
    }

    // 模拟post always逻辑,确保无论成败都收集测试报告
    try {
        junit allowEmptyResults: true, testResults: '/var/lib/jenkins/output/*.xml'
    } catch(Exception e) {
        junit allowEmptyResults: true, testResults: '/var/lib/jenkins/output/*.xml'
        throw e
    }
}

关键修正点

  • 用properties()方法设置触发器,替代Declarative的triggers块
  • 移除原代码中的post块,用try-catch实现无论流水线状态都执行测试报告收集的逻辑

内容的提问来源于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.12 07:20:28