Jenkins Pipeline:遍历地图时如何使用 sh 模块?

jug*_*gao 3 groovy jenkins jenkins-pipeline

我的詹金斯管道内容是:

pipeline {
    agent any
    stages {
        stage('Example Build') {
            steps {
                script {
                    repos = [
                        'a': '1',
                        'b': '2',
                        'c': '3']
                    for (i in repos) {
                        echo "${i.key}, ${i.value}"
                        sh "echo test"
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我在构建时遇到错误:

Caused: java.io.NotSerializableException: java.util.LinkedHashMap$Entry
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:926)
    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(ObjectOutputStream.java:344)
    at java.util.HashMap.internalWriteEntries(HashMap.java:1793)
    at java.util.HashMap.writeObject(HashMap.java:1363)
    at sun.reflect.GeneratedMethodAccessor176.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.jboss.marshalling.reflect.JDKSpecific$SerMethods.callWriteObject(JDKSpecific.java:156)
    at org.jboss.marshalling.reflect.SerializableClass.callWriteObject(SerializableClass.java:191)
...
Finished: FAILURE
Run Code Online (Sandbox Code Playgroud)

如果 repos 已列出,则运行正常。

我无法修复该错误,希望有人可以回答。

谢谢您的回答。

dag*_*ett 9

尝试替换for(i in repos){...}repos.each{k,v-> ...}

repos.each{k,v->
    echo "${k}, ${v}"
    sh "echo test"
}
Run Code Online (Sandbox Code Playgroud)

问题在于for(i in repos){...}

该语句遍历映射条目。每个条目都有Map.Entryi类型,该类型不可序列化。

Pipeline 尝试保留所有变量的状态,因为理论上每个下一个 Pipenine 命令 ( echo, sh) 都可以在另一个 jenkins 节点上执行。

另一方面,在使用时,repos.each{k,v->...}您将在您的情况下使用简单的可序列化值迭代映射。