2

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

谢谢你的帮助!

4

1 回答 1

2

出于好奇,我将代码复制到了我当地的 Jenkins 中——它起作用了(在修复了一些明显的问题之后,比如创建丢失的作业和修复了 if 条件)。

不过,要使代码干净,您需要:

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

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

  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
    }
}
于 2018-08-11T14:30:05.963 回答