web-dev-qa-db-fra.com

Comment exécuter des constructions dans des conteneurs Docker de Jenkins

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.

18
marcv81

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

3
velsim

Vous pouvez mettre en œuvre le flux de travail suivant:

  1. créez un conteneur Docker et spécifiez un nom de telle sorte que vous puissiez vous y référer facilement (par exemple dans les scripts)
  2. démarrez-le et utilisez quelque chose comme point d'entrée qui maintient le conteneur en cours d'exécution
  3. Utilisation docker exec container cmd ... Pour émettre vos commandes de construction et de test
  4. Arrêter le conteneur
  5. Retirer l'image

Les 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), ou
  • docker kill container, ou même
  • docker 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.

2
maxschlepzig