在我的 Jenkins Pipeline 脚本中,我有一个名为 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} 变量的方式。但我无法让它执行,引用不同的变体。任何人以前都经历过这种情况,或者知道我做错了什么?