Jenkins执行FindBugs报unstableTotalAll未知参数且出现数分钟延迟排查
告警产生原因
该告警由Warnings Next Generation(静态代码分析集成)插件的参数不兼容问题触发:unstableTotalAll 是5.x及更早版本Warnings插件、旧版独立FindBugs插件中使用的阈值配置参数,作用是设置「所有优先级规则命中总条数超过阈值时,将构建标记为Unstable状态」。从Warnings NG 6.0版本开始,所有质量阈值配置被统一重构到qualityGates配置块中,io.jenkins.plugins.analysis.warnings.FindBugs类本身已经移除了unstableTotalAll字段。如果Pipeline脚本中仍在findbugs步骤直接传入该参数,插件初始化配置时无法识别对应字段,就会输出对应未知参数告警。
3-4分钟控制台卡顿的触发根源
卡顿和告警日志本身没有直接关系,是插件处理未知参数时的兜底逻辑缺陷导致:
插件识别到无效传入参数后,会调用Jenkins内置的反射参数匹配机制做兜底匹配,该逻辑会递归遍历插件自身所有关联配置类、所有公有字段与方法签名,尝试模糊匹配传入的参数名。由于Warnings NG插件内置了数十种静态分析工具的配置类,再加上Jenkins插件类加载器的多层级结构,这个全量递归扫描过程既没有做结果缓存,也没有设置超时阈值,在安装了20个以上插件的普通Jenkins实例上,扫描耗时普遍在3-5分钟区间,扫描完全部类之后才会继续执行后续的结果文件搜索逻辑,对应日志表现为打印告警后卡顿数分钟,才输出Searching for all files条目。
修复方法
- 定位Pipeline脚本中调用
findbugs/spotbugs步骤的代码段,删除步骤参数中直接传入的unstableTotalAll配置项 - 将原有的总告警数阈值配置迁移到
qualityGates块中,配置示例:
// 存在问题的旧写法 会触发告警与卡顿 findbugs( unstableTotalAll: 10, pattern: '**/spotbugsXml.xml' ) // 适配新版插件的正确写法 findbugs( pattern: '**/spotbugsXml.xml', qualityGates: [ [threshold: 10, type: 'TOTAL', unstable: true] ] )
- 如果是通过Jenkins UI的Snippet Generator生成的Pipeline代码,需要先删除旧的FindBugs配置项后重新生成片段,避免UI层残留旧版本参数缓存。
内容的提问来源于stack exchange,提问作者Shane Gannon

