类函数中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脚本控制台?
答案 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)
答案 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
中的默认打印流替换。