代码之家  ›  专栏  ›  技术社区  ›  Craig Ringer

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

  •  3
  • Craig Ringer  · 技术社区  · 7 年前

    如果在管道脚本中有管道脚本方法( Jenkinsfile ),我的全局管道库 vars/ 或者在一个 src/ 班级,怎样才能获得 OutputStream 控制台日志?我想写信 直接地 到控制台日志。

    echo println ,但是为了这个目的,我需要在没有产生额外输出的情况下进行编写。我还需要通过考试 输出流 去别的地方。

    TaskListener.getLogger() TaskListener (真的吗 hudson.util.StreamTaskListener )例如,但如何?

    • 我已经调查过了 manager.listener.logger

      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) 但我不是 在里面 A. Step ,我在一个 CpsScript (即。 WorkflowScript 詹金斯档案 ).

    • 从一个 CpsFlowExecution DSL 实例注册为 steps 脚本属性,但我无法找到 任务侦听器

    怎么这么难?我错过了什么?有这么多的间接魔法,我发现它难以置信地难以导航系统。

    顺便说一句,我知道脚本安全性阻止了直接访问,但我可以创建 @Whitelisted 方法,以及全局库的 总是被列入白名单。

    1 回复  |  直到 7 年前
        1
  •  4
  •   Mzzl    6 年前

    您可以从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
    
        2
  •  3
  •   James Emerton    7 年前

    在我的头撞了几天这个问题后,我想我有一个解决办法:

    CpsThreadGroup.current().execution.owner.listener
    

    它很难看,我不知道它是否正确,或者是否有更好的方法,但似乎工作。