【问题标题】:java.lang.StackOverflowError when parsing Groovy script on Jenkins在 Jenkins 上解析 Groovy 脚本时出现 java.lang.StackOverflowError
【发布时间】:2015-06-21 05:55:22
【问题描述】:

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

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

昨天,我们开始在每个尝试启动的 Jenkins 作业中遇到异常,以某种方式尝试执行 Groovy 脚本。例外是:

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 版本的更改或任何底层依赖都可能导致此类问题。
  • AIX 上的操作系统更新是否如此糟糕以至于被视为“痛苦”?
  • 我在考虑一个 WAS 修复包,但不知道是否正确的术语是受苦(英语不是我的母语)。最好是:如果它最近经历过任何形式的更新?
  • 运营团队告诉我操作系统没有更新,应用服务器也没有更新。我们昨天又看到了这个问题,不得不再次重启 Jenkins
  • 我现在才发现这个问题...从我假设您在这里至少使用 Groovy 2.3 的版本中。我假设所有那些重复的堆栈跟踪元素都来自 org.codehaus.groovy.antlr.parser.GroovyRecognizer 是否正确?我不相信循环类引用。但如果这部分有溢出,则说明 AST 是以一种意想不到的方式形成的。我需要重复的确切部分来了解是什么构造导致了这种情况

标签: java groovy jenkins websphere


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

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

【讨论】:

    猜你喜欢
    • 2013-01-31
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2016-11-02
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    相关资源
    最近更新 更多