从管道脚本方法获取控制台记录器(或TaskListener)

时间:2018-11-06 12:34:13

标签: jenkins jenkins-pipeline jenkins-groovy

如果我在管道脚本(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()}"
    

    打印

    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
    
  • 我知道您可以通过StepContextcontext.get(TaskListener.class)获取它,但是我不是 in 一个Step,我在CpsScript(即WorkflowScript,即Jenkinsfile)。

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

这很难吗?我想念什么?我发现有太多间接的魔术难以导航。

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

2 个答案:

答案 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