从并行步骤收集数据(例如通过/失败结果)的最佳方法是什么。

到目前为止,我已经达到了:

#!groovy
def fspam(name, spam){
    spam[name] = "BEEN THERE TOO"
}

// pipeline
node('slave'){
    stage("test"){
        targets = ["a", "b"]
        def tasks = [:]
        def spam = [:]
        targets.each{ tasks["${it}"] = {
            node('slave'){
                echo "dry-run ${it}"
                spam[it] = "BEEN THERE" <--- works
                fspam(it)         <--- fails
            }
        }

        }
        parallel tasks
        print("spam")
        print(spam)
    }
}


但是它失败了:


另外:groovy.lang.MissingPropertyException:没有这样的属性:stam
适用于类:WorkflowScript groovy.lang.MissingPropertyException:否
此类属性:stam类:WorkflowScript位于
org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:53)



似乎封闭式地成功填充了地图,但是使用函数时会引发错误
我不确定拥有全球地图是最好/最干净的方法


有什么建议

最佳答案

使用.asSynchronized()

targets = ["a", "b"]

tasks = [:]
spam = [:].asSynchronized()

targets.each { target ->
    tasks[target] = {
        echo "dry-run ${target}"
        spam[target] = "BEEN THERE"
        fspam(target, spam)         // <--- passing spam fixes the issue
    }
}

parallel tasks

print("spam")
print(spam)


这样可以确保对映射的更新是线程安全的。要收集列表,可以使用[].asSynchronized()Link

关于jenkins - 从Jenkins管道并行步骤收集数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54867601/

10-13 05:40