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

标签 java groovy jenkins websphere

我们的 Jenkins CI 服务器出现问题。

我们的 CI 实现依赖于几个 Groovy 脚本,我们在 Jenkins 中将它们作为“系统 Groovy 脚本”执行。多年来一直如此,脚本近期未进行任何修改,并实现构建流程、业务逻辑步骤(如版本检查等)。

昨天,我们开始在我们尝试以某种方式启动的每个 Jenkins 作业中遇到异常,这些作业试图以某种方式执行 Groovy 脚本。异常(exception)情况是:

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 解析不兼容?

最佳答案

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 plugin向下滚动文档,看看如何编写扩展点而不是使用 groovy。这可能不容易做到,需要付出努力;但是你可以用这种方式为你的代码编写很多测试。您仍然会使用 groovy 作为胶水;但是热点直接用java。

第三种方法是在 Groovy issue tracker 上提交工单;看看专家们发现了什么。

关于在 Jenkins 上解析 Groovy 脚本时出现 java.lang.StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29647395/

相关文章:

使用 getter 和 setter 的 Java JSP

java - Getter方法使用

java - 了解Groovy中的多维关联数组

jenkins - 我如何调查匿名导致jenkins构建中止的原因

groovy - Jenkins Groovy : What triggered the build

python - 使用Jenkins和Docker运行Python脚本

java - Jetty + Guice + Jersey 在访问资源时给出 404

java - 二元运算比模运算更有效吗?

java - 将行插入 Postgres 时出现空指针异常

java - 如何使用父实体的组合键进行 JPA @OneToMany 单向映射?