Замыкания в JenkinsFile Groovy - обратные вызовы или делегат - PullRequest
0 голосов
/ 18 мая 2018

Я хочу иметь возможность добавить обратный вызов в качестве параметра в сценарий 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 голосов
/ 18 мая 2018

Возможно, вы неправильно поняли, как работают замыкания - замыкание - это анонимная функция, которую вы можете передать другой функции и выполнить.

Сказав, что в вашем примере вы передаете результат 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
...