groovy Jenkins共享库递归函数调用

gblwokeq  于 2022-11-01  发布在  Jenkins
关注(0)|答案(3)|浏览(196)

我有声明性管道,使用jenkins共享库。我正在尝试在jenkins共享库中进行递归函数调用。
我的共享库结构类似于下面的内容:

vars/xyz.groovy

在xyz.groovy中,我有一个方法foo,我xyz.foo从我的管道中调用www.example.com,这个方法是有效的。

foo(){
foo()   // says No such DSL method
xyz.foo() //says no signature of method: java.lang.class.foo
}

我正在尝试理解如何调用jenkins共享库中的函数。

wz3gfoph

wz3gfoph1#

this.methodName是在共享库中递归调用函数的正确方法。尽管方法不是类的一部分。但是使用this.foo()对我来说很有效。

t3psigkw

t3psigkw2#

我尝试用同一个文件中声明的方法调用一个递归函数。groovy最后,@萨加尔提供的选项对我不起作用作为一种解决方法,我在一个新文件(B.groovy)中创建了递归函数,并从原始文件(a.groovy)中调用它。它工作得很好:)
示例中。
b.groovy

/**
 * recursive function to compare semantic version form package.json and tag version, only evaluate x.x.x version
 * 0 same version
 * 1 package.json version is GREATER than repo tag version
 * -1 package.json version is SMALLER than repo tag version
 */
int call(ArrayList versionPackageJsonSplit, ArrayList versionTagRepoSplit, Integer iteration) {
    if (versionPackageJsonSplit[iteration].toInteger() == versionTagRepoSplit[iteration].toInteger()) {
        if (iteration == 2) {
            println 'return 0'
            return 0
        }
        return utility_cdkCompareVersions (versionPackageJsonSplit, versionTagRepoSplit, iteration+1) // --> recursive invocation
    } else if (versionPackageJsonSplit[iteration].toInteger() > versionTagRepoSplit[iteration].toInteger()) {
        println 'return 1'
        return 1
    } else if (versionPackageJsonSplit[iteration].toInteger() < versionTagRepoSplit[iteration].toInteger()) {
        println 'return -1'
        return -1
    }
}

a.groovy

.
.
.

compareVersionsResult = b (versionPackageJsonSplit, versionTagRepoSplit, 0)
println compareVersionsResult
.
.
.
.
o4tp2gmn

o4tp2gmn3#

到目前为止,我发现的可靠地实现这一点的最不糟糕的方法是创建一个顶级 Package 器方法,其中包含一个递归闭包:

def recursiveMethod(args) {
  Closure rec
  rec = { arg ->
    if (recursiveCase) {
      return rec(…)
    }
    else {
      return baseCase
    }
  }

  return rec(…)
}

优点是可以从闭包中引用方法参数或方法作用域的状态变量,而不必在递归堆栈中传递它们,因此递归调用看起来会更干净一些;缺点是需要一些额外的样板文件来进行 Package ,而且闭包参数的命名必须与方法参数不同,否则Groovy会引发错误。

相关问题