2017-12-07 3 views
0

Ich habe eine Reihe von Builds in meiner Jenkinsfile, die jetzt parallel laufen. Aber der Master-Server ist etwas überfordert. Meine Idee ist es, die Builds auf einen konfigurierten Wert concurrentBuilds zu beschränken.Beschränke parallele Builds auf eine bestimmte Nummer in Jenkins

https://issues.jenkins-ci.org/browse/JENKINS-44085 inspiriert mich, aber ich bin ein bisschen in meinem Plan stecken. Ich habe eine Liste von Dienstleistungen, die jetzt in einer Karte versammelt, die wie folgt parallel ausgeführt werden:

def stepsForParallel = [:] 
stage('read modules') { 
    readMavenPom().modules.findAll { module -> 
    module.endsWith('-service') 
    }.each { service -> 
    stepsForParallel[service] = transformIntoStep(service) // this returns { build module } to avoid immediate execution 
    } 
} 
stage('modules') { 
    parallel stepsForParallel 
} 

Die Build-Funktion funktioniert auch parallel nutzen. So bekomme ich viele parallele Aufgaben.

Meine Idee war es, eine LinkedBlockingDeque (nennen wir es stepDeque) zu erstellen, die alle Schritte zusammenfasst, die parallel durchgeführt werden sollten. Dann würde ich eine zweite (nennen wir es workingDeque) mit einer Größe der konfigurierten concurrentBuilds erstellen.

Aber dann taucht mein Problem auf: Soweit ich weiß kann ich nur parallel auf einer Karte laufen. Also, wenn eine der Aufgaben des WorkingDeques beendet ist, habe ich einen freien Thread.

Also meine Frage ist: wenn ich einen Job von StepDeque abfragen und es zu WorkingDeque hinzufügen, gibt es eine Möglichkeit, nur den Schritt auszuführen, den ich gerade hinzugefügt habe? Oder gibt es einen einfacheren Weg, dies zu erreichen?

Antwort

0

Ich habe eine Step Klasse geschrieben, die ihre Angehörigen kennt. Am Anfang sammle ich alle Schritte und setze sie in eine LinkedBlockQueue und erstelle n Worker mit

Verwandte Themen