2015-07-27 23 views
10

Jenkins iş akışında aşağıdaki kodu çalıştırdığımda (Jenkins 1.609.1, iş akışı 1.8) 'NotSerializableException' (ayrıca aşağıda) hatası alıyorum. Bununla birlikte, "oluşturma" kapsamını "oluşturma" alanının dışına taşırsam iyi çalışır (iş etkinleştirilir). Bu davranış neden herhangi bir fikir?Jenkins iş akışı oluşturma sırasında NotSerializableException hatası nasıl düzeltilir?

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 hatası:

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) 


..... 

cevap

12

buna build job adım vurur en kısa sürede resultList üzerinde unserializable item yineleyici getirilmeye çalışıyor çünkü öyle thnk. nonserializable değişkenlerin kullanımına rehberlik için buraya bakınız:

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

güvenle iş akışı eklentisi kullanarak yineleme yapmak için bir çözüm olarak, bize C tarzı döngüler gerekir. Bunun yerine bu deneyin:

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

Daha referansı:

+0

tnx, şimdi daha iyi görünüyor! – oTolev

+0

FYI, bu özel hata [JENKINS-27421] (https://issues.jenkins-ci.org/browse/JENKINS-27421) olarak izlenir. –

1

CloudBees Platform Help page göre:

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 .

Yani @NonCPS yardımcı yöntemiyle bir fonksiyonu haline kodunuzu dönüşümü olmalıdır.

İlgili Jenkins hatası: JENKINS-27421. Burada

+1

Yep. Bu güzel örneği bu etkiyi buldu: https://gist.github.com/oifland/ab56226d5f0375103141b5fbd7807398 – Prachi

İlgili konular