Подтвердить что ты не робот

Groovy - script в файле jenkins println исчезает при вызове внутри среды класса

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

Пример script (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()

Я использую CLI Jenkins для выполнения groovy script

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

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

Внешний класс

Кажется, что класс неспешно использует println из System.out.println, а System.out направляется в файлы журнала, но println вне класса использует что-то другое, которое выводится в консоли script. Следующий код показывает поведение.

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

Вывод:

Второе

Как явным образом установить выходное устройство для вывода в консоль Jenkins script?

4b9b3361

Ответ 1

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

Когда запускается плагин Groovy, он передает две привязки скрипту. Из привязок мы можем получить переменную out. Получите его и используйте out.println для вывода на консоль сценария, а не на простой 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)

Ответ 2

Если вы используете skript в качестве этапа пост-сборки (я не уверен, что он работает с указанным CLI), вы можете использовать сборку в журнале:

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 Документ плагина

Ответ 3

Помогает ли это почтовый список?

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

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

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

Ответ 4

Простое решение, которое сработало для меня, состояло в том, чтобы добавить эту строку поверх каждого сценария. Это позволяет использовать традиционные команды println во всем коде (внутри и вне классов), оставляя код интуитивно понятным.

import hudson.model.*
System.out = getBinding().out;

Это позволяет создавать записи в журнале следующим образом:

println("Outside class");

class OutputClass {
    OutputClass() {
        println ("Inside class")
    }
}

new OutputClass();

Он заменяет поток печати по умолчанию в System.out на поток, передаваемый Дженкинсом через привязки.