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

Pipeline is unable to locate global libraries when build attempts to continue on restart

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: Major Major
    • pipeline
    • None

      I have created a simple test case to reproduce this using a Jenkinsfile which calls off to a closure called dockerNode, that is located in a global library named dockerNode.groovy, located in workflowLibs/vars/dockerNode.groovy.

      The following exception is thrown in the build console output when restarting Jenkins (JENKINS_URL/restart) during build execution:

      java.io.IOException: Failed to load persisted workflow state
      	at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution$3.onSuccess(CpsFlowExecution.java:529)
      	at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution$3.onSuccess(CpsFlowExecution.java:527)
      	at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution$4$1.run(CpsFlowExecution.java:568)
      	at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$1.run(CpsVmExecutorService.java:32)
      	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
      	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: java.lang.ClassNotFoundException: dockerNode
      	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
      	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
      	at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:692)
      	at groovy.lang.GroovyClassLoader$InnerLoader.loadClass(GroovyClassLoader.java:445)
      	at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:802)
      	at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:790)
      	at java.lang.Class.forName0(Native Method)
      	at java.lang.Class.forName(Class.java:348)
      	at org.jboss.marshalling.AbstractClassResolver.loadClass(AbstractClassResolver.java:131)
      	at org.jboss.marshalling.AbstractClassResolver.resolveClass(AbstractClassResolver.java:112)
      	at org.jboss.marshalling.river.RiverUnmarshaller.doReadClassDescriptor(RiverUnmarshaller.java:949)
      	at org.jboss.marshalling.river.RiverUnmarshaller.doReadNewObject(RiverUnmarshaller.java:1256)
      	at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:276)
      	at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:224)
      	at org.jboss.marshalling.river.RiverUnmarshaller.readFields(RiverUnmarshaller.java:1746)
      	at org.jboss.marshalling.river.RiverUnmarshaller.doInitSerializable(RiverUnmarshaller.java:1659)
      	at org.jboss.marshalling.river.RiverUnmarshaller.doInitSerializable(RiverUnmarshaller.java:1607)
      	at org.jboss.marshalling.river.RiverUnmarshaller.doInitSerializable(RiverUnmarshaller.java:1607)
      	at org.jboss.marshalling.river.RiverUnmarshaller.doReadNewObject(RiverUnmarshaller.java:1286)
      	at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:276)
      	at org.jboss.marshalling.river.BlockUnmarshaller.readObject(BlockUnmarshaller.java:149)
      	at org.jboss.marshalling.river.BlockUnmarshaller.readObject(BlockUnmarshaller.java:135)
      	at org.jboss.marshalling.MarshallerObjectInputStream.readObjectOverride(MarshallerObjectInputStream.java:53)
      	at org.jboss.marshalling.river.RiverObjectInputStream.readObjectOverride(RiverObjectInputStream.java:307)
      	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:365)
      	at java.util.HashMap.readObject(HashMap.java:1396)
      	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:498)
      	at org.jboss.marshalling.reflect.SerializableClass.callReadObject(SerializableClass.java:307)
      	at org.jboss.marshalling.river.RiverUnmarshaller.doInitSerializable(RiverUnmarshaller.java:1638)
      	at org.jboss.marshalling.river.RiverUnmarshaller.doReadNewObject(RiverUnmarshaller.java:1286)
      	at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:276)
      	at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:224)
      	at org.jboss.marshalling.river.RiverUnmarshaller.readFields(RiverUnmarshaller.java:1746)
      	at org.jboss.marshalling.river.RiverUnmarshaller.doInitSerializable(RiverUnmarshaller.java:1659)
      	at org.jboss.marshalling.river.RiverUnmarshaller.doReadNewObject(RiverUnmarshaller.java:1286)
      	at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:276)
      	at org.jboss.marshalling.river.RiverUnmarshaller.doReadObject(RiverUnmarshaller.java:209)
      	at org.jboss.marshalling.AbstractObjectInput.readObject(AbstractObjectInput.java:41)
      	at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution$2.onSuccess(CpsFlowExecution.java:469)
      	at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution$2.onSuccess(CpsFlowExecution.java:463)
      	at org.jenkinsci.plugins.workflow.support.concurrent.Futures$1.run(Futures.java:150)
      	at com.google.common.util.concurrent.MoreExecutors$SameThreadExecutorService.execute(MoreExecutors.java:253)
      	at com.google.common.util.concurrent.ExecutionList$RunnableExecutorPair.execute(ExecutionList.java:149)
      	at com.google.common.util.concurrent.ExecutionList.execute(ExecutionList.java:134)
      	at com.google.common.util.concurrent.AbstractFuture.set(AbstractFuture.java:170)
      	at org.jenkinsci.plugins.workflow.support.concurrent.ChainingListenableFuture.access$000(ChainingListenableFuture.java:33)
      	at org.jenkinsci.plugins.workflow.support.concurrent.ChainingListenableFuture$1.run(ChainingListenableFuture.java:196)
      	at com.google.common.util.concurrent.MoreExecutors$SameThreadExecutorService.execute(MoreExecutors.java:253)
      	at com.google.common.util.concurrent.ExecutionList$RunnableExecutorPair.execute(ExecutionList.java:149)
      	at com.google.common.util.concurrent.ExecutionList.add(ExecutionList.java:105)
      	at com.google.common.util.concurrent.AbstractFuture.addListener(AbstractFuture.java:155)
      	at org.jenkinsci.plugins.workflow.support.concurrent.ChainingListenableFuture.run(ChainingListenableFuture.java:189)
      	at com.google.common.util.concurrent.MoreExecutors$SameThreadExecutorService.execute(MoreExecutors.java:253)
      	at com.google.common.util.concurrent.ExecutionList$RunnableExecutorPair.execute(ExecutionList.java:149)
      	at com.google.common.util.concurrent.ExecutionList.execute(ExecutionList.java:134)
      	at com.google.common.util.concurrent.AbstractFuture.set(AbstractFuture.java:170)
      	at org.jenkinsci.plugins.workflow.support.concurrent.ChainingListenableFuture.access$000(ChainingListenableFuture.java:33)
      	at org.jenkinsci.plugins.workflow.support.concurrent.ChainingListenableFuture$1.run(ChainingListenableFuture.java:196)
      	at com.google.common.util.concurrent.MoreExecutors$SameThreadExecutorService.execute(MoreExecutors.java:253)
      	at com.google.common.util.concurrent.ExecutionList$RunnableExecutorPair.execute(ExecutionList.java:149)
      	at com.google.common.util.concurrent.ExecutionList.add(ExecutionList.java:105)
      	at com.google.common.util.concurrent.AbstractFuture.addListener(AbstractFuture.java:155)
      	at org.jenkinsci.plugins.workflow.support.concurrent.ChainingListenableFuture.run(ChainingListenableFuture.java:189)
      	at com.google.common.util.concurrent.MoreExecutors$SameThreadExecutorService.execute(MoreExecutors.java:253)
      	at com.google.common.util.concurrent.ExecutionList$RunnableExecutorPair.execute(ExecutionList.java:149)
      	at com.google.common.util.concurrent.ExecutionList.execute(ExecutionList.java:134)
      	at com.google.common.util.concurrent.AbstractFuture.set(AbstractFuture.java:170)
      	at org.jenkinsci.plugins.workflow.support.concurrent.ListFuture.setOneValue(ListFuture.java:158)
      	at org.jenkinsci.plugins.workflow.support.concurrent.ListFuture.access$000(ListFuture.java:40)
      	at org.jenkinsci.plugins.workflow.support.concurrent.ListFuture$2.run(ListFuture.java:107)
      	at com.google.common.util.concurrent.MoreExecutors$SameThreadExecutorService.execute(MoreExecutors.java:253)
      	at com.google.common.util.concurrent.ExecutionList$RunnableExecutorPair.execute(ExecutionList.java:149)
      	at com.google.common.util.concurrent.ExecutionList.execute(ExecutionList.java:134)
      	at com.google.common.util.concurrent.AbstractFuture.set(AbstractFuture.java:170)
      	at org.jenkinsci.plugins.workflow.support.concurrent.ChainingListenableFuture.access$000(ChainingListenableFuture.java:33)
      	at org.jenkinsci.plugins.workflow.support.concurrent.ChainingListenableFuture$1.run(ChainingListenableFuture.java:196)
      	at com.google.common.util.concurrent.MoreExecutors$SameThreadExecutorService.execute(MoreExecutors.java:253)
      	at com.google.common.util.concurrent.ExecutionList$RunnableExecutorPair.execute(ExecutionList.java:149)
      	at com.google.common.util.concurrent.ExecutionList.add(ExecutionList.java:105)
      	at com.google.common.util.concurrent.AbstractFuture.addListener(AbstractFuture.java:155)
      	at org.jenkinsci.plugins.workflow.support.concurrent.ChainingListenableFuture.run(ChainingListenableFuture.java:189)
      	at com.google.common.util.concurrent.MoreExecutors$SameThreadExecutorService.execute(MoreExecutors.java:253)
      	at com.google.common.util.concurrent.ExecutionList$RunnableExecutorPair.execute(ExecutionList.java:149)
      	at com.google.common.util.concurrent.ExecutionList.execute(ExecutionList.java:134)
      	at com.google.common.util.concurrent.AbstractFuture.set(AbstractFuture.java:170)
      	at org.jenkinsci.plugins.workflow.support.pickles.TryRepeatedly.access$200(TryRepeatedly.java:40)
      	at org.jenkinsci.plugins.workflow.support.pickles.TryRepeatedly$1.run(TryRepeatedly.java:66)
      	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
      	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
      	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
      	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
      	... 3 more
      

      Attached are:

      • Jenkinsfile
      • dockerNode.groovy

      Versions:

      • Jenkins 1.642
      • Pipeline 1.14

          [JENKINS-34517] Pipeline is unable to locate global libraries when build attempts to continue on restart

          davidkarlsen added a comment - - edited

          Even worse - the whole job can go into an illegal state. The job broke on startup with this issue 1), but the next is waiting for the previous one to complete

          1)

          18:57:11 Waiting for builds [717]
          Resuming build
          [Pipeline] End of Pipeline
          [Bitbucket] Notifying commit build result
          [Bitbucket] Build result notified
          java.io.IOException: Failed to load pe
          

          2)

          19:31:54 Waiting for builds [718]
          

          Update: I see this registered as https://issues.jenkins-ci.org/browse/JENKINS-28183

          davidkarlsen added a comment - - edited Even worse - the whole job can go into an illegal state. The job broke on startup with this issue 1), but the next is waiting for the previous one to complete 1) 18:57:11 Waiting for builds [717] Resuming build [Pipeline] End of Pipeline [Bitbucket] Notifying commit build result [Bitbucket] Build result notified java.io.IOException: Failed to load pe 2) 19:31:54 Waiting for builds [718] Update: I see this registered as https://issues.jenkins-ci.org/browse/JENKINS-28183

          Jesse Glick added a comment -

          Released as 2.1.

          Jesse Glick added a comment - Released as 2.1.

          There seems to be issue with invoking static methods on global variables after updating to 2.1. (I reverted back to 2.0 already)

          Following is supposed to work:

          workflowLibs/vars/TEST.groovy

          def testMethod(String options = '') {
          ...
          }
          
          hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: static TEST.testMethod() is applicable for argument types: (java.lang.String) values: [47380]
          Possible solutions: testMethod(java.lang.String), testMethod()
          	at groovy.lang.MetaClassImpl.invokeStaticMissingMethod(MetaClassImpl.java:1367)
          	at groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1353)
          	at org.codehaus.groovy.runtime.callsite.StaticMetaClassSite.call(StaticMetaClassSite.java:50)
          	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42)
          	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
          	at com.cloudbees.groovy.cps.sandbox.DefaultInvoker.methodCall(DefaultInvoker.java:15)
          	at WorkflowScript.run(WorkflowScript:6)
          
          

          Martin Vehovsky added a comment - There seems to be issue with invoking static methods on global variables after updating to 2.1. (I reverted back to 2.0 already) Following is supposed to work: workflowLibs/vars/TEST.groovy def testMethod( String options = '') { ... } hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: static TEST.testMethod() is applicable for argument types: (java.lang. String ) values: [47380] Possible solutions: testMethod(java.lang. String ), testMethod() at groovy.lang.MetaClassImpl.invokeStaticMissingMethod(MetaClassImpl.java:1367) at groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1353) at org.codehaus.groovy.runtime.callsite.StaticMetaClassSite.call(StaticMetaClassSite.java:50) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108) at com.cloudbees.groovy.cps.sandbox.DefaultInvoker.methodCall(DefaultInvoker.java:15) at WorkflowScript.run(WorkflowScript:6)

          davidkarlsen added a comment - - edited

          So should this be reopened or reported as a new issue? Could a new release be done after that as we'd really like to get this one.

          davidkarlsen added a comment - - edited So should this be reopened or reported as a new issue? Could a new release be done after that as we'd really like to get this one.

          davidkarlsen added a comment -

          ping (we're a CB customer - so this actually came from issue #35678 in zendesk)

          davidkarlsen added a comment - ping (we're a CB customer - so this actually came from issue #35678 in zendesk)

          davidkarlsen I would expect some feedback from jglick ...

          Martin Vehovsky added a comment - davidkarlsen I would expect some feedback from jglick ...

          This introduced major regression, see below:

          There seems to be issue with invoking static methods on global variables after updating to 2.1. (I reverted back to 2.0 already)

          Following is supposed to work:

          workflowLibs/vars/TEST.groovy

          def testMethod(String options = '') {
          ...
          }
          
          hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: static TEST.testMethod() is applicable for argument types: (java.lang.String) values: [47380]
          Possible solutions: testMethod(java.lang.String), testMethod()
          	at groovy.lang.MetaClassImpl.invokeStaticMissingMethod(MetaClassImpl.java:1367)
          	at groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1353)
          	at org.codehaus.groovy.runtime.callsite.StaticMetaClassSite.call(StaticMetaClassSite.java:50)
          	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42)
          	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
          	at com.cloudbees.groovy.cps.sandbox.DefaultInvoker.methodCall(DefaultInvoker.java:15)
          	at WorkflowScript.run(WorkflowScript:6)
          
          

          Martin Vehovsky added a comment - This introduced major regression, see below: There seems to be issue with invoking static methods on global variables after updating to 2.1. (I reverted back to 2.0 already) Following is supposed to work: workflowLibs/vars/TEST.groovy def testMethod( String options = '') { ... } hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: static TEST.testMethod() is applicable for argument types: (java.lang. String ) values: [47380] Possible solutions: testMethod(java.lang. String ), testMethod() at groovy.lang.MetaClassImpl.invokeStaticMissingMethod(MetaClassImpl.java:1367) at groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1353) at org.codehaus.groovy.runtime.callsite.StaticMetaClassSite.call(StaticMetaClassSite.java:50) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108) at com.cloudbees.groovy.cps.sandbox.DefaultInvoker.methodCall(DefaultInvoker.java:15) at WorkflowScript.run(WorkflowScript:6)

          Same issue for me. One workaround is to put your groovy-script into the "src"-folder into a package and instantiate it the "classical" way.
          I hope this helps anyone, because it took me some time to realize

          Sebastian Pieck added a comment - Same issue for me. One workaround is to put your groovy-script into the "src"-folder into a package and instantiate it the "classical" way. I hope this helps anyone, because it took me some time to realize

          Yes, but I really don't want to rewrite all my workflows, just because of regression.

          Martin Vehovsky added a comment - Yes, but I really don't want to rewrite all my workflows, just because of regression.

          Jesse Glick added a comment -

          Please file any regressions separately, blocking this one and using the regression keyword.

          Jesse Glick added a comment - Please file any regressions separately, blocking this one and using the regression keyword.

            jglick Jesse Glick
            owood Owen Wood
            Votes:
            4 Vote for this issue
            Watchers:
            8 Start watching this issue

              Created:
              Updated:
              Resolved: