[英]java.io.NotSerializableException Error in Pipeline Scripting
I'm using below code to load a Groovy file and to pass parameter:我正在使用以下代码加载 Groovy 文件并传递参数:
Pipeline Script in jenkins
jenkins 中的流水线脚本
@NonCPS
def ld() {
def pck = load '/tmp/Provsioning/e.groovy';
return pck.xmlParseData("${params.hos_nam}");
}
node {
stage ('Deploying Packages'){
def aby = ld();
}
}
where ${params.hos_nam}
is a build parameter and the installpackage
groovy follows as below其中
${params.hos_nam}
是构建参数, installpackage
groovy 如下
/tmp/Provsioning/e.groovy
/tmp/Provisioning/e.groovy
public class ReadXMLFile {
def xmlParseData(String g){
installPackage(a,b,c);
input 'proceed'
aemRestart(b);
}
def installPackage(String a, String b,String c){
//some code
}
def aemRestart(String a){
//some code
}
}
I'm not sure why the below error occurs:我不确定为什么会出现以下错误:
an exception which occurred:
in field val$body
in field closures
in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@67aecf21
Caused: java.io.NotSerializableException: org.codehaus.groovy.runtime.InvokerHelper$1
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.BlockMarshaller.doWriteObject(BlockMarshaller.java:65)
at org.jboss.marshalling.river.BlockMarshaller.writeObject(BlockMarshaller.java:56)
at org.jboss.marshalling.MarshallerObjectOutputStream.writeObjectOverride(MarshallerObjectOutputStream.java:50)
at org.jboss.marshalling.river.RiverObjectOutputStream.writeObjectOverride(RiverObjectOutputStream.java:179)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:344)
at java.util.HashMap.internalWriteEntries(HashMap.java:1785)
at java.util.HashMap.writeObject(HashMap.java:1362)
at sun.reflect.GeneratedMethodAccessor198.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.jboss.marshalling.reflect.SerializableClass.callWriteObject(SerializableClass.java:271)
at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:976)
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
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.AbstractObjectOutput.writeObject(AbstractObjectOutput.java:58)
at org.jboss.marshalling.AbstractMarshaller.writeObject(AbstractMarshaller.java:111)
at org.jenkinsci.plugins.workflow.support.pickles.serialization.RiverWriter.writeObject(RiverWriter.java:140)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:458)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:434)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgramIfPossible(CpsThreadGroup.java:422)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:362)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$100(CpsThreadGroup.java:82)
Finished: FAILURE
object that you hold in a variable between two steps of the pipeline must be Serializable .在管道的两个步骤之间保存在变量中的对象必须是Serializable 。
class A{
def f(){
return [hello:'world']
}
}
node{
def a = new A()
def b = a.f()
}
could throw NotSerializableException because class A non Serializable可能抛出 NotSerializableException 因为类 A 不可序列化
to solve this put all the code that works with non serializable variables into @NonCPS annotated function:为了解决这个问题,将所有与不可序列化变量一起使用的代码放入@NonCPS 注释函数中:
class A{
def f(){
return [hello:'world'] //hashmap itself is serializable
}
}
@NonCPS
def f1(){
def a = new A()
return a.f()
}
node{
def b = f1()
}
PS: I did not check the code but just to provide you an example.. PS:我没有检查代码,只是为了给你提供一个例子..
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.