собирать данные из параллельных шагов конвейера Jenkins - PullRequest
0 голосов
/ 25 февраля 2019

Каков наилучший способ сбора данных (таких как результаты прохождения / неудачи) с параллельных шагов.

Чего я достиг на данный момент:

#!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)
    }
}

Но это не удалосьwith:

Также: groovy.lang.MissingPropertyException: нет такого свойства: stam для класса: WorkflowScript groovy.lang.MissingPropertyException: Нет такого свойства: stam для класса: WorkflowScript at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap (ScriptBytecodeAdapter.java:53)

  1. Кажется, что при закрытии он успешно заполняет карту, но при использовании функции выдает ошибку
  2. Не знаюне уверен, что иметь глобальную карту - лучший / самый чистый способ

Любые предложения

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Использование .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(). Ссылка

0 голосов
/ 25 февраля 2019

Ну, пропущено очевидное решение:

#!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"
                fspam(it, spam)         <--- passing spam fixes the issue
            } 
        } 

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

Остается один вопрос: Есть ли лучший / более чистый путь? (нить безопасности потока / собственный конвейер jenkins и т. Д.)

...