从 Pipeline 脚本方法获取控制台 Logger(或 TaskListener)

Cra*_*ger 7 jenkins jenkins-groovy jenkins-pipeline

如果我在管道脚本 ( Jenkinsfile)、我的全局管道库vars/或类中具有管道脚本方法src/,如何获取OutputStream控制台日志?我想直接写入控制台日志。

我知道我可以echoprintln,但为此目的,我需要在不产生额外输出的情况下进行编写。我还需要能够将其传递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()}"
    
    Run Code Online (Sandbox Code Playgroud)

    印刷

    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
    
    Run Code Online (Sandbox Code Playgroud)
  • StepContext我知道你可以从via获取它,context.get(TaskListener.class)但我不在aStep,我在 a CpsScript(即WorkflowScriptie Jenkinsfile)中。

  • CpsFlowExecution从注册DSL为脚本属性的实例中找到它steps,但我不知道如何发现TaskListener创建它时传递给它的

怎么这么难?我缺少什么?有太多的间接魔法,我发现导航这个系统非常困难。

顺便说一句,我知道直接访问被脚本安全性阻止,但我可以创建@Whitelisted方法,并且全局库中的任何内容vars/总是被列入白名单。

Mzz*_*zzl 5

您可以从 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}")
Run Code Online (Sandbox Code Playgroud)

结果:

Listener: CloseableTaskListener[org.jenkinsci.plugins.workflow.log.BufferedBuildListener@6e9e6a16 / org.jenkinsci.plugins.workflow.log.BufferedBuildListener@6e9e6a16] Logger: java.io.PrintStream@423efc01
Run Code Online (Sandbox Code Playgroud)