通过 Jenkins 和 bat 命令执行 SQL*Plus 脚本
Execute SQL*Plus script via Jenkins and bat command
在我的 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} 变量的方式。但是我无法使用不同的报价变体来执行它。有没有人以前遇到过这种情况,或者知道我做错了什么?
在这里回答我自己的问题..
该问题与
有关
它指向 Github 上的以下 Jenkinsfile 示例:
Jenkins File example
在我的 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} 变量的方式。但是我无法使用不同的报价变体来执行它。有没有人以前遇到过这种情况,或者知道我做错了什么?
在这里回答我自己的问题..
该问题与
它指向 Github 上的以下 Jenkinsfile 示例: Jenkins File example