Трубопровод Дженкинса: Как использовать модуль sh при обходе карты? - PullRequest
0 голосов
/ 28 марта 2020

Содержимое моего конвейера jenkins:

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"
                    }
                }
            }
        }
    }
}

И я получил ошибку при сборке:

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

Если репозиторий есть в списке, запустите ok.

I не могу исправить ошибку, надеюсь, кто-нибудь ответит.

Спасибо за ваш ответ.

Ответы [ 2 ]

0 голосов
/ 28 марта 2020

Пожалуйста, попробуйте более новую версию Jenkins.

0 голосов
/ 28 марта 2020

попробуйте заменить for(i in repos){...} на repos.each{k,v-> ...}

repos.each{k,v->
    echo "${k}, ${v}"
    sh "echo test"
}

проблема с for(i in repos){...}:

Этот оператор перебирает записи карты. И каждая запись i имеет тип Map.Entry , который не сериализуем.

Конвейер пытается сохранить состояние всех переменных, поскольку каждая следующая команда пипенина (echo) , sh) теоретически может быть выполнен на другом узле jenkins.

с другой стороны, когда вы используете repos.each{k,v->...}, вы итерируете карту с простыми сериализуемыми значениями в вашем случае.

...