2016-07-04 16 views
7

Wir erwägen die Verwendung des Jenkins Pipeline-Plugins für ein ziemlich komplexes Projekt, das aus mehreren Lieferungen besteht, die mit verschiedenen Tools (auf verschiedenen Maschinen) erstellt werden müssen, bevor sie zusammengeführt werden. Dennoch scheint es einfach zu sein, einen vollständigen Build mit einer einzelnen Jenkinsfile zu erstellen, und ich mag die automatische Erkennung von Git-Verzweigungen, die mit Pipeline geliefert wird.Teile einer Pipeline als separaten Job ausführen

An diesem Punkt haben wir jedoch Jobs für jede der Lieferungen und verwenden einen Build-Flow-basierten "Meta" -Auftrag, um die einzelnen Jobs zu orchestrieren. Das Schöne daran ist, dass es auch erlaubt, nur einen einzelnen Job zu starten, wenn nur kleine Änderungen vorgenommen wurden, nur um zu sehen, ob diese Lieferung noch kompiliert.

Um dies zu emulieren, kamen einige Ideen in den Sinn:

  • Verwenden Sie unterschiedliche Jenkinsfile s für die Lieferungen und load sie in der obersten Ebene Jenkinsfile; Es scheint, dass der Job Multibranch Pipeline die Konfiguration des Jenkinsfile noch nicht zu verwenden erlaubt (https://issues.jenkins-ci.org/browse/JENKINS-35415), aber das Erstellen der Jobs für die einzelnen Lieferungen ist noch offen.
  • Stellen Sie eine Konfigurationsoption für den Auftrag "oberster Ebene" bereit und lassen Sie if s für alle Lieferungen in der Jenkinsfile auswählen, welche erstellt werden soll. Dies würde verschiedene Build-Typen in einer Pipeline mischen und zumindest die Schätzung der Build-Zeit durcheinander bringen.

Sind diese realisierbaren Optionen, oder gibt es eine bessere?

+1

Diese Frage ist sehr ähnlich zu http://StackOverflow.com/Questions/38129745/Jenkins-Build-Pipeline-Restart-AT-Stage, obwohl das über Neustart ist. Für diese Frage gibt es aber auch Antworten auf diese Frage. – olenz

Antwort

5

Was Sie tun können, ist ein Pipelining Skript zu schreiben, das hat „wenn“ Berührungsschutz rund um die einzelnen Stufen, wie folgt aus:

stage "s1" 
if (theStage in ["s1","all"]) { 
    sleep 2 
} 

stage "s2" 
if (theStage in ["s2", "all"]) { 
    sleep 2 
} 

stage "s3" 
if (theStage in ["s3", "all"]) { 
    sleep 2 
} 

Dann können Sie eine „Haupt“ Job machen, die dieses Skript verwendet und führt alle Stufen auf einmal durch, indem der Parameter "theStage" auf "all" gesetzt wird. Dieser Job sammelt die Statistiken, wenn alle Stufen gleichzeitig ausgeführt werden und Ihnen nützliche Schätzzeiten geben.

Außerdem können Sie einen "Teillauf" -Auftrag erstellen, der dieses Skript verwendet und der mit der Stufe parametriert ist, die Sie ausführen möchten. Die Schätzung wird jedoch nicht sehr nützlich sein.

Beachten Sie, dass ich die Bühne selbst auf das Hauptskript legte und nur den Ausführungscode in die Bedingung legte, wie von Martin Ba vorgeschlagen. Dies stellt sicher, dass die Visualisierung der Arbeit ist zuverlässige

+0

Dies ist jedoch eine gute Idee: ["Dynamische Phasen: Im Allgemeinen, wenn Sie dynamisch wechselnde Phasen visualisieren möchten, machen Sie es für die Ausführung der Bühneninhalte Bedingung, nicht bedingte die Bühne"] (https: // wiki.jenkins-ci.org/display/JENKINS/Pipeline+Stage+View+Plugin) –

+0

Guter Rat. Ich füge das meiner Antwort hinzu. – olenz

0

Als Erweiterung der vorherigen Antwort, ich so etwas vorschlagen würde:

def stageIf(String name, Closure body) { 
if (params.firstStage <= name && params.lastStage >= name) { 
    stage(name, body) 
} else { 
    stage(name) { 
     echo "Stage skipped: $name" 
    } 
} 
} 

node('linux') { 
properties([ 
     parameters([ 
       choiceParam(
         name: 'firstStage', 
         choices: '1.Build\n' + 
           '2.Docker\n' + 
           '3.Deploy', 
         description: 'First stage to start', 
         defaultValue: '1.Build', 
       ), 
       choiceParam(
         name: 'lastStage', 
         choices: '3.Deploy\n' + 
           '2.Docker\n' + 
           '1.Build', 
         description: 'Last stage to start', 
         defaultValue: '3.Deploy', 
       ), 
     ]) 
]) 

stageIf('1.Build') { 
    // ... 
} 
stageIf('3.Deploy') { 
    // ... 
} 
} 

nicht so perfekt, wie ich will, aber zumindest seine Arbeits.