2015-07-27 5 views
10

Wenn ich den folgenden Code für den Jenkins-Workflow (Jenkins 1.609.1, Workflow 1.8) ausführen, erhalte ich den Fehler 'NotSerializableException' (auch unten). Wenn ich jedoch den "Build-Job" außerhalb des Bereichs "for" verschiebe, funktioniert es einwandfrei (der Job ist aktiviert). Irgendwelche Ideen, warum dieses Verhalten?Wie behebt NotSerializableException Fehler während Jenkins Workflow Build?

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) 


..... 

Antwort

12

ich thnk es ist, weil es versucht, die unserialisierbar item Iterator auf resultList so bald serialisiert werden, da es die Hits build job Schritt. Sehen Sie hier für Anleitungen zur Verwendung von nonserializable Variablen:

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

Zur Umgehung des Problems sicher iterieren den Workflow-Plugin verwenden, müssen Sie uns C-Stil-Schleifen. Versuchen Sie stattdessen:

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

Weitere Referenz hier:

+0

tnx, scheint jetzt besser! – oTolev

+0

FYI, dieser spezielle Fehler wird verfolgt als [JENKINS-27421] (https://issues.jenkins-ci.org/browse/JENKINS-27421). –

1

Nach CloudBees Platform Help page:

By design the pipeline can only keep records of Serializable objects. If you still need to keep an intermediate variable with a non serializable object, you need to hide it into a method and annotate this method with @NonCPS .

So sollten Sie Ihren Code in eine Funktion mit @NonCPS Hilfsmethode transformieren.

In Verbindung stehende Jenkins Bug: JENKINS-27421.

+1

Ja. fand dieses schöne Beispiel zu diesem Effekt: https://gist.github.com/oifland/ab56226d5f0375103141b5fbd7807398 – Prachi

Verwandte Themen