2015-04-15 17 views
9

Stiamo riscontrando un problema con il nostro server CI Jenkins.java.lang.StackOverflowError durante l'analisi dello script Groovy su Jenkins

La nostra implementazione CI si basa su diversi script Groovy, che eseguiamo in Jenkins come "script System Groovy". Questo è stato per anni, e gli script non hanno subito modifiche recenti e implementano flussi di build, passaggi di logica aziendale come il controllo della versione, ecc.

Ieri abbiamo iniziato a sperimentare un'eccezione in ogni lavoro Jenkins che abbiamo provato a rileggete che, in un modo o nell'altro, provate a eseguire gli script di Groovy. L'eccezione è:

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) 

Questo sembra che il parser Groovy all'interno Jenkins sta raggiungendo la cima della pila durante il tentativo di analizzare lo script Groovy (come ho già detto, questo bruscamente iniziato ad accadere con molti script che hanno lavorato perfettamente prima e non ha subito modifiche recenti).

Attualmente l'installazione di Jenkins (v1.594) viene eseguita su un server di applicazioni Websphere 8.5.5.2 su AIX v7.1 (non si conosce esattamente il livello del fix pack e/o se ha subito di recente alcun tipo di aggiornamento, ancora cercando di raccogliere le informazioni).

Dopo un riavvio, siamo tornati al comportamento normale (tutti gli script stavano funzionando come al solito di nuovo senza alcuna modifica a loro).

Qualcuno sa di incompatibilità di qualsiasi libreria sottostante con l'analisi di Jenkins Groovy?

+2

Sembra un aggiornamento. Una modifica alla versione di Groovy o qualsiasi dipendenza sottostante potrebbe causare questo tipo di problema. –

+0

Un aggiornamento del sistema operativo su AIX è così grave da essere considerato "sofferenza"? – cjstehno

+0

Stavo pensando a un fix pack WAS, e non so se il termine giusto è sofferto (l'inglese non è la mia lingua madre). Meglio come se fosse stato recentemente sottoposto a qualche tipo di aggiornamento? –

risposta

1

C'è un problema con il codice groovy; causando il parser per andare noci:

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

Sulla base di un biglietto simile: https://issues.apache.org/jira/browse/GROOVY-1783, è possibile che il codice ha riferimenti circolari; o creando troppe funzioni al volo. Puoi prendere l'approccio di analizzare il tuo codice e provare a mettere tutto ciò che sta per fare allocazioni al di fuori dei loop; in particolare funzioni inline complesse.

Un altro approccio è quello di andare a guardare il Build Flow plugin e scorrere la documentazione e vedere come si potrebbe scrivere un punto di estensione piuttosto che usare Groovy. Questo potrebbe non essere facile da fare e richiede uno sforzo; ma puoi scrivere un sacco di test per il tuo codice in questo modo. Useresti ancora groovy per la colla; ma usa java direttamente per i punti caldi.

Un terzo approccio sarebbe quello di depositare un biglietto su Groovy issue tracker; e vedere cosa scoprono gli esperti.

Problemi correlati