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

时间:2017-11-10 10:48:13

标签: jenkins groovy jenkins-pipeline jenkins-groovy

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

1 个答案:

答案 0 :(得分:0)

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

该问题与Serialization Problems In Global Function

有关

指向Github上的以下Jenkinsfile示例: Jenkins File example