Jenkins-pipeline:没有这样的 DSL 方法
Posted
技术标签:
【中文标题】Jenkins-pipeline:没有这样的 DSL 方法【英文标题】:Jenkins-pipeline: No such DSL method 【发布时间】:2019-01-11 05:50:04 【问题描述】:我有一个 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 ....
感谢您的帮助!
【问题讨论】:
代码是否被编辑或者它真的报告了一个从未在你的代码中使用或声明过的方法?此外,异常的完整堆栈跟踪也会有所帮助。 该方法在我的所有阶段都真正使用过,我只是不知道在哪里可以声明它在我所有的 groovy 脚本中可见 @marherbi 我认为您不理解他的问题。您正在调用未在所示代码中声明或定义的方法。他在问你是否没有显示代码或者它不存在,在这种情况下,这就是问题所在。 您似乎使用的方法是someFunction
,但异常抱怨isOnError
似乎不是基于因果搜索的内部标识符。
啊!!!你说得对,我只是改了方法名,不好意思!!
【参考方案1】:
出于好奇,我将代码复制到我的本地 Jenkins 中 - 并且它起作用了(在修复了创建缺失作业和修复 if 条件等明显问题之后)。
不过,要使代码干净,您需要:
去掉 def
关键字(或者去掉数据类型定义 boolean
)。您可能需要检查:Groovy: "def" keyword vs concrete type
在访问不可序列化的 Jenkins 内部时添加 @NonCPS
关键字。
为了完整性:当然,除了访问 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
【讨论】:
以上是关于Jenkins-pipeline:没有这样的 DSL 方法的主要内容,如果未能解决你的问题,请参考以下文章
Swift – 将 Stripe 更新到 21.0.1 后“没有这样的模块‘Stripe3DS2’”