通过Jenkins和bat命令执行SQL*Plus脚本



在我的Jenkins Pipeline脚本中,我有一个名为orderedScripts的映射,它包含Integer键(1-11),每个键的值都是列表。列表中的项是sql脚本的绝对路径。

我循环遍历映射,然后循环遍历每个键的列表,通过sqlplus执行列表中的项。下面的代码段,其中<credentials>是所使用的数据库凭据。

orderedScripts.each {
key, value -> for(item in value){ 
bat "sqlplus <credentials> @'${item}'" 
}
}

然而,当Jenkins运行作业时,我会得到以下可串行化的错误:

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}变量的方式。但我无法用不同的报价来执行它。有人以前经历过这种情况,或者知道我做错了什么吗?

在这里回答我自己的问题。。

该问题与全局函数中的序列化问题有关

它指向Github上的以下Jenkinsfile示例:Jenkins文件示例

最新更新