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
- création d'un réseau dans l'hôte docker (avec
docker network create
)
- créer et exécuter un docker mysql attaché à ce réseau (avec
docker run mysql --network=netname --name=mysqlmachine
- 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
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
desh
en l'intégrant danstry...finally
clause pour le contrôle du cycle de vie. Pour le moment, il n'y a pas de support pourdocker-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.