当我在Jenkins工作流程(Jenkins 1.609.1,工作流程1.8)上运行以下代码时,出现'NotSerializableException'错误(也在下面)。 但是,如果我将“构建作业”移到“for”范围之外,它可以正常工作(作业已激活)。有什么想法为什么会这样?
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)
.....
答案 0 :(得分:18)
我认为这是因为它一旦点击item
步骤就试图在resultList
上序列化不可序列化的build job
迭代器。有关使用不可序列化变量的指导,请参见此处:
作为使用工作流插件安全迭代的解决方法,您需要使用C风格的循环。试试这个:
for ( int i = 0; i < resultList.size; i++ ) {
etc...
答案 1 :(得分:4)
根据CloudBees Platform Help page:
根据设计,管道只能保留
Serializable
个对象的记录。如果仍需要使用非可序列化对象保留中间变量,则需要将其隐藏到方法中并使用@NonCPS
注释此方法。
因此,您应该使用@NonCPS
辅助方法将代码转换为函数。
相关Jenkins bug:JENKINS-27421。