You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

升级Jenkins从2.63到2.117后所有构建失败,求技术解决方案

解决Jenkins升级后序列化PrintStream报错的问题

兄弟,我之前跨大版本升级Jenkins的时候也踩过一模一样的坑,给你梳理几个能定位和解决问题的方向:

问题根源

Jenkins从2.100版本开始收紧了XStream序列化的安全策略,把java.io.PrintStream这类高风险类加入了黑名单,防止反序列化漏洞。而你的构建任务里,大概率是某个插件或者自定义代码把PrintStream实例存到了hudson.model.FreeStyleBuild的actions集合里,导致任务结束序列化构建对象时触发了安全拦截。

具体解决步骤

1. 排查可疑插件

  • 先回忆升级前你安装的插件,尤其是那些涉及构建日志输出、自定义构建步骤的插件,这类插件最容易在构建过程中把PrintStream对象挂载到Build实例上。
  • 可以尝试逐个禁用非核心插件,每次禁用后重新运行任务,看是否还会触发报错,找到罪魁祸首后要么升级该插件到兼容2.117的版本,要么替换成功能类似的替代插件。
  • 重点排查像Log Parser、自定义构建步骤类的插件,或者一些小众的第三方插件。

2. 检查自定义代码/Pipeline脚本

  • 如果你的任务用了自定义Groovy脚本、Pipeline或者自己开发的小插件,仔细检查代码里有没有把PrintStream(比如脚本里的out变量)添加到currentBuild.actions或者其他构建相关的可序列化对象中。
  • 比如类似下面的代码就会触发这个错误:
    currentBuild.actions.add(new MyCustomAction(out))
    
    这种情况要把代码里的PrintStream引用替换成其他可序列化的对象,比如只传递日志内容字符串,而不是流对象本身。

3. 临时应急方案(不推荐长期使用)

如果业务紧急需要先恢复服务,可以临时把java.io.PrintStream加入XStream的白名单:

  • 编辑Jenkins的启动参数,添加:
    -Dhudson.util.XStream2.additionalWhiteList=java.io.PrintStream
    
  • 注意:这只是临时救急的方法,会降低Jenkins的安全性,找到问题根源后一定要移除这个配置。

4. 回滚方案

如果上述方法都无法快速解决,而生产环境不能停的话,可以考虑:

  • 回滚Jenkins到升级前的2.63版本(回滚前务必备份Jenkins的home目录,避免数据丢失)。
  • 或者回滚可疑插件到升级前的版本,再验证是否能正常运行。

后续升级注意事项

  • 跨大版本升级Jenkins(比如从2.x早期版本升到2.100+)一定要先看官方的升级说明,很多旧插件会不兼容新的安全策略。
  • 升级前最好在测试环境先完整验证一遍所有任务,避免直接影响生产环境。

内容的提问来源于stack exchange,提问作者Vighnesh Pai

火山引擎 最新活动