web-dev-qa-db-ja.com

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}, {spam=org.jenkinsci.plugins.workflow.cps.CpsClosure2@51a382ad, eggs=org.jenkinsci.plugins.workflow.cps.CpsClosure2@718cb50d}]
    at org.jenkinsci.plugins.workflow.cps.DSL.parseArgs(DSL.Java:276)
    at org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.Java:111)
17
Constantin
map.failFast = true
parallel map
27
Jesse Glick

オプションの構文を追加すると、少し役に立ちます。2番目のオプションは新しいMapを渡し、3番目のオプションは元の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
])
1
Captain Man

Jesse Glickの answer に加えて。

Forループを使用して並列ステージを作成する場合でも、同じコードを使用できます-

map.failFast = true
parallel map
0
ashwaqar