Как исправить ошибку 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)  


.....

2 ответа

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

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

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

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

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

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

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

Связанная ошибка Дженкинса: JENKINS-27421.

Другие вопросы по тегам