2016-11-06 2 views
7

Я использую @NonCPS перед моей Jenkinsfile функции, которая выполняет матч регулярного выражения и я все еще получаю java.io.NotSerializableException java.util.regex.Matcher ошибки даже с @NonCPS аннотацию ,трубопровода Дженкинс java.io.NotSerializableException java.util.regex.Matcher ошибка даже с @NonCPS

Обратите внимание, что эта функция вызывает много раз, и исключение возникает только после того, как выполняется соответствующее совпадение.

Вот мой код:

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

Выход при выполнении Дженкинс сборки:

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 

ответ

12

Вероятно, из-за переменного объема m. Постарайся ограничить его def, как это:

def m = (logLine =~ TEST_LOGLINE_END_REGEX) 

Без def переменная создается в глобальном сценарии связывания и, следовательно, все еще существует после выхода из метода.

+0

@DanielPark, если это хороший ответ, вы должны пометить его как принято одно и тоже до-голосования хорошая практика :-) –

+0

я не верю обзорное это вопрос здесь потому что Дженкинс хочет, чтобы конвейер был сериализуемым, и исключение 'java.io.NotSerializableException: java.util.regex.Matcher' выбрано потому, что конвейер пытается сохранить состояние переменной, которая не является сериализуемой. См. Мой ответ ниже. – SINGULARITY

0

Jenkins требует, чтобы все переменные были сериализуемыми, поскольку состояние конвейера периодически сохраняется на диск в случае прерываний, подобных перезапуску сервера. Эта функция позволяет конвейерам поддерживать свое состояние и продолжать работу даже после перезапуска сервера. Переменные типа Matcher не являются сериализуемыми и требуют некоторой дополнительной работы разработчика.

См: Serializing Local Variables

+0

Потому что 'm' объявлен так, как он есть (нет' def' или что-то сделать его локальным), я считаю, что он получает область действия как глобальную, поэтому происходит исключение сериализации. – mkobit

+0

«Трубопровод ограничивает все переменные типами Serializable» - [Рекомендации по масштабируемому конвейерному коду] (https://jenkins.io/blog/2017/02/01/pipeline-scalability-best-practice/) – SINGULARITY

+0

В той же документации : _ «В то время как обычный трубопровод ограничен сериализуемыми локальными переменными (см. Приложение внизу), функции @NonCPS могут использовать более сложные, несериализуемые типы внутри (например, регулярные выражения и т. Д.). _ - Я достаточно уверен, что это потому, m' является [сценарием global] (https://stackoverflow.com/a/6315609/627727), и ему присваивается несериализуемый тип в области '@ NonCPS', поэтому я думаю, что другой ответ правильный. – mkobit

Смежные вопросы