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)
.....
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:
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...
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 .