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)