Groovy-скрипт в выводе Jenkins println исчезает при вызове в среде класса

выход из println из функции класса теряется.

пример скрипта (outputclass.groovy):

class OutputClass
{
    OutputClass()
    {
        println("Inside class")  // This will not show in the console
    }
}

println("Outside class")  // Only this is shown in the console
output = new OutputClass()

Я использую Jenkins CLI для выполнения скрипта groovy

java -jar ..jenkins-cli.jar -s JENKINS_SERVER_URL groovy outputclass.groovy

Он выводит только это:

за пределами класса

похоже, что класс inmplicitly использует println из системы.из.метод println, и системы.out направляется в Файлы журнала, но println вне класса использует что-то то, что выводится в консоли скрипт. Следующий код показывает поведение.

System.out.println("First")
println("Second")

выход:

второй

как явно установить устройство вывода для вывода на консоль сценария Дженкинса?

3 ответов


Я сам нашел решение здесь http://mriet.wordpress.com.

при запуске плагина Groovy проходит две привязки к скрипту. От привязок, мы можем получить из переменной. Получить его и использовать выход.метод println для вывода на консоль скрипта, а не простые запросы.

скрипт ниже показывает полное решение.

import hudson.model.*

// Get the out variable
def out = getBinding().out;

class OutputClass
{
    OutputClass(out)  // Have to pass the out variable to the class
    {
        out.println ("Inside class")
    }
}

out.println("Outside class")
output = new OutputClass(out)

Если вы используете skript в качестве шага сборки post (Я не уверен, работает ли он с упомянутым CLI), вы можете использовать build in logger:

manager.listener.logger.println("some output")

Так что в вашем случае что-то вроде этого может быть полезно:

class OutputClass
{
    OutputClass(logger)  // Have to pass the out variable to the class
    {
         logger.println ("Inside class")
    }
}

output = new OutputClass(manager.listener.logger)

см. также пример 10 в плагине Groovy Doc


это сообщении помочь?

вывод отправляется на стандартный вывод, Поэтому, если вы проверите файл журнала, вы вероятно, вы увидите что-то вроде этого: INFO [STDOUT] Hello World

Если вы настаиваете на использовании системного скрипта, вы должны передать переменную ваш класс, поскольку привязка не видна внутри класса (так что это передано к стандартному выходу). Вы должны использовать что-то вроде этого

public class Hello {
  static void say(out) {
    out << "Hello World "
  }
}
println "Started ..."
Hello.say(out)