Search code examples
jenkinsjenkins-pipelinejenkins-build-flow

How to fix NotSerializableException error during Jenkins workflow build?


When I run the following code on the Jenkins workflow (Jenkins 1.609.1 ,workflow 1.8) I get error of 'NotSerializableException' (also below). However, if I move the "build job" outside the "for" scope it works fine (the job is activated). Any ideas why this behavior?

node('master') { 
ws('/opt/test) {
def file = "/ot.property"
def line = readFile (file)
def resultList = line.tokenize()
for(item in resultList )
  {
build job: 'testjob_1'
   }
 }
}

Got error:

Running: End of Workflow 
java.io.NotSerializableException: java.util.ArrayList$Itr  
    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)  


.....

Solution

  • I thnk it is because it's trying to serialize the unserializable item iterator on resultList as soon as it hits the build job step. See here for guidance on use of nonserializable variables:

    https://github.com/jenkinsci/workflow-plugin/blob/master/TUTORIAL.md#serialization-of-local-variables

    As a workaround to safely iterate using the workflow plugin, you need to us C-style loops. Try this instead:

    for ( int i = 0; i < resultList.size; i++ ) {
      etc...