48 votes

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

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

Existe-t-il des plans pour un support natif de Docker Compose sur Pipeline ou via les plugins docker CloudBees pour les pipelines.

Ou est-ce que cela peut/doit être abordé par des appels explicites sh docker-compose... ? Peut-être même les utiliser à l'intérieur try... finally pour mieux contrôler le cycle de vie des services.


EDIT : La première réponse était de suggérer un moyen de construire des conteneurs Docker dans Jenkins. Ce n'est pas ce dont nous avons besoin ici. Je (EngineerDollery) veux faire apparaître ma plateforme cible dans Jenkins en utilisant Composte afin de pouvoir y déployer mon application et exécuter des tests de bout en bout.

0 votes

J'ai pu utiliser docker compose en exécutant un shell scripts, je ne suis pas sûr que cela puisse être utilisé dans un pipeline mais si vous pouvez exécuter le shell scripts dans un pipeline alors cela ne devrait pas poser de problème.

3 votes

Malheureusement, j'ai fini par trouver une solution qui consiste à exécuter docker compose de sh en l'intégrant dans try...finally clause pour le contrôle du cycle de vie. Pour le moment, il n'y a pas de support pour docker-compose à partir de l'écosystème des plug-ins de Jenkins . Cependant, je garderai un œil attentif sur un officiel. Plugin Docker Pipeline de CloudBees et plutôt expérimental Plugin pour les esclaves Docker .

0 votes

Docker sera mécontent si vous exécutez Docker compose dans un pipeline Jenkins, et que vous utilisez des agents Docker Jenkins, et (comme c'est probable) votre Docker compose essaie de créer un réseau de pontage Docker.

18voto

VonC Points 414372

Après avoir cherché dans Suivi des bogues dans Jenkins , JENKINS-35025 suggère docker-compose.yml est prise en compte lors de l'exécution d'une tâche dans un conteneur Docker, en utilisant une construction maven .

Voir aussi Créer un pipeline CI avec Jenkins qui suppose que docker-compose est installé sur votre serveur Jenkins.

Note : un an plus tard (août 2017), docker-compose n'est toujours pas pris en charge par le plugin Docker Pipeline

Juillet 2018, Ivan Aracki notes dans les commentaires :

Installation manuelle docker-cli y docker-compose avec la même version que celle de l'hôte est la solution pour le moment...

0 votes

Voici les fichiers pour exécuter un conteneur jenkins qui exécute docker à l'intérieur : gist.github.com/aj07mm/9ec82203d45c990e9d8f909109fd8188

0 votes

@IvanAracki Pas à ma connaissance.

2 votes

Installer manuellement docker-cli et docker-compose avec la même version que celle de l'hôte est la solution pour le moment.... @VonC

3voto

Julio Marins Points 406

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

0 votes

Intéressant. +1

1 votes

Pouvez-vous résumer l'étape de cette réponse ? Se contenter de pointer vers un lien externe (qui pourrait devenir périmé un jour) n'est pas la meilleure pratique ici.

0 votes

Bien sûr ! Je viens de l'ajouter.

2voto

Daniele Cruciani Points 155

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 à quoi il est lié.

Mon problème est de tester tout en développant, et aussi d'automatiser le test dans Jenkins, et j'utilise docker-compose pour amener quelques php scripts ET un serveur mysql, pour exécuter des tests isolés (phpunit à partir de maintenant).

Je pourrais penser que je peux atteindre cet objectif en

  1. création d'un réseau dans l'hôte docker (avec docker network create )
  2. créer et exécuter un docker mysql attaché à ce réseau (avec docker run mysql --network=netname --name=mysqlmachine
  3. exécuter scripts par jenkins en spécifiant --network et en se référant à mysqlmachine comme hôte.

Mais cela signifie que je dois configurer les données de la base de données, nettoyer les données de la base de données, et aussi laisser la machine mysqlmachine toujours active même quand elle n'est pas nécessaire, ce qui consomme des ressources en mémoire vive. Je peux résoudre ce dernier problème avec docker start mysqlmachine y docker stop mysqlmachine dans mon fichier Jenkins définissant le pipeline.

Mais, encore une fois, en exécutant un shell dans le docker où s'exécute jenkins, je ne trouve pas docker commande

Pour moi, c'est une solution viable jusqu'à ce que je ne trouve rien de mieux.

MISE À JOUR : Je vais essayer le https://wiki.jenkins.io/display/JENKINS/Docker+Slaves+Plugin solution, il a presque tout ce dont j'ai besoin

MISE À JOUR 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 permettent l'utilisation de la commande docker-compose : docker à l'intérieur d'un docker, c'est-à-dire surtout docker près d'un docker comme détaillé ici : Docker dans Docker - les volumes ne fonctionnent pas : Plein de fichiers dans le conteneur de 1er niveau, vide dans le conteneur de 2ème niveau

Mais j'ai préféré utiliser une autre approche, qui ne nécessite pas d'exécuter jenkins d'une manière spéciale.

Le pipeline dit :

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

et build_docker.sh le 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 dire de sortir dès qu'un conteneur défini dans docker-compose-jenkins.yml sort, et --exit-code-from idealoifapi dit de prendre le code de sortie de l'image idealoifapi.

C'est tout. La partie manquante, peut-être, est l'utilisation de volume dans docker-compose-jenkins.yml, il est externe : true :

volumes:
    idealodbconn:
        external: true

0 votes

Je dois encore le tester, les demandes des clients et de la PM ont changé les priorités des tâches, je suis revenu sur ce sujet il y a 2 jours, mais je suis maintenant dans une autre tâche. Je vais le savoir. Mais cela semble complexe, car je dois définir un Dockerfile à construire, et normalement le pipeline de Jenkins attend un Dockerfile (ou une image) pour construire. Je pense donc que je devrais d'abord déplacer le code et les fichiers (également le fichier du pipeline jenkins) dans le conteneur construit par Docker Slave, puis exécuter le pipeline à cet endroit avec le soutien du conteneur latéral.

3 votes

J'ai essayé et il ne semble pas que le plugin s'installe. docker-compose . Je l'ai résolu en créant une image contenant Node.js, Docker et Docker Compose. Cette image est référencée dans agent sur Jenkinsfile . En raison de Docker dans Docker Volume Mappings ne fonctionne pas comme prévu, mais la solution est décrite ici : stackoverflow.com/questions/49312100/ C'est le Dockerfile : github.com/PDMLab/jenkins-node-docker-agent

0 votes

Sur le montage en volume, je n'aime pas cette approche non comprise par les autres. À la place, je crée un volume symbolique, j'y copie les fichiers, j'exécute les tests, puis je supprime le volume comme suggéré ici. stackoverflow.com/questions/37468788/ cette solution ne nécessite pas de configuration spéciale de jenkins, tout est géré par l'api docker, communiquant par socket, elle est donc plus générale. Je mets à jour la réponse avec les détails

1voto

Yoni Rabinovitch Points 2747

J'ai docker-compose travailler dans des pipelines Jenkins en utilisant Nestybox comme décrit dans leur article de blog . J'ai construit mon installation Jenkins elle-même en utilisant le Dockerfile suivant :

FROM nestybox/jenkins-syscont:latest
# Install docker-compose
RUN curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose \ 
&& chmod +x /usr/local/bin/docker-compose

Avec cela, j'ai simplement suivi les instructions dans le article de blog et peut exécuter des pipelines qui ressemblent à quelque chose comme ça :

pipeline {

   agent any

   stages {
       stage('docker-compose') {
           steps {
              sh "docker-compose build"
              sh "docker-compose up -d"
              ...
           }
       }
   }
   post {
      always {
         sh "docker-compose down || true"
      }
   }   
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X