从 Pipeline 脚本方法获取控制台 Logger(或 TaskListener)
Get console Logger (or TaskListener) from Pipeline script method
如果我在管道脚本(Jenkinsfile
)、我的全局管道库的vars/
或src/
class中有一个管道脚本方法,如何获得OutputStream
控制台日志?我想直接写入控制台日志。
我知道我可以 echo
或 println
,但为此我需要在不产生额外输出的情况下编写。我还需要能够将 OutputStream
传递给其他东西。
我知道如果我可以获得 TaskListener
(实际上是 hudson.util.StreamTaskListener
)实例,我可以调用 TaskListener.getLogger()
,但是如何?
我试过了:
我调查了 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
我知道你可以通过 context.get(TaskListener.class)
从 StepContext
得到它,但我不是 in Step
,我在 CpsScript
(即 WorkflowScript
即 Jenkinsfile
)。
- 从注册为
steps
脚本的 DSL
实例中获得的 CpsFlowExecution
找到它-属性,但我不知道如何发现TaskListener
创建时传递给它的
怎么这么难?我错过了什么?有太多间接的魔法,我发现很难驾驭这个系统。
顺便说一句,我知道直接访问被脚本安全阻止,但我可以创建 @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
如果我在管道脚本(Jenkinsfile
)、我的全局管道库的vars/
或src/
class中有一个管道脚本方法,如何获得OutputStream
控制台日志?我想直接写入控制台日志。
我知道我可以 echo
或 println
,但为此我需要在不产生额外输出的情况下编写。我还需要能够将 OutputStream
传递给其他东西。
我知道如果我可以获得 TaskListener
(实际上是 hudson.util.StreamTaskListener
)实例,我可以调用 TaskListener.getLogger()
,但是如何?
我试过了:
我调查了
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
我知道你可以通过
context.get(TaskListener.class)
从StepContext
得到它,但我不是 inStep
,我在CpsScript
(即WorkflowScript
即Jenkinsfile
)。- 从注册为
steps
脚本的DSL
实例中获得的CpsFlowExecution
找到它-属性,但我不知道如何发现TaskListener
创建时传递给它的
怎么这么难?我错过了什么?有太多间接的魔法,我发现很难驾驭这个系统。
顺便说一句,我知道直接访问被脚本安全阻止,但我可以创建 @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