2016-11-06 15 views
7

używam @NonCPS przed moim Jenkinsfile funkcji, która wykonuje dopasowanie regex i nadal jestem coraz java.io.NotSerializableException java.util.regex.Matcher błąd nawet z @NonCPS adnotacji .Jenkins rurociąg błąd java.io.NotSerializableException java.util.regex.Matcher nawet z @NonCPS

Uwaga, funkcja ta jest wielokrotnie wywoływana, a wyjątek pojawia się dopiero po wykonaniu meczu.

Oto mój kod:

@NonCPS 
def extractEndTime(logLine) { 
    def MY_REGEX = /.*(20[0-9]{2}-[0-9]{2}-[0-9]{2}).([0-9]{2}:[0-9]{2}:[0-9]{2}).*\"\w+\"\sthe text\s(\w+)\./ 
    m = (logLine =~ TEST_LOGLINE_END_REGEX) 
    if (m.count) { 
     return [m[1],m[2],m[3]] 
    } else { 
     return null 
    } 
} 

Wyjście gdy robi Jenkins produkcji:

GitHub has been notified of this commit’s build result 
java.io.NotSerializableException: java.util.regex.Matcher 
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860) 
    at org.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65) 
    at org.jboss.marshalling.river.BlockMarshaller.writeObject(BlockMarshaller.java:56) 
    at org.jboss.marshalling.MarshallerObjectOutputStream.writeObjectOverride(MarshallerObjectOutputStream.java:50) 
    at org.jboss.marshalling.river.RiverObjectOutputStream.writeObjectOverride(RiverObjectOutputStream.java:179) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:344) 
    at java.util.LinkedHashMap.internalWriteEntries(LinkedHashMap.java:333) 
    at java.util.HashMap.writeObject(HashMap.java:1354) 
    at sun.reflect.GeneratedMethodAccessor116.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.jboss.marshalling.reflect.SerializableClass.callWriteObject(SerializableClass.java:271) 
    at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:976) 
    at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967) 
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) 
    at org.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65) 
    at org.jboss.marshalling.river.BlockMarshaller.writeObject(BlockMarshaller.java:56) 
    at org.jboss.marshalling.MarshallerObjectOutputStream.writeObjectOverride(MarshallerObjectOutputStream.java:50) 
    at org.jboss.marshalling.river.RiverObjectOutputStream.writeObjectOverride(RiverObjectOutputStream.java:179) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:344) 
    at com.cloudbees.groovy.cps.SerializableScript.writeObject(SerializableScript.java:26) 
    at sun.reflect.GeneratedMethodAccessor145.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.jboss.marshalling.reflect.SerializableClass.callWriteObject(SerializableClass.java:271) 
    at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:976) 
    at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967) 
    at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967) 
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) 
    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.doWriteSerializableObject(RiverMarshaller.java:967) 
    at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967) 
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) 
    at org.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65) 
    at org.jboss.marshalling.river.BlockMarshaller.writeObject(BlockMarshaller.java:56) 
    at org.jboss.marshalling.MarshallerObjectOutputStream.writeObjectOverride(MarshallerObjectOutputStream.java:50) 
    at org.jboss.marshalling.river.RiverObjectOutputStream.writeObjectOverride(RiverObjectOutputStream.java:179) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:344) 
    at java.util.HashMap.internalWriteEntries(HashMap.java:1777) 
    at java.util.HashMap.writeObject(HashMap.java:1354) 
    at sun.reflect.GeneratedMethodAccessor116.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.jboss.marshalling.reflect.SerializableClass.callWriteObject(SerializableClass.java:271) 
    at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:976) 
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854) 
    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.AbstractObjectOutput.writeObject(AbstractObjectOutput.java:58) 
    at org.jboss.marshalling.AbstractMarshaller.writeObject(AbstractMarshaller.java:111) 
    at org.jenkinsci.plugins.workflow.support.pickles.serialization.RiverWriter.writeObject(RiverWriter.java:132) 
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:433) 
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:412) 
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:357) 
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$100(CpsThreadGroup.java:78) 
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:236) 
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:224) 
    at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:63) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:112) 
    at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: an exception which occurred: 
    in field delegate 
    in field closures 
    in object [email protected] 
Finished: FAILURE 

Odpowiedz

12

Prawdopodobnie ze względu na zakres zmiennej m. Spróbuj ograniczyć ją def tak:

def m = (logLine =~ TEST_LOGLINE_END_REGEX) 

Bez def zmienna jest tworzona w globalnym skryptu wiązania i stąd nadal istnieje po wyjściu z tej metody.

+0

@DanielPark, czy jest to dobra odpowiedź, należy oznaczyć je jako jeden i przyjętej także w górę głosowania jest dobra praktyka :-) –

+0

nie wierzę scoping jest kwestia tutaj ponieważ Jenkins chce, aby potok był poddawany serializacji i wyrzucany jest wyjątek 'java.io.NotSerializableException: java.util.regex.Matcher', ponieważ potok próbuje zapisać stan zmiennej, której nie można serializować. Zobacz moją odpowiedź poniżej. – SINGULARITY

0

Jenkins wymaga, aby wszystkie zmienne były poddawane serializacji, ponieważ stan potoku jest okresowo zapisywany na dysku w przypadku przerwania, takich jak restart serwera. Ta funkcja pozwala potokom utrzymywać ich stan i kontynuować nawet po zrestartowaniu serwera. Zmienne typu Matcher nie są przekształcalne do postaci szeregowej i wymagają dodatkowej pracy dewelopera.

Patrz: Serializing Local Variables

+0

Ponieważ 'm' jest zadeklarowane tak, jak jest (bez" def "lub czegokolwiek, co czyni go lokalnym), uważam, że jest ono określane jako" globalne ", co powoduje wyjątek serializacji. – mkobit

+0

"Pipeline ogranicza wszystkie zmienne do typów Serializable" - [Best Practices for Scalable Pipeline Code] (https://jenkins.io/blog/2017/02/01/pipeline-scalability-best-practice/) – SINGULARITY

+0

W tej samej dokumentacji : _ "Podczas gdy normalny potok jest ograniczony do zmiennych lokalnych możliwych do serializacji (patrz dodatek na dole), funkcje @NonCPS mogą używać wewnętrznych, bardziej złożonych, nie nadających się do odprawy typów (na przykład interpreterów wyrażeń regularnych itp.)" _ - Jestem przekonany, że tak jest, ponieważ ' m' jest [script global] (https://stackoverflow.com/a/6315609/627727), a typ nie nadający się do serializacji jest do niego przypisany w zakresie '@ NonCPS', dlatego uważam, że drugi odpowiedź jest poprawna. – mkobit