2016-05-19 8 views
5

Ho alcune (poche centinaia) di file su cui eseguire il test (ogni test richiede alcuni minuti).Corsa parallela con jenkins

L'esecuzione sequenziale non è accettabile e non tutti insieme. Quindi sto cercando qualcosa come un produttore-consumatore.

ho cercato di posti di lavoro di pipeline e di comando parallela modo seguente:

def files = findFiles glob: 'test_files/*' 
def branches = [:] 

files.each{ 
    def test_command = "./test ${it}" 
    branches["${it}"] = { sh "${test_command} ${it}"} 
} 

stage name:'run', concurrency:2 
parallel branches 

Problema:

Tutte le attività sono di lancio, allo stesso tempo (OOM e tutto il divertimento)

risposta

0

doesn' Ho la stessa introspezione del passo parallelo di Jenkins, ma dal momento che sembra non supportare un pool fisso è possibile utilizzare xargs per ottenere lo stesso risultato:

def files = findFiles glob: 'test_files/*' 
def branches = [:] 

// there's probably a more efficient way to generate the list of commands 
files.each{ 
    sh "echo './test ${it}' >> tests.txt" 
} 

sh 'cat tests.txt | xargs -L 1 -I {} -P 2 bash -c "{}"' 

L'argomento -P è quello che specifica un numero fisso di processi 2 (o N) dovrebbe essere sempre in esecuzione. Altri strumenti come GNU Parallel offrono ancora più ottimizzazione su quanti processi dovrebbero essere usati.

È inoltre possibile provare a utilizzare il passo lock dal Lockable Resources plugin, il passo node che mira a un numero fisso di esecutori. Tuttavia questo mi sembra troppo eccessivo, a meno che i tuoi singoli test non stiano già prendendo decine di secondi ciascuno.