在我的Jenkins管道脚本中,我有一个名为orderedScripts的地图,其中包含整数键(1-11),每个键的值都是列表。列表中的项是sql脚本的绝对路径。
我循环遍历地图,然后循环遍历每个键的列表,通过sqlplus执行列表中的项目。下面的代码段,其中<credentials>
是使用的数据库凭据。
orderedScripts.each {
key, value -> for(item in value){
bat "sqlplus <credentials> @'${item}'"
}
}
但是,当Jenkins运行该作业时,我收到以下Serilizable错误:
Caused: java.io.NotSerializableException: hudson.scm.SubversionChangeLogSet
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860)
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:569)
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(Unknown Source)
at java.util.HashMap.internalWriteEntries(Unknown Source)
at java.util.HashMap.writeObject(Unknown Source)
at sun.reflect.GeneratedMethodAccessor95.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
如果我用普通的println()打印出$ {item}变量,那么它会显示正确的脚本路径。因此循环正在工作,并确定要运行的正确脚本,Jenkins不会通过bat命令运行它们。如果我打印出脚本中的路径,然后手动将其复制并粘贴到sqlplus会话中,它将按预期执行。
从我能找到的,似乎是我在bat命令中引用$ {item}变量的方式。但我无法通过不同的报价变化来执行它。以前有人经历过这个,或者知道我做错了什么?
答案 0 :(得分:0)
在这里回答我自己的问题..
该问题与Serialization Problems In Global Function
有关指向Github上的以下Jenkinsfile示例: Jenkins File example