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.
Réponses:
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
Pour plus d'informations: https://www.cloudbees.com/blog/orchestrating-workflows-jenkins-and-docker
la source
Vous pouvez implémenter le workflow suivant:
docker exec container cmd ...
pour lancer vos commandes de génération et de testC'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), oudocker kill container
, ou mêmedocker exec container pkill someexecutable
Le workflow avec des commandes concrètes:
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.
la source