如果我在管道脚本(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)
获取它,但是我不是 in 一个Step
,我在CpsScript
(即WorkflowScript
,即Jenkinsfile
)。
CpsFlowExecution
脚本属性的DSL
实例获得的steps
中找到它,但是我不知道如何发现TaskListener
创建时传递给它这很难吗?我想念什么?我发现有太多间接的魔术难以导航。
顺便说一句,我知道脚本安全性阻止了直接访问,但是我可以创建@Whitelisted
方法,并且全局库vars/
中的任何内容始终会被列入白名单。
答案 0 :(得分:3)
针对这个问题花了几天时间后,我认为我有解决方案:
CpsThreadGroup.current().execution.owner.listener
这很丑陋,我不知道它是否正确,或者是否有更好的方法,但是似乎可行。
答案 1 :(得分:1)
您可以从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