Я считаю, что предпочитаю реализацию конвейерной обработки сценариями декларативной. Это дает мне немного больше контроля и доступа к функциям языка groovy. Одна из таких особенностей - закрытие. В этой области я бы подошел к проблеме аналогично тому, что у меня ниже.
#!groovy
//A map of String -> Closure that will be run in parallel
def parallelActions = [:]
parallelActions['agent1 test'] = newAgentAction('slave1')
parallelActions['agent2 test'] = newAgentAction('slave2')
stage ('running parallel actions') {
parallel parallelActions
}
//Function builds common behavior and returns a closure (a function as an object)
def newAgentAction(agentLabel) {
return { ->
node (agentLabel) {
echo "exectuting on ${agentLabel}"
}
}
}
Обратите внимание, что я намеренно не поместил сцену внутри параллельных блоков. В зависимости от того, какие плагины вы используете для визуализации, имея параллельные этапы, порядок рендеринга этапов может быть ненадежным и принудительно привести к постоянному значению stage redr aws.