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

Когда я запускаю следующий код в рабочем процессе Jenkins (Jenkins 1.609.1, workflow 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)  


.....

Ответ 1

I thnk это потому, что он пытается сериализовать неэриализуемый итератор 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...

Ответ 2

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

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

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

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