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

Declarative Pipeline using a bugged shared library produces a NotSerializableException

    XMLWordPrintable

    Details

    • Similar Issues:

      Description

      Summary:
      A Declarative Jenkinsfile which is using a Library that has a syntax error in it can create a NotSerializableException.

      Prerequisites:
      1. A repo with a shared library, in the form of repo-name/blob/master/vars/Variables.groovy. The library needs to be bugged. I used this (note the parenthesis ( ) around the values for agentNames[] instead of square brackets [ ]:

      /* 
      Use these with your declarative pipelines.
      */
      
      // Let's insert this purposely bugged String array, to  see if 
      // Jenkins picks up the library at all.
      String[] agentNames = ("linux","windows","other")
      int FILE_SIZE = 3333
      // String FILE_SIZE = "4444"
      
      

      2. This shared library needs to be set up in /configure, under Global Pipeline Libraries:

      3. A Jenkinsfile that makes use of this shared library (I'll attach the one I've used). I've been able to recreate this both as a mulibranch pipeline job from a GitHub Enterprise repo, and as a standalone Pipeline job.

      Steps to recreate:
      1. Create your job with the following Jenkinsfile:

      pipeline {
      
          libraries {
              lib("declarative-libs")
          }
      
          agent {
              label ("linux")
          }
      
          stages {
              stage('Set file size with a shared lib, WOW') {
                  steps {
                      echo "--> SIZE_OF_GIBBERISH_FILE is ${Variables.SIZE_OF_GIBBERISH_FILE}"
                      script {
                          int randomFileSize = "${Variables.SIZE_OF_GIBBERISH_FILE}"
                          stage ("Script stage") {
                              for (int j = 0; j < 5; j++) {
                                  node {
                                      sh "for i in `seq 1 100`; do cat /dev/urandom | env LC_CTYPE=c tr -dc \'[:alpha:]\' | head -c $randomFileSize; done"
                                  }
                              }
                          }
                      }                      
                  }
              }
          } // end stages
       }
      

      2. Run the build.

      3. Observe a NotSerializableException in the console output:

      Started by user admin
      [Pipeline] library
      Loading library declarative-libs@master
       > git rev-parse --is-inside-work-tree # timeout=10
      Setting origin to https://github.beescloud.com/dev1/declarative-libs.git
       > git config remote.origin.url https://github.beescloud.com/dev1/declarative-libs.git # timeout=10
      Fetching origin...
      Fetching upstream changes from origin
       > git --version # timeout=10
      using GIT_ASKPASS to set credentials dev1 with Viva
       > git fetch --tags --progress origin +refs/heads/*:refs/remotes/origin/*
       > git rev-parse master^{commit} # timeout=10
       > git rev-parse origin/master^{commit} # timeout=10
       > git rev-parse --is-inside-work-tree # timeout=10
      Fetching changes from the remote Git repository
       > git config remote.origin.url https://github.beescloud.com/dev1/declarative-libs.git # timeout=10
      Fetching without tags
      Fetching upstream changes from https://github.beescloud.com/dev1/declarative-libs.git
       > git --version # timeout=10
      using GIT_ASKPASS to set credentials dev1 with Viva
       > git fetch --no-tags --progress https://github.beescloud.com/dev1/declarative-libs.git +refs/heads/master:refs/remotes/origin/master
      Checking out Revision 1fb446ab993643a4641b0729160affa02ab817e0 (master)
      Commit message: "re-bug it."
       > git config core.sparsecheckout # timeout=10
       > git checkout -f 1fb446ab993643a4641b0729160affa02ab817e0
       > git rev-list 82ad86a376a88035ba4f2446e74fe128d4826927 # timeout=10
      [Pipeline] node
      Running on 14-agent in /home/ec2-user/jenkins/jenkins/workspace/aa-serialization-thing
      [Pipeline] {
      [Pipeline] stage
      [Pipeline] { (Set file size with a shared lib, WOW)
      [Pipeline] }
      [Pipeline] // stage
      [Pipeline] }
      [Pipeline] // node
      [Pipeline] End of Pipeline
      an exception which occurred:
      	in field collector
      	in field locals
      	in field parent
      	in field parent
      	in field capture
      	in field def
      	in field delegate
      	in field closures
      	in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@39981842
      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.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:1777)
      	at java.util.HashMap.writeObject(HashMap.java:1354)
      	at sun.reflect.GeneratedMethodAccessor22.invoke(Unknown Source)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:497)
      	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.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.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.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:1777)
      	at java.util.HashMap.writeObject(HashMap.java:1354)
      	at sun.reflect.GeneratedMethodAccessor22.invoke(Unknown Source)
      	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      	at java.lang.reflect.Method.invoke(Method.java:497)
      	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:140)
      	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:458)
      	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:434)
      	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgramIfPossible(CpsThreadGroup.java:422)
      	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:362)
      	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$100(CpsThreadGroup.java:82)
      	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:242)
      	at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:230)
      	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:1142)
      	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
      	at java.lang.Thread.run(Thread.java:745)
      Finished: FAILURE
      

        Attachments

          Issue Links

            Activity

            kshultz Karl Shultz created issue -
            kshultz Karl Shultz made changes -
            Field Original Value New Value
            Assignee Andrew Bayer [ abayer ]
            kshultz Karl Shultz made changes -
            Description *Summary:*
            A Declarative Jenkinsfile which is using a Library that has a syntax error in it can create a NotSerializableException.

            *Prerequisites:*
            1. A repo with a shared library, in the form of {{repo-name/blob/master/vars/Variables.groovy}}. The library needs to be bugged. I used this:

            {code:none}
            /*
            Use these with your declarative pipelines.
            */

            // Let's insert this purposely bugged String array, to see if
            // Jenkins picks up the library at all.
            String[] agentNames = ("linux","windows","other")
            int FILE_SIZE = 3333
            // String FILE_SIZE = "4444"

            {code}

            2. This shared library needs to be set up in /configure, under Global Pipeline Libraries:

             !image-2017-09-06-21-03-06-958.png|thumbnail!

            3. A Jenkinsfile that makes use of this shared library (I'll attach the one I've used). I've been able to recreate this both as a mulibranch pipeline job from a GitHub Enterprise repo, and as a standalone Pipeline job.

            *Steps to recreate:*
            1. Create your job with the following Jenkinsfile:

            {code:none}
            pipeline {

                libraries {
                    lib("declarative-libs")
                }

                agent {
                    label ("linux")
                }

                stages {
                    stage('Set file size with a shared lib, WOW') {
                        steps {
                            echo "--> SIZE_OF_GIBBERISH_FILE is ${Variables.SIZE_OF_GIBBERISH_FILE}"
                            script {
                                int randomFileSize = "${Variables.SIZE_OF_GIBBERISH_FILE}"
                                stage ("Script stage") {
                                    for (int j = 0; j < 5; j++) {
                                        node {
                                            sh "for i in `seq 1 100`; do cat /dev/urandom | env LC_CTYPE=c tr -dc \'[:alpha:]\' | head -c $randomFileSize; done"
                                        }
                                    }
                                }
                            }
                        }
                    }
                } // end stages
             }
            {code}

            2. Run the build.

            3. Observe a NotSerializableException in the console output:

            {code:none}
            Started by user admin
            [Pipeline] library
            Loading library declarative-libs@master
             > git rev-parse --is-inside-work-tree # timeout=10
            Setting origin to https://github.beescloud.com/dev1/declarative-libs.git
             > git config remote.origin.url https://github.beescloud.com/dev1/declarative-libs.git # timeout=10
            Fetching origin...
            Fetching upstream changes from origin
             > git --version # timeout=10
            using GIT_ASKPASS to set credentials dev1 with Viva
             > git fetch --tags --progress origin +refs/heads/*:refs/remotes/origin/*
             > git rev-parse master^{commit} # timeout=10
             > git rev-parse origin/master^{commit} # timeout=10
             > git rev-parse --is-inside-work-tree # timeout=10
            Fetching changes from the remote Git repository
             > git config remote.origin.url https://github.beescloud.com/dev1/declarative-libs.git # timeout=10
            Fetching without tags
            Fetching upstream changes from https://github.beescloud.com/dev1/declarative-libs.git
             > git --version # timeout=10
            using GIT_ASKPASS to set credentials dev1 with Viva
             > git fetch --no-tags --progress https://github.beescloud.com/dev1/declarative-libs.git +refs/heads/master:refs/remotes/origin/master
            Checking out Revision 1fb446ab993643a4641b0729160affa02ab817e0 (master)
            Commit message: "re-bug it."
             > git config core.sparsecheckout # timeout=10
             > git checkout -f 1fb446ab993643a4641b0729160affa02ab817e0
             > git rev-list 82ad86a376a88035ba4f2446e74fe128d4826927 # timeout=10
            [Pipeline] node
            Running on 14-agent in /home/ec2-user/jenkins/jenkins/workspace/aa-serialization-thing
            [Pipeline] {
            [Pipeline] stage
            [Pipeline] { (Set file size with a shared lib, WOW)
            [Pipeline] }
            [Pipeline] // stage
            [Pipeline] }
            [Pipeline] // node
            [Pipeline] End of Pipeline
            an exception which occurred:
            in field collector
            in field locals
            in field parent
            in field parent
            in field capture
            in field def
            in field delegate
            in field closures
            in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@39981842
            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.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:1777)
            at java.util.HashMap.writeObject(HashMap.java:1354)
            at sun.reflect.GeneratedMethodAccessor22.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:497)
            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.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.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.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:1777)
            at java.util.HashMap.writeObject(HashMap.java:1354)
            at sun.reflect.GeneratedMethodAccessor22.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:497)
            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:140)
            at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:458)
            at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:434)
            at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgramIfPossible(CpsThreadGroup.java:422)
            at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:362)
            at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$100(CpsThreadGroup.java:82)
            at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:242)
            at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:230)
            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:1142)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
            at java.lang.Thread.run(Thread.java:745)
            Finished: FAILURE
            {code}
            *Summary:*
            A Declarative Jenkinsfile which is using a Library that has a syntax error in it can create a NotSerializableException.

            *Prerequisites:*
            1. A repo with a shared library, in the form of {{repo-name/blob/master/vars/Variables.groovy}}. The library needs to be bugged. I used this (note the parenthesis ( ) around the values for agentNames[] instead of square brackets [ ]:

            {code:none}
            /*
            Use these with your declarative pipelines.
            */

            // Let's insert this purposely bugged String array, to see if
            // Jenkins picks up the library at all.
            String[] agentNames = ("linux","windows","other")
            int FILE_SIZE = 3333
            // String FILE_SIZE = "4444"

            {code}

            2. This shared library needs to be set up in /configure, under Global Pipeline Libraries:

             !image-2017-09-06-21-03-06-958.png|thumbnail!

            3. A Jenkinsfile that makes use of this shared library (I'll attach the one I've used). I've been able to recreate this both as a mulibranch pipeline job from a GitHub Enterprise repo, and as a standalone Pipeline job.

            *Steps to recreate:*
            1. Create your job with the following Jenkinsfile:

            {code:none}
            pipeline {

                libraries {
                    lib("declarative-libs")
                }

                agent {
                    label ("linux")
                }

                stages {
                    stage('Set file size with a shared lib, WOW') {
                        steps {
                            echo "--> SIZE_OF_GIBBERISH_FILE is ${Variables.SIZE_OF_GIBBERISH_FILE}"
                            script {
                                int randomFileSize = "${Variables.SIZE_OF_GIBBERISH_FILE}"
                                stage ("Script stage") {
                                    for (int j = 0; j < 5; j++) {
                                        node {
                                            sh "for i in `seq 1 100`; do cat /dev/urandom | env LC_CTYPE=c tr -dc \'[:alpha:]\' | head -c $randomFileSize; done"
                                        }
                                    }
                                }
                            }
                        }
                    }
                } // end stages
             }
            {code}

            2. Run the build.

            3. Observe a NotSerializableException in the console output:

            {code:none}
            Started by user admin
            [Pipeline] library
            Loading library declarative-libs@master
             > git rev-parse --is-inside-work-tree # timeout=10
            Setting origin to https://github.beescloud.com/dev1/declarative-libs.git
             > git config remote.origin.url https://github.beescloud.com/dev1/declarative-libs.git # timeout=10
            Fetching origin...
            Fetching upstream changes from origin
             > git --version # timeout=10
            using GIT_ASKPASS to set credentials dev1 with Viva
             > git fetch --tags --progress origin +refs/heads/*:refs/remotes/origin/*
             > git rev-parse master^{commit} # timeout=10
             > git rev-parse origin/master^{commit} # timeout=10
             > git rev-parse --is-inside-work-tree # timeout=10
            Fetching changes from the remote Git repository
             > git config remote.origin.url https://github.beescloud.com/dev1/declarative-libs.git # timeout=10
            Fetching without tags
            Fetching upstream changes from https://github.beescloud.com/dev1/declarative-libs.git
             > git --version # timeout=10
            using GIT_ASKPASS to set credentials dev1 with Viva
             > git fetch --no-tags --progress https://github.beescloud.com/dev1/declarative-libs.git +refs/heads/master:refs/remotes/origin/master
            Checking out Revision 1fb446ab993643a4641b0729160affa02ab817e0 (master)
            Commit message: "re-bug it."
             > git config core.sparsecheckout # timeout=10
             > git checkout -f 1fb446ab993643a4641b0729160affa02ab817e0
             > git rev-list 82ad86a376a88035ba4f2446e74fe128d4826927 # timeout=10
            [Pipeline] node
            Running on 14-agent in /home/ec2-user/jenkins/jenkins/workspace/aa-serialization-thing
            [Pipeline] {
            [Pipeline] stage
            [Pipeline] { (Set file size with a shared lib, WOW)
            [Pipeline] }
            [Pipeline] // stage
            [Pipeline] }
            [Pipeline] // node
            [Pipeline] End of Pipeline
            an exception which occurred:
            in field collector
            in field locals
            in field parent
            in field parent
            in field capture
            in field def
            in field delegate
            in field closures
            in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@39981842
            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.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:1777)
            at java.util.HashMap.writeObject(HashMap.java:1354)
            at sun.reflect.GeneratedMethodAccessor22.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:497)
            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.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.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.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:1777)
            at java.util.HashMap.writeObject(HashMap.java:1354)
            at sun.reflect.GeneratedMethodAccessor22.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:497)
            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:140)
            at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:458)
            at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:434)
            at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgramIfPossible(CpsThreadGroup.java:422)
            at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:362)
            at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$100(CpsThreadGroup.java:82)
            at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:242)
            at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:230)
            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:1142)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
            at java.lang.Thread.run(Thread.java:745)
            Finished: FAILURE
            {code}
            abayer Andrew Bayer made changes -
            Link This issue duplicates JENKINS-40109 [ JENKINS-40109 ]
            abayer Andrew Bayer made changes -
            Status Open [ 1 ] Resolved [ 5 ]
            Resolution Duplicate [ 3 ]

              People

              • Assignee:
                abayer Andrew Bayer
                Reporter:
                kshultz Karl Shultz
              • Votes:
                0 Vote for this issue
                Watchers:
                1 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: