2016-03-02 4 views
2

Так что я пытаюсь создать переменное количество тестовых заданий для параллельной работы, но я столкнулся с ситуацией, когда передаваемый параметр будет максимальное значение для всех исполнений.Как я могу динамически генерировать параллельные задания с рабочим процессом/конвейером jenkins

здесь является упрощенной версией заводной кода, который я использую

jobs=[:] 
unitSplits = 5 
println "split units $unitSplits times" 

for (int i = 0; i < unitSplits; i++) { 
    jobs["unit tests ${i} of ${unitSplits}"] = { 
     group -> {-> test(group)} 
    }(i) 
} 

jobs.each{ k, v -> v() } 

def test(group) { 
    println "testing group ${group}" 
} 

ожидаемый результат:

split units 5 times 
testing group 0 
testing group 1 
testing group 2 
testing group 3 
testing group 4 

Фактический выход:

split units 5 times 
testing group 5 
testing group 5 
testing group 5 
testing group 5 
testing group 5 

Мне нужен этот group параметр знаете, какую группу тестов нужно выполнить.

Любые идеи, как сделать эту работу?

ответ

3

Это серьезная ошибка, и на самом деле есть еще один jenkins-workflow вопрос, обсуждающий это. Ваш int i - это одна переменная , охваченная петлей и разделяемая каждым закрытием; в конце цикла (до того, как какие-либо закрытия были запущены!), оно имеет свое окончательное значение. 5. Самое простое исправить использование def для создания новой переменной (фактически final) внутри каждой итерации цикла, например:

def _i = i 

К сожалению, .each не работает из-за JENKINS-26481; вы должны использовать более простые циклы C-стиля. Во всяком случае, я полагаю, что ваш реальный пример будет использовать шаг parallel.

+0

См. Http://stackoverflow.com/questions/32228590/start-a-job-multiple-times-concurrently-with-workflow-plugin, например. –

+0

Да, вы правы, полагая, что реальный пример будет использовать параллельный шаг, делая это, не позволяя легко протестировать в сеансе groovyConsole. – Jeff