Получить консольный логгер (или TaskListener) из метода сценария конвейера - PullRequest
0 голосов
/ 06 ноября 2018

Если у меня есть метод сценария конвейера в сценарии конвейера (Jenkinsfile), в моей Глобальной библиотеке конвейеров vars/ или в классе src/, как можно получить OutputStream для журнала консоли? Я хочу написать напрямую в консольный журнал.

Я знаю, что могу echo или println, но для этого мне нужно писать без дополнительного вывода, который дает. Мне также нужно иметь возможность передать OutputStream чему-то другому.

Я знаю, что могу позвонить TaskListener.getLogger(), если смогу получить экземпляр TaskListener (действительно hudson.util.StreamTaskListener), но как?

Я пытался:

  • Я изучил manager.listener.logger (из плагина groovy postbuild), и в контексте ранней сборки, который я вызываю из него, не получается OutputStream, который записывает в консольный журнал задания.

    echo "listener is a ${manager.listener} - ${manager.listener.getClass().getName()} from ${manager} and has a ${manager.listener.logger} of class ${manager.listener.logger.getClass().getName()}"
    

    печать

    listener is a hudson.util.LogTaskListener@420c55c4 - hudson.util.LogTaskListener from org.jvnet.hudson.plugins.groovypostbuild.GroovyPostbuildRecorder$BadgeManager@58ac0c55 and has a java.io.PrintStream@715b9f99 of class java.io.PrintStream
    
  • Я знаю, что вы можете получить его из StepContext через context.get(TaskListener.class), но я не в a Step, я в CpsScript (то есть WorkflowScript т.е. Jenkinsfile).

  • Найти его из CpsFlowExecution, полученного из экземпляра DSL, зарегистрированного как свойство сценария steps, но я не смог понять, как обнаружить TaskListener, который передается ему при его создании

Как это сложно? Чего мне не хватает? Там так много косвенной магии, что мне невероятно трудно ориентироваться в системе.

Кстати, я знаю, что Script Security блокирует прямой доступ, но я могу создавать @Whitelisted методы, и все, что есть в глобальной библиотеке vars/, всегда так или иначе заносится в белый список.

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Вы можете получить доступ к объекту сборки из корневого объекта Jenkins:

def listener = Jenkins.get()
    .getItemByFullName(env.JOB_NAME)
    .getBuildByNumber(Integer.parseInt(env.BUILD_NUMBER))
    .getListener()

def logger = listener.getLogger() as PrintStream

logger.println("Listener: ${listener} Logger: ${logger}")

Результат:

Listener: CloseableTaskListener[org.jenkinsci.plugins.workflow.log.BufferedBuildListener@6e9e6a16 / org.jenkinsci.plugins.workflow.log.BufferedBuildListener@6e9e6a16] Logger: java.io.PrintStream@423efc01
0 голосов
/ 21 ноября 2018

После нескольких дней удара головой об этой проблеме я думаю, что у меня есть решение:

CpsThreadGroup.current().execution.owner.listener

Это безобразно, и я не знаю, правильно ли это или есть лучший способ, но, кажется, работает.

...