2017-03-01 2 views
1

Ich benutze Jenkins Version 2.7.1 mit der Pipeline-Suite von Plugins, um eine Pipeline in einer Jenkins-Datei zusammen mit dem Docker-Plugin zu implementieren. Mein Ziel ist es, mehrere Projekt-Builds parallel auszuführen, wobei jedes Build in einem eigenen Container ausgeführt wird. Mein Jenkinsfile wie folgt aussieht:Jenkins Pipeline & Docker Plugin - gleichzeitige Builds auf einzigartigen Agenten

node('docker-agent') { 
    stage('Checkout') { 
     checkout scm 
    } 

    stage('Setup') { 
     build(job: 'Some External Job', node: env.NODE_NAME, workspace: env.WORKSPACE) 
    } 
} 

ich eine Anforderung habe einen externen Job zu nennen, aber ich brauche diese auf dem gleichen Arbeitsplatz auszuführen, wo der checkout scm Schritt den Code ausgecheckt hat, damit die node und workspace Parameter. Ich verstehe, dass durch das Einbetten eines build Aufrufs innerhalb eines node Blocks effektiv ein Executor verschwendet wird, aber mir geht es gut, da der Agent ein Container in einer Docker Cloud ist und keine Ressourcen verschwendet.

Das eine Problem mit meinem Ansatz ist, dass eine andere Instanz dieses Projekt Build könnte die Executoren von einer anderen laufenden Instanz in der Zeitlücke zwischen den 2 Stufen stehlen.

Wie kann ich im Wesentlichen sicherstellen, dass (1) Projekt-Builds gleichzeitig ausgeführt werden können, aber (2) jeder Build auf einer neuen Instanz eines durch docker-agent gekennzeichneten Agenten ausgeführt wird?

Ich habe versucht, das Locking-Plugin, aber ein neuer Build wird einfach warten, um die Sperre auf bestehenden Agenten zu erwerben, anstatt seinen eigenen Agenten zu spinnen.

+0

Was ist mit der Verwendung mehrerer Agenten mit jeweils einem Executor? Was macht der Build? Normalerweise benutze ich docker-compose für meine Pipelines, was es mir ermöglicht, 'Mein Ziel ist es, mehrere Projekt-Builds parallel auszuführen, wobei jedes Build in einem eigenen Container ausgeführt wird.' –

Antwort

0

Um zu verhindern, dass andere Builds auf demselben Agenten ausgeführt werden, begrenzen Sie die Anzahl der Executoren für jeden Agenten in Ihrer Docker-Cloud-Umgebung auf 1 (dies ist eine Einstellung beim Konfigurieren von Andockfenster für dieses Label). Dazu muss ein neuer Container pro Executor gestartet werden.

Das heißt, ich würde eine solche Pipeline nicht entwerfen. Stattdessen würde ich stash und unstash verwenden, um Ihre Kasse und andere kleine Artefakte zwischen den Knoten zu kopieren, sodass Sie die Ausführung anhalten können, ohne dass ein Knoten ausgeführt wird.

Verwandte Themen