Comment exécuter des builds dans des conteneurs Docker à partir de Jenkins

18

J'essaie d'utiliser Jenkins pour construire un projet C ++ dans un conteneur Docker. Je n'ai aucun problème à construire à Jenkins ou à construire dans un conteneur à l'extérieur de Jenkins.

Voici ce que j'ai essayé. J'omets le mappage des volumes pour plus de clarté.

Cas 1

La commande suivante exécute correctement une génération dans un shell.

docker run --rm --interactive=true --tty=true $IMAGE make

Cependant, lorsqu'il est exécuté dans Jenkins en tant qu'étape «exécuter le shell», Docker renvoie l'erreur suivante.

cannot enable tty mode on non tty input

Cas 2

La commande suivante est similaire à la précédente mais désactive l'interactivité.

docker run --rm $IMAGE make

Jenkins peut exécuter une build avec succès. Cependant, il existe de graves problèmes lors de l'interruption d'une version. La génération est immédiatement marquée comme abandonnée, mais le conteneur continue de fonctionner jusqu'à la fin de la génération. De plus, le conteneur n'est pas retiré après sa sortie.

Lorsqu'elle est exécutée dans un shell, la commande se construit avec succès mais il n'est pas possible de l'interrompre. Le conteneur est également retiré après sa sortie.

Question

Quelqu'un sait-il comment exécuter proprement des builds dans des conteneurs Docker de Jenkins et conserver la possibilité d'interrompre des builds?

L'utilisation des plugins Jenkins n'est pas une option car les appels Docker sont à l'intérieur de scripts et ne peuvent pas être extraits facilement.

marcv81
la source
1
Peut-être avec un travail post-build dont la tâche est de supprimer le conteneur? Et pour les cas où vous abandonnez une version, peut-être pourriez-vous avoir une version spéciale qui arrête et supprime tous les conteneurs parasites? C'est sous-optimal mais au moins, c'est une solution de contournement facile à configurer. :-)
lgeorget
1
Cela ne correspond pas tout à fait à ma définition de clean :) Mais j'apprécie la suggestion, et c'est certainement une solution de contournement valide.
marcv81

Réponses:

3

La façon la plus simple d'exécuter vos builds de docker dans Jenkins est d'utiliser le travail du pipeline. Il possède de nombreux plugins intégrés qui pourraient contrôler votre environnement Docker et vos conteneurs.

quelques exemples sont

    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.

Pour plus d'informations: https://www.cloudbees.com/blog/orchestrating-workflows-jenkins-and-docker

velsim
la source
2

Vous pouvez implémenter le workflow suivant:

  1. créer un conteneur docker et spécifier un nom de sorte que vous puissiez facilement vous y référer (par exemple dans les scripts)
  2. démarrez-le et utilisez quelque chose comme point d'entrée qui maintient le conteneur en marche
  3. Utilisez docker exec container cmd ...pour lancer vos commandes de génération et de test
  4. Arrêtez le conteneur
  5. Supprimer l'image

C'est docker exec ...comme un accès shell distant à une machine réseau. Par défaut, il n'est pas interactif et n'alloue pas non plus de tty. Cela devrait convenir pour la compilation et l'exécution de suites de tests. La commande transmet correctement l'état de sortie de la commande exécutée à l'intérieur du conteneur.

Un travail de génération peut ensuite être abandonné via:

  • docker stop container (envoie TERM et KILL et attend entre les deux), ou
  • docker kill container, ou même
  • docker exec container pkill someexecutable

Le workflow avec des commandes concrètes:

$ 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

Pour un exemple réel qui utilise ce flux de travail, vous pouvez consulter ce fichier .travis.yml , les scripts CI réels , le script s'exécutant à l'intérieur du conteneur et les fichiers docker des images utilisées.

maxschlepzig
la source