在类环境中调用时,jenkins println输出中的Groovy脚本会消失

Mag*_*nus 17 groovy hudson jenkins

来自类函数的println的输出将丢失.

示例脚本(outputclass.groovy):

class OutputClass
{
    OutputClass()
    {
        println("Inside class")  // This will not show in the console
    }
}

println("Outside class")  // Only this is shown in the console
output = new OutputClass()
Run Code Online (Sandbox Code Playgroud)

我使用Jenkins CLI来执行groovy脚本

java -jar ..\jenkins-cli.jar -s JENKINS_SERVER_URL groovy outputclass.groovy
Run Code Online (Sandbox Code Playgroud)

它只输出这个:

课外

看起来这个类明显地使用来自System.out.println的println,并且System.out被定向到日志文件,但是类外的println正在使用其他东西,它在脚本控制台中输出.以下代码显示了该行为.

System.out.println("First")
println("Second")
Run Code Online (Sandbox Code Playgroud)

输出:

第二

如何显式设置输出设备以输出到Jenkins脚本控制台?

Mag*_*nus 22

我在这里找到了解决方案http://mriet.wordpress.com.

当Groovy插件启动时,会将两个绑定传递给脚本.从绑定中我们可以得到out变量.获取它并使用out.println输出到脚本控制台,而不是普通的println.

下面的脚本显示完整的解决方案

import hudson.model.*

// Get the out variable
def out = getBinding().out;

class OutputClass
{
    OutputClass(out)  // Have to pass the out variable to the class
    {
        out.println ("Inside class")
    }
}

out.println("Outside class")
output = new OutputClass(out)
Run Code Online (Sandbox Code Playgroud)

  • 传入`out`流也是我能找到的最简单的解决方案.然而,只需执行`output = new OutputClass(getBinding().out)`并在开头跳过这些东西就可以简化代码. (2认同)
  • 从2018年开始,`getBinding().out`导致`No such property`错误.[这个SO帖子](/sf/ask/2950475671/)工作,但类似的解决方法 (2认同)

Ser*_*fel 5

如果您使用 skript 作为后期构建步骤(我不确定它是否适用于提到的 CLI),您可以在记录器中使用构建:

manager.listener.logger.println("some output")
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下,这样的事情可能会有所帮助:

class OutputClass
{
    OutputClass(logger)  // Have to pass the out variable to the class
    {
         logger.println ("Inside class")
    }
}

output = new OutputClass(manager.listener.logger)
Run Code Online (Sandbox Code Playgroud)

另请参阅Groovy 插件文档中的示例 10