J'essaie d'utiliser Jenkins pour créer un projet C++ dans un conteneur Docker. Je n'ai pas de problème de problème à Jenkins ou dans un conteneur à l'extérieur de Jenkins.
Vous trouverez ci-dessous ce que j'ai essayé. J'estime que la cartographie des volumes est la clarté.
Cas 1
La commande suivante exécute avec succès une construction dans une coquille.
docker run --rm --interactive=true --tty=true $IMAGE make
Toutefois, lorsqu'il est exécuté à Jenkins sous forme d'étape "Execute Shell", Docker renvoie l'erreur suivante.
cannot enable tty mode on non tty input
Cas 2
La commande suivante est similaire à celle précédente mais désactive l'interactivité.
docker run --rm $IMAGE make
Jenkins peut courir une construction avec succès. Cependant, il y a de graves problèmes lors de l'abandon d'une construction. La construction est immédiatement marquée comme abortie mais le conteneur continue de fonctionner jusqu'à ce que la construction se termine. De plus, le conteneur est non retiré après la sortie.
Lorsque vous exécutez une coquille, la commande construit avec succès, mais il n'est pas possible de l'interrompre. De plus, le conteneur est retiré après la sortie.
Question
Quelqu'un voudrait-il fonctionner à proximité des bâtiments dans des conteneurs Docker de Jenkins et conservera la capacité d'abandonner ses constructions?
L'utilisation des plugins Jenkins n'est pas une option car les appels Docker sont à l'intérieur des scripts et ne peuvent pas être extraits facilement.
Le moyen le plus simple d'exécuter vos constructions Docker à Jenkins est d'utiliser le travail de pipeline. Il a beaucoup de plugins intégrés pouvant contrôler votre environnement et conteneurs Docker.
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/orchestrant-andworkflows-jenkins-and-docker
Vous pouvez mettre en œuvre le flux de travail suivant:
docker exec container cmd ...
Pour émettre vos commandes de construction et de testLes docker exec ...
est comme un accès de coque distant à une machine réseau. Par défaut, ce n'est pas interactif et n'alloue pas non plus un TTY. Cela devrait être bien pour la compilation et l'exécution de suites de test. La commande transfère correctement l'état de sortie de la commande exécutée dans le conteneur.
Un travail de construction peut alors être annulé via:
docker stop container
(envoie un terme et tue et attend entre), oudocker kill container
, ou mêmedocker exec container pkill someexecutable
Le flux de travail avec des commandes en béton:
$ 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 regarder cela . Travis.yml Fichier, les scripts réels CI Scripts , le script exécutant à l'intérieur du conteneur et les fichiers Docker des images utilisées.