web-dev-qa-db-fra.com

Le plug-in Jeneline Pipeline prend-il en charge Docker Compose?

Je cherche un moyen d'exécuter une compilation compatible avec Docker composée de plusieurs conteneurs dans Jenkins 2.0.

Existe-t-il des projets de prise en charge native de Docker Compose in Pipeline , ou via des plug-in de dockeur CloudBees pour pipeline.

Ou cela peut-il/doit-il être adressé par des appels explicites sh docker-compose...? Peut-être même les utiliser dans try... finallyto pour mieux contrôler le cycle de vie des services. 


EDIT: La première réponse a été de suggérer un moyen de construire des conteneurs de docker en Jenkins. Ce n'est pas ce qui est nécessaire ici. EngineerDollery souhaite utiliser ma plate-forme cible dans Jenkins à l'aide de la fonction Compose afin de pouvoir y déployer mon application et exécuter des tests de bout en bout.

32
luka5z

Après avoir recherché dans Jenkins, le suivi des bogues , JENKINS-35025 suggère que docker-compose.yml soit pris en compte lors de l'exécution d'une tâche dans un conteneur de menu fixe, à l'aide de maven build .

Voir aussi Création d'un pipeline de CI avec Jenkins , ce qui suppose que docker-compose est installé sur votre serveur Jenkins.

Remarque: un an plus tard (août 2017), docker-compose n'est toujours pas pris en charge dans le plug-in Docker Pipeline

Juillet 2018, Ivan Aracki notes dans les commentaires :

Installer manuellement docker-cli et docker-compose avec la même version que Host est la solution pour le moment ...

12
VonC

Voici les fichiers pour exécuter un conteneur jenkins qui exécute docker à l'intérieur:

docker run \
  -p 8080:8080 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  --name jenkins \
  getintodevops/jenkins-withdocker:lts

référence: https://getintodevops.com/blog/the-simple-way-to-run-docker-in-docker-for-ci

2
Julio Marins

Je suis confronté à un problème similaire, j'ai trouvé ceci https://reinout.vanrees.org/weblog/2017/10/03/docker-compose-in-jenkins.html mais je ne sais pas ce qui est lié à .

Mon problème est de tester pendant le développement et d'automatiser le test dans Jenkins. J'utilise docker-compose pour faire apparaître des scripts php ET un serveur mysql, pour exécuter des tests isolés (phpunit à partir de maintenant).

Je pourrais penser que je peux y arriver en

  1. créer un réseau dans l'hôte de menu fixe (avec docker network create)
  2. créer et exécuter un menu fixe mysql connecté à ce réseau (avec docker run mysql --network=netname --name=mysqlmachine
  3. exécutez les scripts par jenkins en spécifiant --network et en faisant référence à mysqlmachine en tant qu'hôte.

Mais cela voudrait dire que je devrais configurer des données de base de données, nettoyer des données de base de données, et également laisser toujours sur la machine mysqlmachine, même si elles ne sont pas nécessaires, en consommant des ressources RAM. Je peux résoudre le dernier problème avec les commandes docker start mysqlmachine et docker stop mysqlmachine dans mon fichier Jenkins définissant le pipeline.

Mais, encore une fois, en exécutant un shell dans le menu fixe où jenkins est en cours d’exécution, je ne trouve pas la commande docker

Pour moi est une solution viable jusqu'à ce que je ne puisse pas trouver quelque chose de mieux

UPDATE: Je vais essayer la solution https://wiki.jenkins.io/display/JENKINS/Docker+Slaves+Plugin , elle a presque ce dont j'ai besoin

UPDATE 08.02: Comme suggéré par Alexander Zeitler, en utilisant

agent {
        docker {
            image 'pdmlab/jenkins-node-docker-agent:6.11.1'
            args '-v /var/run/docker.sock:/var/run/docker.sock'
        }
    }

dans le fichier Jenkins autoriser l’utilisation de la commande docker-compose: docker dans un docker, principalement docker près d’un docker comme indiqué ici: Docker dans Docker - les volumes ne fonctionnent pas: pleins de fichiers dans le conteneur de 1er niveau, vides dans le 2e

Mais j'ai préféré utiliser une autre approche, qui n'exige pas de lancer Jenkins d'une manière spéciale.

Le pipeline dit:

stage('Test') {
    steps {
        sh './build_docker.sh jenkinstests'
    }
}

et build_docker.sh fait:

 jenkinstests)
 docker volume create idealodbconn
 docker run -v idealodbconn:/data --name helper busybox true
 docker cp ./dbconn/db249.json helper:/data
 docker rm helper

 docker-compose -f services/docker-compose-jenkins.yml up \
 --abort-on-container-exit \
 --exit-code-from idealoifapi

 docker-compose -f services/docker-compose-jenkins.yml rm -f
 docker volume rm idealodbconn
 ;;

Ici aussi, --abort-on-container-exit dit de quitter une fois qu'un conteneur défini dans docker-compose-jenkins.yml se ferme, et --exit-code-from idealoifapi dit de prendre le code de sortie de l'image idealoifapi.

C'est tout. Une partie manquante, peut-être, est l'utilisation du volume par docker-compose-jenkins.yml, elle est externe: true:

volumes:
    idealodbconn:
        external: true
0
Daniele Cruciani