2016-05-19 5 views
5

Ich habe mehrere (einige hundert) Dateien, um den Test zu starten (jeder Test dauert einige Minuten).Parallele Ausführung mit jenkins

Die sequentielle Ausführung ist nicht akzeptabel und auch nicht alle zusammen. Ich suche also so etwas wie einen Produzenten-Verbraucher.

versuchte ich Pipeline Arbeitsplätze und parallel Befehl der folgenden Art und Weise:

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 

Problem:

Alle Aufgaben sind Start zugleich (OOM und der ganze Spaß)

Antwort

0

Doesn‘ t haben die gleiche Introspektion wie der Jenkins-Parallelschritt, aber da kein fester Pool unterstützt wird, können Sie xargs verwenden, um dasselbe Ergebnis zu erzielen:

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 "{}"' 

Das Argument -P ist derjenige, der angibt, dass eine feste Anzahl von 2 (oder N) Prozessen immer ausgeführt werden sollte. Andere Tools wie GNU Parallel bieten noch mehr Möglichkeiten, wie viele Prozesse verwendet werden sollen.

Sie können auch versuchen, den Schritt lock aus dem Schritt Lockable Resources plugin, den node Schritt zu verwenden, der auf eine feste Anzahl von Executoren abzielt. Allerdings scheint mir das zu viel Aufwand zu sein, es sei denn, Ihre einzelnen Tests dauern jeweils mehrere zehn Sekunden.