You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 08:43:30