Ich versuche, Jenkins zu verwenden, um ein C ++ - Projekt in einem Docker-Container zu erstellen. Ich habe kein Problem damit, in Jenkins oder in einem Container außerhalb von Jenkins zu bauen.
Unten ist, was ich versucht habe. Ich verzichte aus Gründen der Übersichtlichkeit auf die Zuordnung der Volumes.
Fall 1
Mit dem folgenden Befehl wird ein Build in einer Shell erfolgreich ausgeführt.
docker run --rm --interactive=true --tty=true $IMAGE make
Wenn Docker jedoch in Jenkins als "Shell ausführen" -Schritt ausgeführt wird, wird der folgende Fehler zurückgegeben.
cannot enable tty mode on non tty input
Fall 2
Der folgende Befehl ähnelt dem vorherigen, deaktiviert jedoch die Interaktivität.
docker run --rm $IMAGE make
Jenkins können einen Build erfolgreich ausführen. Beim Abbrechen eines Builds treten jedoch schwerwiegende Probleme auf. Der Build wird sofort als abgebrochen markiert, der Container wird jedoch so lange ausgeführt, bis der Build abgeschlossen ist. Auch der Behälter wird nach dem Verlassen nicht entfernt.
Wenn der Befehl in einer Shell ausgeführt wird, wird er erfolgreich erstellt, kann jedoch nicht unterbrochen werden. Auch der Container wird nach dem Verlassen entfernt.
Frage
Würde jemand wissen, wie man Builds in Docker-Containern von Jenkins sauber ausführt und die Fähigkeit behält, Builds abzubrechen?
Die Verwendung eines der Jenkins-Plugins ist keine Option, da sich die Docker-Aufrufe in Skripten befinden und nicht einfach extrahiert werden können.
Antworten:
Die einfachste Möglichkeit, Docker-Builds in Jenkins auszuführen, ist die Verwendung des Pipeline-Jobs. Es verfügt über zahlreiche integrierte Plug-ins, mit denen Sie Ihre Docker-Umgebung und -Container steuern können.
einige Beispiele sind
Für weitere Informationen: https://www.cloudbees.com/blog/orchestrating-workflows-jenkins-and-docker
quelle
Sie können folgenden Workflow implementieren:
docker exec container cmd ...
Sie diese Option , um Ihre Build- und Testbefehle abzusetzenDas
docker exec ...
ist wie ein Remote-Shell-Zugriff auf einen Netzwerkcomputer. Standardmäßig ist es nicht interaktiv und weist auch kein tty zu. Dies sollte für das Kompilieren und Ausführen von Testsuiten in Ordnung sein. Der Befehl leitet den Beendigungsstatus des im Container ausgeführten Befehls ordnungsgemäß weiter.Ein Build-Job kann dann abgebrochen werden über:
docker stop container
(sendet TERM und KILL und wartet dazwischen) oderdocker kill container
, oder auchdocker exec container pkill someexecutable
Der Workflow mit konkreten Befehlen:
Für ein reales Beispiel, das diesen Workflow verwendet, können Sie sich diese .travis.yml- Datei, die tatsächlichen CI-Skripte , das Skript, das im Container ausgeführt wird, und die Docker-Dateien der verwendeten Bilder ansehen .
quelle