我有一个Jenkins管道作业,在其中声明了一些阶段,这些阶段使用的是我自己在同一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 ....
感谢您的帮助!
答案 0 :(得分:0)
出于好奇,我将代码复制到了本地的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
}
}