Jenkins管道:没有这样的DSL方法



我有一个Jenkins Pipeline JOB,在那里我声明了一些阶段,这些阶段使用了我在同一个groovy脚本中自己创建的外部函数。

errorList = ["badGatewayMsg", "closedByRemoteHostMsg", "connectionTimedOut"]
def boolean someFunction(name) {
String jobLog = jenkins.model.Jenkins.instance.getItemByFullName(name).lastBuild.log
for (error in errorList) {
if (jobLog.contains(error))
return true
}
return false
}
stage('stage1') {
if(someFunction('job1Name'))
// do Something
}
stage('stage2') {
if(someFunction('job2Name'))
// do Something
}

当我想开始这个管道构建时,我得到了以下错误:

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

谢谢你的帮助!

出于好奇,我将代码复制到本地Jenkins中,并成功了(在修复了明显的问题,如创建丢失的作业和修复if条件(。

然而,要想清理代码,你需要:

  1. 去掉def关键字(或者去掉数据类型定义boolean(。您可能需要检查:Groovy:"def";关键词与具体类型

  2. 在访问不可序列化的Jenkins内部时添加@NonCPS关键字。

  3. 为了完整性:当然,除了访问Jenkins内部之外,您还需要切换沙箱模式或将代码放入全局共享库中。

下面是我的工作示例:

errorList = ["badGatewayMsg", "closedByRemoteHostMsg", "connectionTimedOut"]
@NonCPS
boolean someFunction(name) {
String jobLog = jenkins.model.Jenkins.instance.getItemByFullName(name).lastBuild.log
for (error in errorList) {
if (jobLog.contains(error))
return true
}
return false
}
stage('stage1') {
if(someFunction('job1Name')) {
// do Something
}
}
stage('stage2') {
if(someFunction('job2Name')) {
// do Something
}
}

相关内容

最新更新