在Jenkins上解析Groovy脚本时出现java.lang.StackOverflowError问题

9
我们的Jenkins CI服务器出现问题。我们的CI实现依赖于几个Groovy脚本,我们在Jenkins中作为“系统Groovy脚本”执行。多年来一直如此,这些脚本没有最近的修改,并实现了构建流程、版本检查等业务逻辑步骤。昨天,我们在尝试启动任何一种尝试执行Groovy脚本的Jenkins作业时都遇到了异常。异常信息为:
java.lang.StackOverflowError
at org.codehaus.groovy.antlr.parser.GroovyRecognizer.additiveExpression(GroovyRecognizer.java:12478)
at org.codehaus.groovy.antlr.parser.GroovyRecognizer.shiftExpression(GroovyRecognizer.java:9695)
at org.codehaus.groovy.antlr.parser.GroovyRecognizer.relationalExpression(GroovyRecognizer.java:12383)
at org.codehaus.groovy.antlr.parser.GroovyRecognizer.equalityExpression(GroovyRecognizer.java:12307)
at org.codehaus.groovy.antlr.parser.GroovyRecognizer.regexExpression(GroovyRecognizer.java:12255)
at org.codehaus.groovy.antlr.parser.GroovyRecognizer.andExpression(GroovyRecognizer.java:12223)
at org.codehaus.groovy.antlr.parser.GroovyRecognizer.exclusiveOrExpression(GroovyRecognizer.java:12191)
            hundreds of similar lines
at org.codehaus.groovy.antlr.parser.GroovyRecognizer.compoundStatement(GroovyRecognizer.java:7510)
at org.codehaus.groovy.antlr.parser.GroovyRecognizer.compatibleBodyStatement(GroovyRecognizer.java:8834)
at org.codehaus.groovy.antlr.parser.GroovyRecognizer.statement(GroovyRecognizer.java:899)
at org.codehaus.groovy.antlr.parser.GroovyRecognizer.compilationUnit(GroovyRecognizer.java:757)
at org.codehaus.groovy.antlr.AntlrParserPlugin.transformCSTIntoAST(AntlrParserPlugin.java:131)
at org.codehaus.groovy.antlr.AntlrParserPlugin.parseCST(AntlrParserPlugin.java:108)
at org.codehaus.groovy.control.SourceUnit.parse(SourceUnit.java:236)
at org.codehaus.groovy.control.CompilationUnit$1.call(CompilationUnit.java:161)
at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:846)
at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:550)
at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:526)
at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:503)
at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:302)
at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:281)
at groovy.lang.GroovyShell.parseClass(GroovyShell.java:731)
at groovy.lang.GroovyShell.parse(GroovyShell.java:743)
at groovy.lang.GroovyShell.parse(GroovyShell.java:770)
at groovy.lang.GroovyShell.parse(GroovyShell.java:761)
at groovy.lang.GroovyShell$parse.call(Unknown Source)
at com.cloudbees.plugins.flow.FlowDSL.executeFlowScript(FlowDSL.groovy:80)
at com.cloudbees.plugins.flow.FlowRun$FlyweightTaskRunnerImpl.run(FlowRun.java:219)
at hudson.model.Run.execute(Run.java:1759)
at com.cloudbees.plugins.flow.FlowRun.run(FlowRun.java:155)
at hudson.model.ResourceController.execute(ResourceController.java:89)
at hudson.model.Executor.run(Executor.java:240)
at hudson.model.OneOffExecutor.run(OneOffExecutor.java:43)

这看起来像是Jenkins内部的Groovy解析器在尝试解析Groovy脚本时达到了堆栈顶部(如我所说,许多之前完美运行且未经过任何近期修改的脚本在突然出现此问题)。
当前我们的Jenkins安装(v1.594)在AIX v7.1上运行Websphere 8.5.5.2应用服务器(不确定其修补程序级别和/或是否最近进行了任何更新,仍在努力收集信息)。
重启后,我们恢复了正常行为(所有脚本再次像往常一样工作,而没有对它们进行任何修改)。
有人知道是否有任何基础库与Jenkins Groovy解析不兼容的情况吗?

2
这听起来像是一个更新。更改Groovy版本或任何基础依赖项可能会导致这种问题。 - William Greenly
AIX系统的更新是否真的糟到被认为是"痛苦"的程度? - cjstehno
我在考虑一个WAS fixpack,不知道正确的术语是suffer(英语不是我的母语)。更好的说法是:它最近是否进行了任何更新? - Jorge_B
运维团队告诉我操作系统和应用服务器都没有更新。昨天我们又遇到了问题,不得不再次重启 Jenkins。 - Jorge_B
1
我才注意到这个问题...我假定你至少在使用Groovy 2.3版本。我猜那些重复的堆栈跟踪元素都来自org.codehaus.groovy.antlr.parser.GroovyRecognizer?我不相信有循环类引用。但是,如果在这部分中发生溢出,那么意味着AST以意外的方式形成。我需要精确重复的部分,以了解哪种构造导致了这种情况。 - blackdrag
显示剩余5条评论
1个回答

1

这段Groovy代码存在问题,导致解析器出现错误:

java.lang.StackOverflowError
at org.codehaus.groovy.antlr.parser.GroovyRecognizer.additiveExpression(GroovyRecognizer.java:12478)

基于类似的问题https://issues.apache.org/jira/browse/GROOVY-1783,你的代码可能存在循环引用;或者动态创建了过多的函数。你可以分析代码并尝试将会产生分配的任何内容放在循环外,特别是复杂的内联函数。
另一种方法是查看Build Flow插件并滚动文档,看看如何编写扩展点而不是使用groovy。这可能不容易做到并需要付出努力,但你可以通过这种方式为你的代码编写很多测试。你仍然可以使用groovy作为粘合剂,但直接使用java进行热点处理。
第三种方法是在Groovy问题跟踪器上提交一个问题,并看看专家们发现了什么。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接