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

Get console Logger (or TaskListener) from Pipeline script method

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

我知道我可以 echoprintln,但为此我需要在不产生额外输出的情况下编写。我还需要能够将 OutputStream 传递给其他东西。

我知道如果我可以获得 TaskListener(实际上是 hudson.util.StreamTaskListener)实例,我可以调用 TaskListener.getLogger(),但是如何?

我试过了:

怎么这么难?我错过了什么?有太多间接的魔法,我发现很难驾驭这个系统。

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

在为这个问题苦苦思索了几天之后,我想我找到了解决方案:

CpsThreadGroup.current().execution.owner.listener

它很丑,我不知道它是否正确或是否有更好的方法,但似乎有效。

您可以从 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