0

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

4

1 回答 1

0

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

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

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

于 2017-11-15T09:06:10.113 回答