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