Использование failFast с замыканием карты прерывает "параллельный" шаг

Не уверен, что это мои ограниченные знания Groovy или причуда в шаге Pipeline parallel. Я не могу заставить его принимать failFast, если я использую карту вместо того, чтобы передавать каждое закрытие отдельно:

def map = [:]
map['spam'] = {
    node {
        echo 'spam'
    }
}
map['eggs'] = {
    node {
        echo 'eggs'
    }
}
parallel map // Works.
parallel spam: map['spam'], eggs: map['eggs'], failFast: true // Works.
parallel map, failFast: true // Fails with exception.

Исключение с failFast:

java.lang.IllegalArgumentException: Expected named arguments but got [{failFast=true}, {[email protected], [email protected]}]
    at org.jenkinsci.plugins.workflow.cps.DSL.parseArgs(DSL.java:276)
    at org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:111)

Ответ 1

map.failFast = true
parallel map

Ответ 2

Это немного помогает, если вы добавите дополнительный синтаксис. Второй вариант - это передача нового Map, в то время как третий вариант передает ваш оригинальный Map и дополнительный именованный параметр. Честно говоря, я не уверен, что он думает, что происходит.

parallel(map)
parallel([
    spam: map['spam'],
    eggs: map['eggs'],
    failFast: true
])
parallel map, failFast: true

В любом случае я думаю, что самым простым было бы это:

def map = [
    spam: {
        node {
            echo 'spam'
        }
    },
    eggs: {
        node {
            echo 'eggs'
        }
    },
    failFast: true
]
parallel map

или...

parallel ([
    spam: {
        node {
            echo 'spam'
        }
    },
    eggs: {
        node {
            echo 'eggs'
        }
    },
    failFast: true
])

Ответ 3

В дополнение к Джесси Глик ответ.

Даже если вы используете цикл for для создания параллельных этапов, вы можете использовать тот же код -

map.failFast = true
parallel map