Как исправить ошибку 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
шаг. Смотрите здесь руководство по использованию несериализуемых переменных:
В качестве обходного пути для безопасной итерации с помощью плагина рабочего процесса вам понадобятся циклы в стиле Си. Попробуйте это вместо этого:
for ( int i = 0; i < resultList.size; i++ ) {
etc...
Согласно странице справки платформы CloudBees:
Конструктивно конвейер может вести учет только
Serializable
объекты. Если вам все еще нужно сохранить промежуточную переменную с не сериализуемым объектом, вам нужно спрятать ее в метод и аннотировать этот метод с помощью@NonCPS
,
Таким образом, вы должны преобразовать свой код в функцию с @NonCPS
вспомогательный метод.
Связанная ошибка Дженкинса: JENKINS-27421.