Groovy共享库类成员函数println为何不显示在Jenkins控制台?
Jenkins共享库类成员函数println无输出问题
背景与代码结构
Jenkins全局流水线库foo的结构如下:
+- src # Groovy source files | +- org | +- company | +- Stage.groovy # for org.company.Stage class +- vars +- func.groovy # for global var func()
全局变量实现(vars/func.groovy)
def func(d) { println("func.groovy:func()") }
Stage类实现(src/org/company/Stage.groovy)
package org.company; class Stage implements Serializable { def func(d) { println("org.company.Stage.func()") return 'hello, world!' } }
问题现象
流水线同时调用全局变量func和Stage实例的func方法时,控制台仅输出全局变量的println内容,以及Stage类函数的返回值,但不显示Stage类函数内的println输出。尝试修改访问修饰符、移除/添加Serializable、添加@NonCPS注解均无效。
原因解释
核心差异源于Jenkins流水线的CPS(Continuation-Passing Style)转换机制:
- vars目录下的全局变量脚本:会被Jenkins特殊处理,默认处于CPS上下文,其中的
println直接绑定到Jenkins日志输出系统,因此能正常打印到控制台。 - src目录下的Groovy类:类中方法默认会被CPS转换,而Groovy标准库的
println在转换后的上下文里,输出会导向JVM原生的标准输出/错误流,Jenkins不会捕获这些流的内容并展示到控制台。
受影响的功能
除标准输出打印外,以下操作也会出现类似问题:
- 使用
System.out.println()、System.err.println()等JVM原生输出方法,无法在Jenkins控制台显示内容。 - 未适配Jenkins的日志框架(如默认配置的logback、log4j),其日志输出不会出现在控制台。
- 直接调用的Groovy/JDK工具类中涉及标准流输出的逻辑,输出内容无法被Jenkins捕获展示。
内容的提问来源于stack exchange,提问作者StoneThrow
相关产品推荐
相关产品推荐

