Как исправить ошибку NotSerializableException во время сборки рабочего процесса Jenkins?

Когда я запускаю следующий код в рабочем процессе Jenkins (Jenkins 1.609.1, рабочий процесс 1.8), я получаю сообщение об ошибке «NotSerializableException» (также ниже). Однако, если я перемещаю «задание сборки» за пределы области «для», оно работает нормально (задание активируется). Любые идеи, почему такое поведение?

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

Получил ошибку:

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)  


.....

person oTolev    schedule 27.07.2015    source источник
comment
Для меня я нашел лучший и самый простой обходной путь здесь: stackoverflow.com/a/40166064/1929406   -  person kivagant    schedule 05.12.2018


Ответы (2)


Я думаю, это потому, что он пытается сериализовать несериализуемый item итератор на resultList, как только он достигает шага build job. См. здесь руководство по использованию несериализуемых переменных:

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

В качестве обходного пути для безопасной итерации с использованием плагина рабочего процесса вам необходимо использовать циклы в стиле C. Попробуйте это вместо этого:

for ( int i = 0; i < resultList.size; i++ ) {
  etc...
person Brian Ray    schedule 27.07.2015
comment
Дополнительная ссылка здесь: ‹groups.google.com/d/msg. /jenkinsci-users/LGRv7Jq60YI/ - person Brian Ray; 27.07.2015
comment
tnx, теперь кажется лучше! - person oTolev; 28.07.2015
comment
К вашему сведению, эта конкретная ошибка отслеживается как JENKINS-27421. - person Jesse Glick; 04.08.2015
comment
Но как я могу сделать то же самое для карт? - person Arun; 19.08.2020

Согласно Справочная страница платформы CloudBees:

По своей конструкции конвейер может хранить записи только об Serializable объектах. Если вам все еще нужно сохранить промежуточную переменную с несериализуемым объектом, вам нужно скрыть ее в методе и аннотировать этот метод с помощью @NonCPS.

Таким образом, вы должны преобразовать свой код в функцию с помощью вспомогательного метода @NonCPS.

Связанная ошибка Jenkins: JENKINS-27421.

person kenorb    schedule 23.10.2016
comment
Ага. нашел этот прекрасный пример на этот счет: - person Prachi; 27.07.2017
comment
Здесь важно помнить: вы не можете выполнять шаги конвейера из метода @NonCPS! groups.google.com/forum/#!topic/jenkinsci-users/ VXrSVBZ2maU - person Mathiasdm; 12.03.2018