Jenkins管道:没有这种DSL方法

时间:2018-08-03 10:41:50

标签: jenkins groovy jenkins-pipeline nosuchmethod

我有一个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 ....

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

出于好奇,我将代码复制到了本地的Jenkins中,并且可以正常工作(解决了一些明显的问题,如创建丢失的工作和修复if条件)。

尽管如此,仍然需要清洁代码:

  1. 摆脱def关键字(或者摆脱数据类型定义boolean)。您可能要检查:Groovy: "def" keyword vs concrete type

  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
    }
}