web-dev-qa-db-fra.com

Comment corriger l'erreur NotSerializableException lors de la génération du workflow Jenkins?

Lorsque j'exécute le code suivant sur le workflow Jenkins (Jenkins 1.609.1, workflow 1.8), j'obtiens une erreur de "NotSerializableException" (également ci-dessous). Cependant, si je déplace le "travail de génération" en dehors de la portée "pour", cela fonctionne très bien (le travail est activé). Des idées pourquoi ce comportement?

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'
   }
 }
}

Vous avez une erreur:

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)  


.....
17
oTolev

Je pense que c'est parce qu'il essaie de sérialiser l'itérateur item non sérialisable sur resultList dès qu'il frappe le build job étape. Voir ici pour des conseils sur l'utilisation des variables non sérialisables:

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

Pour contourner en toute sécurité l'utilisation du plug-in de workflow, vous devez utiliser des boucles de style C. Essayez plutôt ceci:

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

Selon page d'aide de la plateforme CloudBees :

De par sa conception, le pipeline ne peut conserver que les enregistrements des objets Serializable. Si vous devez toujours conserver une variable intermédiaire avec un objet non sérialisable, vous devez la masquer dans une méthode et annoter cette méthode avec @NonCPS.

Vous devez donc transformer votre code en fonction avec @NonCPS méthode d'assistance.

Bogue Jenkins associé: JENKINS-27421 .

5
kenorb