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
相关产品推荐
相关产品推荐

