Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-40109

Compilation error in shared library/global variable produces java.io.NotSerializableException org.codehaus.groovy.control.ErrorCollector

    • Pipeline: Groovy 2.57 and Pipeline: Shared Groovy Libraries 2.12

      I am trying to run the latest new feature to get output from sh command. Here is my code:

            _  emails = sh (
                  script: "git --no-pager show -s --format='%ae'   ${commit_hash}"
                  returnStdout: true
              )
              echo "emails: ${emails}"_
      

      I am getting back an error:

      java.io.NotSerializableException: org.codehaus.groovy.control.ErrorCollector
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
      	at org.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65)
      	at org.jboss.marshalling.river.BlockMarshaller.writeObject(BlockMarshaller.java:56)
      	at org.jboss.marshalling.MarshallerObjectOutputStream.writeObjectOverride(MarshallerObjectOutputStream.java:50)
      	at org.jboss.marshalling.river.RiverObjectOutputStream.writeObjectOverride(RiverObjectOutputStream.java:179)
      	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:344)
      	at java.util.TreeMap.writeObject(TreeMap.java:2434)
      	at sun.reflect.GeneratedMethodAccessor276.invoke(Unknown Source)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:498)
      	at org.jboss.marshalling.reflect.SerializableClass.callWriteObject(SerializableClass.java:271)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:976)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
      	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
      	at org.jboss.marshalling.AbstractObjectOutput.writeObject(AbstractObjectOutput.java:58)
      	at org.jboss.marshalling.AbstractMarshaller.writeObject(AbstractMarshaller.java:111)
      	at org.jenkinsci.plugins.workflow.support.pickles.serialization.RiverWriter.writeObject(RiverWriter.java:132)
      	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:371)
      	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:355)
      	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:309)
      	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$000(CpsThreadGroup.java:77)
      	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:186)
      	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:184)
      	at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:47)
      	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
      	at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:112)
      	at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
      	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
      	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
      	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
      	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
      	at java.lang.Thread.run(Thread.java:745)
      Caused by: an exception which occurred:
      	in field collector
      	in field v
      	in field returnAddress
      	in field e
      	in field program
      	in field threads
      	in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@67742400
      Finished: FAILURE
      

      When I do not use returnStdout, the code works find executing the command (of course not returning anything)
      Any help there?
      Thanks

          [JENKINS-40109] Compilation error in shared library/global variable produces java.io.NotSerializableException org.codehaus.groovy.control.ErrorCollector

          Andrew Bayer added a comment -

          Hrm - so a compilation error under src gets you a different error altogether, regardless of try/catch magic:

          [p #1] BUG! exception in phase 'semantic analysis' in source unit 'WorkflowScript' The lookup for pkg.Lib caused a failed compilaton. There should not have been any compilation from this call.
          [p #1] 	at org.codehaus.groovy.control.ClassNodeResolver.tryAsLoaderClassOrScript(ClassNodeResolver.java:188)
          [p #1] 	at org.codehaus.groovy.control.ClassNodeResolver.findClassNode(ClassNodeResolver.java:168)
          [p #1] 	at org.codehaus.groovy.control.ClassNodeResolver.resolveName(ClassNodeResolver.java:124)
          [p #1] 	at org.codehaus.groovy.control.ResolveVisitor.resolveToOuter(ResolveVisitor.java:616)
          [p #1] 	at org.codehaus.groovy.control.ResolveVisitor.resolve(ResolveVisitor.java:268)
          [p #1] 	at org.codehaus.groovy.control.ResolveVisitor.resolve(ResolveVisitor.java:236)
          [p #1] 	at org.codehaus.groovy.control.ResolveVisitor.transformPropertyExpression(ResolveVisitor.java:773)
          [p #1] 	at org.codehaus.groovy.control.ResolveVisitor.transform(ResolveVisitor.java:636)
          [p #1] 	at org.codehaus.groovy.control.ResolveVisitor.transformPropertyExpression(ResolveVisitor.java:757)
          [p #1] 	at org.codehaus.groovy.control.ResolveVisitor.transform(ResolveVisitor.java:636)
          [p #1] 	at org.codehaus.groovy.ast.expr.Expression.transformExpressions(Expression.java:49)
          [p #1] 	at org.codehaus.groovy.ast.expr.GStringExpression.transformExpression(GStringExpression.java:54)
          [p #1] 	at org.codehaus.groovy.control.ResolveVisitor.transform(ResolveVisitor.java:651)
          [p #1] 	at org.codehaus.groovy.ast.expr.Expression.transformExpressions(Expression.java:49)
          [p #1] 	at org.codehaus.groovy.ast.expr.ArgumentListExpression.transformExpression(ArgumentListExpression.java:67)
          [p #1] 	at org.codehaus.groovy.control.ResolveVisitor.transform(ResolveVisitor.java:651)
          [p #1] 	at org.codehaus.groovy.control.ResolveVisitor.transformMethodCallExpression(ResolveVisitor.java:976)
          [p #1] 	at org.codehaus.groovy.control.ResolveVisitor.transform(ResolveVisitor.java:642)
          [p #1] 	at org.codehaus.groovy.ast.ClassCodeExpressionTransformer.visitExpressionStatement(ClassCodeExpressionTransformer.java:139)
          [p #1] 	at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:40)
          [p #1] 	at org.codehaus.groovy.ast.CodeVisitorSupport.visitBlockStatement(CodeVisitorSupport.java:35)
          [p #1] 	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitBlockStatement(ClassCodeVisitorSupport.java:165)
          [p #1] 	at org.codehaus.groovy.control.ResolveVisitor.visitBlockStatement(ResolveVisitor.java:1233)
          [p #1] 	at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:69)
          [p #1] 	at org.codehaus.groovy.ast.CodeVisitorSupport.visitTryCatchFinally(CodeVisitorSupport.java:82)
          [p #1] 	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitTryCatchFinally(ClassCodeVisitorSupport.java:230)
          [p #1] 	at org.codehaus.groovy.ast.stmt.TryCatchStatement.visit(TryCatchStatement.java:42)
          [p #1] 	at org.codehaus.groovy.ast.CodeVisitorSupport.visitBlockStatement(CodeVisitorSupport.java:35)
          [p #1] 	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitBlockStatement(ClassCodeVisitorSupport.java:165)
          [p #1] 	at org.codehaus.groovy.control.ResolveVisitor.visitBlockStatement(ResolveVisitor.java:1233)
          [p #1] 	at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:69)
          [p #1] 	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClassCodeContainer(ClassCodeVisitorSupport.java:101)
          [p #1] 	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitConstructorOrMethod(ClassCodeVisitorSupport.java:112)
          [p #1] 	at org.codehaus.groovy.ast.ClassCodeExpressionTransformer.visitConstructorOrMethod(ClassCodeExpressionTransformer.java:50)
          [p #1] 	at org.codehaus.groovy.control.ResolveVisitor.visitConstructorOrMethod(ResolveVisitor.java:166)
          [p #1] 	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitMethod(ClassCodeVisitorSupport.java:123)
          [p #1] 	at org.codehaus.groovy.ast.ClassNode.visitContents(ClassNode.java:1058)
          [p #1] 	at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClass(ClassCodeVisitorSupport.java:50)
          [p #1] 	at org.codehaus.groovy.control.ResolveVisitor.visitClass(ResolveVisitor.java:1176)
          [p #1] 	at org.codehaus.groovy.control.ResolveVisitor.startResolving(ResolveVisitor.java:141)
          [p #1] 	at org.codehaus.groovy.control.CompilationUnit$9.call(CompilationUnit.java:608)
          [p #1] 	at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:846)
          [p #1] 	at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:550)
          [p #1] 	at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:499)
          [p #1] 	at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:302)
          [p #1] 	at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:281)
          [p #1] 	at groovy.lang.GroovyShell.parseClass(GroovyShell.java:731)
          [p #1] 	at groovy.lang.GroovyShell.parse(GroovyShell.java:743)
          

          That's with or without the sleep involved, mind you. The vars equivalent without sleep gets you:

          [p #1] hudson.remoting.ProxyException: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
          [p #1] /private/var/folders/pr/24nv8g910wg8vr4b4c33q34r0000gn/T/jenkinsTests.tmp/jenkins3982861903739805185test/jobs/p/builds/1/libs/compilationFailure/vars/busted.groovy: 1: expecting ')', found ',' @ line 1, column 27.
          [p #1]    String[] agentNames = ('a', 'b', 'c')
          [p #1]                              ^
          [p #1] 
          [p #1] 1 error
          [p #1] 
          [p #1] 	at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:302)
          [p #1] 	at org.codehaus.groovy.control.ErrorCollector.addFatalError(ErrorCollector.java:149)
          [p #1] 	at org.codehaus.groovy.control.ErrorCollector.addError(ErrorCollector.java:119)
          [p #1] 	at org.codehaus.groovy.control.ErrorCollector.addError(ErrorCollector.java:131)
          [p #1] 	at org.codehaus.groovy.control.SourceUnit.addError(SourceUnit.java:359)
          [p #1] 	at org.codehaus.groovy.antlr.AntlrParserPlugin.transformCSTIntoAST(AntlrParserPlugin.java:142)
          [p #1] 	at org.codehaus.groovy.antlr.AntlrParserPlugin.parseCST(AntlrParserPlugin.java:108)
          [p #1] 	at org.codehaus.groovy.control.SourceUnit.parse(SourceUnit.java:236)
          [p #1] 	at org.codehaus.groovy.control.CompilationUnit$1.call(CompilationUnit.java:161)
          [p #1] 	at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:846)
          [p #1] 	at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:550)
          [p #1] 	at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:526)
          [p #1] 	at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:503)
          [p #1] 	at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:302)
          [p #1] 	at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:281)
          [p #1] 	at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:267)
          [p #1] 	at groovy.lang.GroovyClassLoader.recompile(GroovyClassLoader.java:776)
          [p #1] 	at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:733)
          [p #1] 	at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:802)
          [p #1] 	at java.lang.ClassLoader.loadClass(ClassLoader.java:412)
          [p #1] 	at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:692)
          [p #1] 	at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:802)
          [p #1] 	at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:790)
          [p #1] 	at org.jenkinsci.plugins.workflow.cps.global.UserDefinedGlobalVariable.getValue(UserDefinedGlobalVariable.java:54)
          [p #1] 	at org.jenkinsci.plugins.workflow.cps.CpsScript.getProperty(CpsScript.java:121)
          [p #1] 	at org.codehaus.groovy.runtime.InvokerHelper.getProperty(InvokerHelper.java:156)
          [p #1] 	at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.getProperty(ScriptBytecodeAdapter.java:452)
          [p #1] 	at org.kohsuke.groovy.sandbox.impl.Checker$4.call(Checker.java:243)
          [p #1] 	at org.kohsuke.groovy.sandbox.GroovyInterceptor.onGetProperty(GroovyInterceptor.java:52)
          [p #1] 	at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetProperty(SandboxInterceptor.java:308)
          [p #1] 	at org.kohsuke.groovy.sandbox.impl.Checker$4.call(Checker.java:241)
          [p #1] 	at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:238)
          [p #1] 	at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.getProperty(SandboxInvoker.java:28)
          [p #1] 	at com.cloudbees.groovy.cps.impl.PropertyAccessBlock.rawGet(PropertyAccessBlock.java:20)
          [p #1] 	at WorkflowScript.run(WorkflowScript:1)
          [p #1] 	at ___cps.transform___(Native Method)
          [p #1] 	at com.cloudbees.groovy.cps.impl.PropertyishBlock$ContinuationImpl.get(PropertyishBlock.java:74)
          [p #1] 	at com.cloudbees.groovy.cps.LValueBlock$GetAdapter.receive(LValueBlock.java:30)
          [p #1] 	at com.cloudbees.groovy.cps.impl.PropertyishBlock$ContinuationImpl.fixName(PropertyishBlock.java:66)
          [p #1] 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          [p #1] 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
          [p #1] 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
          [p #1] 	at java.lang.reflect.Method.invoke(Method.java:606)
          [p #1] 	at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
          [p #1] 	at com.cloudbees.groovy.cps.impl.ConstantBlock.eval(ConstantBlock.java:21)
          [p #1] 	at com.cloudbees.groovy.cps.Next.step(Next.java:74)
          [p #1] 	at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:154)
          [p #1] 	at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$001(SandboxContinuable.java:18)
          [p #1] 	at org.jenkinsci.plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.java:33)
          [p #1] 	at org.jenkinsci.plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.java:30)
          [p #1] 	at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox.runInSandbox(GroovySandbox.java:108)
          [p #1] 	at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.java:30)
          [p #1] 	at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:165)
          [p #1] 	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:330)
          [p #1] 	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$100(CpsThreadGroup.java:82)
          [p #1] 	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:242)
          [p #1] 	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:230)
          [p #1] 	at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:64)
          [p #1] 	at java.util.concurrent.FutureTask.run(FutureTask.java:262)
          [p #1] 	at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:112)
          [p #1] 	at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
          [p #1] 	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
          [p #1] 	at java.util.concurrent.FutureTask.run(FutureTask.java:262)
          [p #1] 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
          [p #1] 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
          [p #1] 	at java.lang.Thread.run(Thread.java:745)
          

          So...there are two problems here:

          • if you've got a compilation failure in something from vars inside a try/catch (or some other scenario where the execution gets serialized after the compilation error but before completing), you get the NotSerializableException mess and don't see what the compilation error is.
          • If you've got a compilation failure in something from src, you get a basically useless error message.

          It probably makes sense to handle the src case separately, so I think I can solve the vars specific case here...

          Andrew Bayer added a comment - Hrm - so a compilation error under src gets you a different error altogether, regardless of try/catch magic: [p #1] BUG! exception in phase 'semantic analysis' in source unit 'WorkflowScript' The lookup for pkg.Lib caused a failed compilaton. There should not have been any compilation from this call. [p #1] at org.codehaus.groovy.control.ClassNodeResolver.tryAsLoaderClassOrScript(ClassNodeResolver.java:188) [p #1] at org.codehaus.groovy.control.ClassNodeResolver.findClassNode(ClassNodeResolver.java:168) [p #1] at org.codehaus.groovy.control.ClassNodeResolver.resolveName(ClassNodeResolver.java:124) [p #1] at org.codehaus.groovy.control.ResolveVisitor.resolveToOuter(ResolveVisitor.java:616) [p #1] at org.codehaus.groovy.control.ResolveVisitor.resolve(ResolveVisitor.java:268) [p #1] at org.codehaus.groovy.control.ResolveVisitor.resolve(ResolveVisitor.java:236) [p #1] at org.codehaus.groovy.control.ResolveVisitor.transformPropertyExpression(ResolveVisitor.java:773) [p #1] at org.codehaus.groovy.control.ResolveVisitor.transform(ResolveVisitor.java:636) [p #1] at org.codehaus.groovy.control.ResolveVisitor.transformPropertyExpression(ResolveVisitor.java:757) [p #1] at org.codehaus.groovy.control.ResolveVisitor.transform(ResolveVisitor.java:636) [p #1] at org.codehaus.groovy.ast.expr.Expression.transformExpressions(Expression.java:49) [p #1] at org.codehaus.groovy.ast.expr.GStringExpression.transformExpression(GStringExpression.java:54) [p #1] at org.codehaus.groovy.control.ResolveVisitor.transform(ResolveVisitor.java:651) [p #1] at org.codehaus.groovy.ast.expr.Expression.transformExpressions(Expression.java:49) [p #1] at org.codehaus.groovy.ast.expr.ArgumentListExpression.transformExpression(ArgumentListExpression.java:67) [p #1] at org.codehaus.groovy.control.ResolveVisitor.transform(ResolveVisitor.java:651) [p #1] at org.codehaus.groovy.control.ResolveVisitor.transformMethodCallExpression(ResolveVisitor.java:976) [p #1] at org.codehaus.groovy.control.ResolveVisitor.transform(ResolveVisitor.java:642) [p #1] at org.codehaus.groovy.ast.ClassCodeExpressionTransformer.visitExpressionStatement(ClassCodeExpressionTransformer.java:139) [p #1] at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:40) [p #1] at org.codehaus.groovy.ast.CodeVisitorSupport.visitBlockStatement(CodeVisitorSupport.java:35) [p #1] at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitBlockStatement(ClassCodeVisitorSupport.java:165) [p #1] at org.codehaus.groovy.control.ResolveVisitor.visitBlockStatement(ResolveVisitor.java:1233) [p #1] at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:69) [p #1] at org.codehaus.groovy.ast.CodeVisitorSupport.visitTryCatchFinally(CodeVisitorSupport.java:82) [p #1] at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitTryCatchFinally(ClassCodeVisitorSupport.java:230) [p #1] at org.codehaus.groovy.ast.stmt.TryCatchStatement.visit(TryCatchStatement.java:42) [p #1] at org.codehaus.groovy.ast.CodeVisitorSupport.visitBlockStatement(CodeVisitorSupport.java:35) [p #1] at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitBlockStatement(ClassCodeVisitorSupport.java:165) [p #1] at org.codehaus.groovy.control.ResolveVisitor.visitBlockStatement(ResolveVisitor.java:1233) [p #1] at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:69) [p #1] at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClassCodeContainer(ClassCodeVisitorSupport.java:101) [p #1] at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitConstructorOrMethod(ClassCodeVisitorSupport.java:112) [p #1] at org.codehaus.groovy.ast.ClassCodeExpressionTransformer.visitConstructorOrMethod(ClassCodeExpressionTransformer.java:50) [p #1] at org.codehaus.groovy.control.ResolveVisitor.visitConstructorOrMethod(ResolveVisitor.java:166) [p #1] at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitMethod(ClassCodeVisitorSupport.java:123) [p #1] at org.codehaus.groovy.ast.ClassNode.visitContents(ClassNode.java:1058) [p #1] at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClass(ClassCodeVisitorSupport.java:50) [p #1] at org.codehaus.groovy.control.ResolveVisitor.visitClass(ResolveVisitor.java:1176) [p #1] at org.codehaus.groovy.control.ResolveVisitor.startResolving(ResolveVisitor.java:141) [p #1] at org.codehaus.groovy.control.CompilationUnit$9.call(CompilationUnit.java:608) [p #1] at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:846) [p #1] at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:550) [p #1] at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:499) [p #1] at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:302) [p #1] at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:281) [p #1] at groovy.lang.GroovyShell.parseClass(GroovyShell.java:731) [p #1] at groovy.lang.GroovyShell.parse(GroovyShell.java:743) That's with or without the sleep involved, mind you. The vars equivalent without sleep gets you: [p #1] hudson.remoting.ProxyException: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: [p #1] / private / var /folders/pr/24nv8g910wg8vr4b4c33q34r0000gn/T/jenkinsTests.tmp/jenkins3982861903739805185test/jobs/p/builds/1/libs/compilationFailure/vars/busted.groovy: 1: expecting ')' , found ',' @ line 1, column 27. [p #1] String [] agentNames = ( 'a' , 'b' , 'c' ) [p #1] ^ [p #1] [p #1] 1 error [p #1] [p #1] at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:302) [p #1] at org.codehaus.groovy.control.ErrorCollector.addFatalError(ErrorCollector.java:149) [p #1] at org.codehaus.groovy.control.ErrorCollector.addError(ErrorCollector.java:119) [p #1] at org.codehaus.groovy.control.ErrorCollector.addError(ErrorCollector.java:131) [p #1] at org.codehaus.groovy.control.SourceUnit.addError(SourceUnit.java:359) [p #1] at org.codehaus.groovy.antlr.AntlrParserPlugin.transformCSTIntoAST(AntlrParserPlugin.java:142) [p #1] at org.codehaus.groovy.antlr.AntlrParserPlugin.parseCST(AntlrParserPlugin.java:108) [p #1] at org.codehaus.groovy.control.SourceUnit.parse(SourceUnit.java:236) [p #1] at org.codehaus.groovy.control.CompilationUnit$1.call(CompilationUnit.java:161) [p #1] at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:846) [p #1] at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:550) [p #1] at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:526) [p #1] at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:503) [p #1] at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:302) [p #1] at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:281) [p #1] at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:267) [p #1] at groovy.lang.GroovyClassLoader.recompile(GroovyClassLoader.java:776) [p #1] at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:733) [p #1] at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:802) [p #1] at java.lang. ClassLoader .loadClass( ClassLoader .java:412) [p #1] at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:692) [p #1] at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:802) [p #1] at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:790) [p #1] at org.jenkinsci.plugins.workflow.cps.global.UserDefinedGlobalVariable.getValue(UserDefinedGlobalVariable.java:54) [p #1] at org.jenkinsci.plugins.workflow.cps.CpsScript.getProperty(CpsScript.java:121) [p #1] at org.codehaus.groovy.runtime.InvokerHelper.getProperty(InvokerHelper.java:156) [p #1] at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.getProperty(ScriptBytecodeAdapter.java:452) [p #1] at org.kohsuke.groovy.sandbox.impl.Checker$4.call(Checker.java:243) [p #1] at org.kohsuke.groovy.sandbox.GroovyInterceptor.onGetProperty(GroovyInterceptor.java:52) [p #1] at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetProperty(SandboxInterceptor.java:308) [p #1] at org.kohsuke.groovy.sandbox.impl.Checker$4.call(Checker.java:241) [p #1] at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:238) [p #1] at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.getProperty(SandboxInvoker.java:28) [p #1] at com.cloudbees.groovy.cps.impl.PropertyAccessBlock.rawGet(PropertyAccessBlock.java:20) [p #1] at WorkflowScript.run(WorkflowScript:1) [p #1] at ___cps.transform___(Native Method) [p #1] at com.cloudbees.groovy.cps.impl.PropertyishBlock$ContinuationImpl.get(PropertyishBlock.java:74) [p #1] at com.cloudbees.groovy.cps.LValueBlock$GetAdapter.receive(LValueBlock.java:30) [p #1] at com.cloudbees.groovy.cps.impl.PropertyishBlock$ContinuationImpl.fixName(PropertyishBlock.java:66) [p #1] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [p #1] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) [p #1] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [p #1] at java.lang.reflect.Method.invoke(Method.java:606) [p #1] at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72) [p #1] at com.cloudbees.groovy.cps.impl.ConstantBlock.eval(ConstantBlock.java:21) [p #1] at com.cloudbees.groovy.cps.Next.step(Next.java:74) [p #1] at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:154) [p #1] at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$001(SandboxContinuable.java:18) [p #1] at org.jenkinsci.plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.java:33) [p #1] at org.jenkinsci.plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.java:30) [p #1] at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox.runInSandbox(GroovySandbox.java:108) [p #1] at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.java:30) [p #1] at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:165) [p #1] at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:330) [p #1] at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$100(CpsThreadGroup.java:82) [p #1] at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:242) [p #1] at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:230) [p #1] at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:64) [p #1] at java.util.concurrent.FutureTask.run(FutureTask.java:262) [p #1] at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:112) [p #1] at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28) [p #1] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [p #1] at java.util.concurrent.FutureTask.run(FutureTask.java:262) [p #1] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [p #1] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [p #1] at java.lang. Thread .run( Thread .java:745) So...there are two problems here: if you've got a compilation failure in something from vars inside a try/catch (or some other scenario where the execution gets serialized after the compilation error but before completing), you get the NotSerializableException mess and don't see what the compilation error is. If you've got a compilation failure in something from src , you get a basically useless error message. It probably makes sense to handle the src case separately, so I think I can solve the vars specific case here...

          Evin Callahan added a comment -

          I came across the same issue here when using a declarative pipeline with a shared library function that was broken (vars type). You were completely right that there was a compilation failure in that vars function - to detect it, i simply ran it through the groovy sh to make sure that it all was proper syntax and discovered where I was wrong. Fixed that and problem solved!

          Thanks abayer, always coming to my rescue

          Evin Callahan added a comment - I came across the same issue here when using a declarative pipeline with a shared library function that was broken ( vars type). You were completely right that there was a compilation failure in that vars function - to detect it, i simply ran it through the groovy sh to make sure that it all was proper syntax and discovered where I was wrong. Fixed that and problem solved! Thanks abayer , always coming to my rescue

          David S added a comment -

          Any update on this?

          It's really annoying to get this error instead of a proper compile error message.

           

          David S added a comment - Any update on this? It's really annoying to get this error instead of a proper compile error message.  

          Max M added a comment -

          I am as well getting the same ErrorCollector NotSerializable exception; however, a standalone call like this:

          $ groovy CI/erroring_script.groovy
          $
          

          (outside of Jenkins) does not show any compilation errors!

          In Jenkins, OTOH, this same file causes stacktraces like this:

          an exception which occurred:
          	in field org.codehaus.groovy.control.MultipleCompilationErrorsException.collector
          	in object org.codehaus.groovy.control.MultipleCompilationErrorsException@5c35f1cb
          	in field com.cloudbees.groovy.cps.Outcome.abnormal
          	in object com.cloudbees.groovy.cps.Outcome@3bd3307c
          	in field org.jenkinsci.plugins.workflow.cps.CpsBodyExecution.outcome
          	in object org.jenkinsci.plugins.workflow.cps.CpsBodyExecution@5ea1a9f6
          	in field com.dabsquared.gitlabjenkins.workflow.GitLabCommitStatusStep$GitLabCommitStatusStepExecution.body
          	in object com.dabsquared.gitlabjenkins.workflow.GitLabCommitStatusStep$GitLabCommitStatusStepExecution@1d84ca28
          	in field org.jenkinsci.plugins.workflow.cps.CpsThread.step
          	in object org.jenkinsci.plugins.workflow.cps.CpsThread@57923e5c
          	in field org.jenkinsci.plugins.workflow.cps.CpsBodyExecution.thread
          	in object org.jenkinsci.plugins.workflow.cps.CpsBodyExecution@1509e249
          	in field org.jenkinsci.plugins.workflow.cps.CpsBodyExecution$SuccessAdapter.this$0
          	in object org.jenkinsci.plugins.workflow.cps.CpsBodyExecution$SuccessAdapter@66aabd0b
          	in field com.cloudbees.groovy.cps.impl.CallEnv.returnAddress
          	in object com.cloudbees.groovy.cps.impl.FunctionCallEnv@4ece610f
          	in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent
          	in object com.cloudbees.groovy.cps.impl.TryBlockEnv@164ca394
          	in field com.cloudbees.groovy.cps.impl.CallEnv.caller
          	in object com.cloudbees.groovy.cps.impl.ClosureCallEnv@5e76c9db
          	in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent
          	in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@147a91d1
          	in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent
          	in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@1e88ca58
          	in field com.cloudbees.groovy.cps.impl.CpsClosureDef.capture
          	in object com.cloudbees.groovy.cps.impl.CpsClosureDef@34f25659
          	in field com.cloudbees.groovy.cps.impl.CpsClosure.def
          	in object org.jenkinsci.plugins.workflow.cps.CpsClosure2@15439a64
          	in field org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.closures
          	in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@89104e8
          	in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@89104e8
          Caused: java.io.NotSerializableException: org.codehaus.groovy.control.ErrorCollector
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
          	at org.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65)
          	at org.jboss.marshalling.river.BlockMarshaller.writeObject(BlockMarshaller.java:56)
          	at org.jboss.marshalling.MarshallerObjectOutputStream.writeObjectOverride(MarshallerObjectOutputStream.java:50)
          	at org.jboss.marshalling.river.RiverObjectOutputStream.writeObjectOverride(RiverObjectOutputStream.java:179)
          	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:344)
          	at java.util.HashMap.internalWriteEntries(HashMap.java:1790)
          	at java.util.HashMap.writeObject(HashMap.java:1363)
          	at sun.reflect.GeneratedMethodAccessor463.invoke(Unknown Source)
          	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
          	at java.lang.reflect.Method.invoke(Method.java:498)
          	at org.jboss.marshalling.reflect.SerializableClass.callWriteObject(SerializableClass.java:273)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:976)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
          	at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
          	at org.jboss.marshalling.AbstractObjectOutput.writeObject(AbstractObjectOutput.java:58)
          	at org.jboss.marshalling.AbstractMarshaller.writeObject(AbstractMarshaller.java:111)
          	at org.jenkinsci.plugins.workflow.support.pickles.serialization.RiverWriter.lambda$writeObject$0(RiverWriter.java:144)
          	at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox.runInSandbox(GroovySandbox.java:108)
          	at org.jenkinsci.plugins.workflow.support.pickles.serialization.RiverWriter.writeObject(RiverWriter.java:143)
          	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:467)
          	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:443)
          	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgramIfPossible(CpsThreadGroup.java:430)
          	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:367)
          	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$200(CpsThreadGroup.java:82)
          	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:243)
          	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:231)
          	at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:64)
          	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
          	at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:112)
          	at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
          	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
          	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
          	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
          	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
          	at java.lang.Thread.run(Thread.java:748)
          

          No idea if anyone familiar with Jenkins Groovy CPS transform can deduce something meaningful from the stacktrace; I can't. All I know is that one of the functions from the script is called in a try-finally block; that the function creates closures (and saves them in a map with string keys); that the function uses string interpolation.

          Any hints on how to troubleshoot this – greatly appreciated, off course.

          For now, to troubleshoot this, one has to resort to primitive blind trial-and-error, with not uncommonly hours long feedback cycles (a modest CD pipeline build time).

          Which is horrendous! The error reporting should definitely improve.

          Max M added a comment - I am as well getting the same ErrorCollector   NotSerializable exception; however, a standalone call like this: $ groovy CI/erroring_script.groovy $ (outside of Jenkins) does not show any compilation errors! In Jenkins, OTOH, this same file causes stacktraces like this: an exception which occurred: in field org.codehaus.groovy.control.MultipleCompilationErrorsException.collector in object org.codehaus.groovy.control.MultipleCompilationErrorsException@5c35f1cb in field com.cloudbees.groovy.cps.Outcome.abnormal in object com.cloudbees.groovy.cps.Outcome@3bd3307c in field org.jenkinsci.plugins.workflow.cps.CpsBodyExecution.outcome in object org.jenkinsci.plugins.workflow.cps.CpsBodyExecution@5ea1a9f6 in field com.dabsquared.gitlabjenkins.workflow.GitLabCommitStatusStep$GitLabCommitStatusStepExecution.body in object com.dabsquared.gitlabjenkins.workflow.GitLabCommitStatusStep$GitLabCommitStatusStepExecution@1d84ca28 in field org.jenkinsci.plugins.workflow.cps.CpsThread.step in object org.jenkinsci.plugins.workflow.cps.CpsThread@57923e5c in field org.jenkinsci.plugins.workflow.cps.CpsBodyExecution.thread in object org.jenkinsci.plugins.workflow.cps.CpsBodyExecution@1509e249 in field org.jenkinsci.plugins.workflow.cps.CpsBodyExecution$SuccessAdapter. this $0 in object org.jenkinsci.plugins.workflow.cps.CpsBodyExecution$SuccessAdapter@66aabd0b in field com.cloudbees.groovy.cps.impl.CallEnv.returnAddress in object com.cloudbees.groovy.cps.impl.FunctionCallEnv@4ece610f in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent in object com.cloudbees.groovy.cps.impl.TryBlockEnv@164ca394 in field com.cloudbees.groovy.cps.impl.CallEnv.caller in object com.cloudbees.groovy.cps.impl.ClosureCallEnv@5e76c9db in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@147a91d1 in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@1e88ca58 in field com.cloudbees.groovy.cps.impl.CpsClosureDef.capture in object com.cloudbees.groovy.cps.impl.CpsClosureDef@34f25659 in field com.cloudbees.groovy.cps.impl.CpsClosure.def in object org.jenkinsci.plugins.workflow.cps.CpsClosure2@15439a64 in field org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.closures in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@89104e8 in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@89104e8 Caused: java.io.NotSerializableException: org.codehaus.groovy.control.ErrorCollector at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860) at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032) at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988) at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032) at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988) at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032) at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988) at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032) at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988) at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032) at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988) at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032) at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988) at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032) at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988) at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032) at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988) at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967) at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032) at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988) at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967) at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032) at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988) at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967) at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032) at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988) at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967) at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032) at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988) at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967) at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032) at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988) at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032) at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988) at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967) at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) at org.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65) at org.jboss.marshalling.river.BlockMarshaller.writeObject(BlockMarshaller.java:56) at org.jboss.marshalling.MarshallerObjectOutputStream.writeObjectOverride(MarshallerObjectOutputStream.java:50) at org.jboss.marshalling.river.RiverObjectOutputStream.writeObjectOverride(RiverObjectOutputStream.java:179) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:344) at java.util.HashMap.internalWriteEntries(HashMap.java:1790) at java.util.HashMap.writeObject(HashMap.java:1363) at sun.reflect.GeneratedMethodAccessor463.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.jboss.marshalling.reflect.SerializableClass.callWriteObject(SerializableClass.java:273) at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:976) at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032) at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988) at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) at org.jboss.marshalling.AbstractObjectOutput.writeObject(AbstractObjectOutput.java:58) at org.jboss.marshalling.AbstractMarshaller.writeObject(AbstractMarshaller.java:111) at org.jenkinsci.plugins.workflow.support.pickles.serialization.RiverWriter.lambda$writeObject$0(RiverWriter.java:144) at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox.runInSandbox(GroovySandbox.java:108) at org.jenkinsci.plugins.workflow.support.pickles.serialization.RiverWriter.writeObject(RiverWriter.java:143) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:467) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:443) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgramIfPossible(CpsThreadGroup.java:430) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:367) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$200(CpsThreadGroup.java:82) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:243) at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:231) at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:64) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:112) at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang. Thread .run( Thread .java:748) No idea if anyone familiar with Jenkins Groovy CPS transform can deduce something meaningful from the stacktrace; I can't. All I know is that one of the functions from the script is called in a try-finally block; that the function creates closures (and saves them in a map with string keys); that the function uses string interpolation. Any hints on how to troubleshoot this – greatly appreciated, off course. For now, to troubleshoot this, one has to resort to primitive blind trial-and-error, with not uncommonly hours long feedback cycles (a modest CD pipeline build time). Which is horrendous! The error reporting should definitely improve.

          Andrew Bayer added a comment -

          ulidtko - any chance you could attach your script that's failing?

          Andrew Bayer added a comment - ulidtko - any chance you could attach your script that's failing?

          Max M added a comment -

          Hey abayer!

          I've succeeded in minimizing the reproducing config for my case:

          node('build-server') {
            gitlabCommitStatus {
              // try {
                stage('CI fail test') {
                  sh('echo IP=10.0.0.1 > test_env')
                  load('test_env')
                }
              // }
              // catch (java.lang.Throwable error) {
              //   println "exception caught"
              //   println error
              //   throw error
              // }
            }
          }
          

          It seems that gitlabCommitStatus wrap is essential here: without it, exception details are clear and informative in the log. With it, I get NotSerializableException as above.

          The exact compile error trigger is less important: here, it's that IP=10.0.0.1 isn't valid Groovy. Of course, this could've been a legitimate Groovy CI module load, perhaps with a syntax error as well.

          The commented try-catch is a workaround I found which helps to see the actual compile error.

          Might it be a gitlabCommitStatus bug?.. I don't even know which plugin is that from, sorry about that.

          Anyway, hope this helps!

          Max M added a comment - Hey abayer ! I've succeeded in minimizing the reproducing config for my case: node( 'build-server' ) { gitlabCommitStatus { // try { stage( 'CI fail test' ) { sh( 'echo IP=10.0.0.1 > test_env' ) load( 'test_env' ) } // } // catch (java.lang.Throwable error) { // println "exception caught" // println error // throw error // } } } It seems that gitlabCommitStatus wrap is essential here: without it, exception details are clear and informative in the log. With it, I get NotSerializableException as above. The exact compile error trigger is less important: here, it's that IP=10.0.0.1 isn't valid Groovy. Of course, this could've been a legitimate Groovy CI module load, perhaps with a syntax error as well. The commented try-catch is a workaround I found which helps to see the actual compile error. Might it be a gitlabCommitStatus bug?.. I don't even know which plugin is that from, sorry about that. Anyway, hope this helps!

          Andrew Bayer added a comment -

          Yeah, it does appear to be an issue with the Gitlab step (which is from the gitlab plugin, FYI) trying to persist the result of executing the body. I’d advise opening a new JIRA against the gitlab plugin for that.

          Andrew Bayer added a comment - Yeah, it does appear to be an issue with the Gitlab step (which is from the gitlab plugin, FYI) trying to persist the result of executing the body. I’d advise opening a new JIRA against the gitlab plugin for that.

          Max M added a comment -

          Reported as JENKINS-50740.

          Max M added a comment - Reported as JENKINS-50740 .

          Devin Nusbaum added a comment -

          Devin Nusbaum added a comment - A fix is in review here: https://github.com/jenkinsci/workflow-cps-global-lib-plugin/pull/53 .

          Devin Nusbaum added a comment -

          Fixes released in Pipeline: Groovy version 2.57 and Pipeline: Shared Groovy Libraries version 2.12. Thanks rudolfwg!

          Devin Nusbaum added a comment - Fixes released in Pipeline: Groovy version 2.57 and Pipeline: Shared Groovy Libraries version 2.12. Thanks rudolfwg !

            rudolfwg Rudolf-Walter Kiss-Szakacs
            sshkolni Sasha Shkolnik
            Votes:
            7 Vote for this issue
            Watchers:
            14 Start watching this issue

              Created:
              Updated:
              Resolved: