Ausführen von Builds in Docker-Containern von Jenkins

18

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.

marcv81
quelle
1
Vielleicht mit einem Post-Build-Auftrag, dessen Aufgabe es ist, den Container zu entfernen? Und für den Fall, dass Sie einen Build abbrechen, könnten Sie vielleicht einen speziellen Build haben, der alle unechten Container stoppt und entfernt? Dies ist suboptimal, aber es ist zumindest eine Problemumgehung, die einfach einzurichten ist. :-)
lgeorget
1
Dies entspricht nicht ganz meiner Definition von sauber :) Aber ich schätze den Vorschlag, und es ist sicherlich eine gültige Problemumgehung.
Marcv81

Antworten:

3

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

    docker.image("image-name").run() -Runs the container from the image 
    docker.image("image-name").inside(){//your commands} -Runs your commands inside the docker container and also removes your container as soon as your commands are executed.

Für weitere Informationen: https://www.cloudbees.com/blog/orchestrating-workflows-jenkins-and-docker

Velsim
quelle
2

Sie können folgenden Workflow implementieren:

  1. Erstellen Sie einen Docker-Container und geben Sie einen Namen ein, auf den Sie leicht verweisen können (z. B. in Skripten).
  2. Starten Sie es und verwenden Sie etwas als Einstiegspunkt, der den Container am Laufen hält
  3. Verwenden docker exec container cmd ...Sie diese Option , um Ihre Build- und Testbefehle abzusetzen
  4. Stoppen Sie den Behälter
  5. Entfernen Sie das Bild

Das 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) oder
  • docker kill container, oder auch
  • docker exec container pkill someexecutable

Der Workflow mit konkreten Befehlen:

$ docker create --name cxx-devel \
    -v $HOME/src:/srv/src:ro -v $HOME/build:/srv/build \
    gsauthof/fedora-cxx-devel:23
$ docker start cxx-devel     # <- entrypoint is /usr/bin/sleep infinity
$ docker exec cxx-devel /srv/src/projecta/build.sh
$ docker exec cxx-devel /srv/src/projecta/check.sh
$ docker stop cxx-devel
$ docker rm cxx-devel

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 .

maxschlepzig
quelle