JenkinsFile groovy中的闭包 - 回调或委托

时间:2018-05-18 15:25:29

标签: jenkins groovy closures jenkins-pipeline

我希望能够在Jenkins Groovy脚本中添加回调作为参数。我认为关闭是我需要的,但我不知道该怎么做。这是我想要的输出:

enter
hello
exit

JenkinsFile:

def rootDir = pwd()
def tools = load "${rootDir}\\patchBuildTools.groovy"
mainMethod(tools.testCl("hello"))

patchBuildTools.groovy

def mainMethod(Closure test) {
    println "enter"
    test()
    println "exit"
}


def testCl(String message) {
    println message
}

这给了我一个输出:

hello
enter
java.lang.NullPointerException: Cannot invoke method call() on null object

是否可以获得我想要的电话订单?

更新 - 根据答案

JenkinsFile:

def rootDir = pwd()
def tools = load "${rootDir}\\patchBuildTools.groovy"
mainMethod("enter", "exit")
{
  this.testCl("hello")
}

patchBuildTools.groovy

def mainMethod(String msg1, String ms2, Closure test) {
  println msg1
  test()
  println ms2
}



def testCl(String message) {
    println message
}

1 个答案:

答案 0 :(得分:5)

您可能误解了闭包是如何工作的 - 闭包是一个匿名函数,您可以将其传递给另一个函数并执行。

话虽如此,在您的示例中,您将testCl()的结果String传递给mainMethod()。这是错误的,因为mainMethod期望Closure而不是String作为传递的参数。

我不确定您要实现的目标,但以下是您如何使用Closure

<强> Jenkinsfile

def rootDir = pwd()
def tools = load "${rootDir}\\patchBuildTools.groovy"
mainMethod() {
    echo "hello world from Closure"
}    

<强> patchBuildTools.groovy

def mainMethod(Closure body) {
    println "enter"
    body() // this executes the closure, which you passed when you called `mainMethod() { ... }` in the scripted pipeline
    println "exit"
}

<强>结果

enter
hello world from Closure
exit