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

时间:2011-10-12 15:24:33

标签: 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()

我使用Jenkins CLI来执行groovy脚本

java -jar ..\jenkins-cli.jar -s JENKINS_SERVER_URL groovy outputclass.groovy

它只输出:

  

课外

似乎该类隐式使用System.out.println中的println,并且System.out被定向到日志文件,但类外的println正在使用其他东西,它在脚本控制台中输出。以下代码显示了该行为。

System.out.println("First")
println("Second")

输出:

  

第二

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

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:3)

如果你使用skript作为后期构建步骤(我不确定它是否适用于所提到的CLI),你可以使用build in logger:

manager.listener.logger.println("some output")

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

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

output = new OutputClass(manager.listener.logger)

另见Example 10 in Groovy Plugin Doc

答案 2 :(得分:0)

mailing list post有帮助吗?

  

输出被发送到标准输出,所以如果你检查你的日志文件,那么   可能会看到这样的东西:INFO [STDOUT] Hello World

     

如果你坚持使用系统脚本,你必须将变量传递给   你的类,因为绑定在类中是不可见的(所以它是   传递给标准输出)。你应该使用这样的东西

public class Hello {
  static void say(out) {
    out << "Hello World "
  }
}
println "Started ..."
Hello.say(out)

答案 3 :(得分:0)

一个对我有用的简单解决方案是在每个脚本的顶部添加此行。这样可以在整个代码中(类的内部和外部)使用传统的println命令,从而使代码直观。

import hudson.model.*
System.out = getBinding().out;

这样可以创建如下日志条目:

println("Outside class");

class OutputClass {
    OutputClass() {
        println ("Inside class")
    }
}

new OutputClass();

它将用绑定从Jenkins移交给的System.out中的默认打印流替换。