Gitlab CI: utiliser docker-compose

Le problème exposé dans ce sujet a été résolu.

Hello messieurs,

J’ai un gitlab "perso" et une CI capable aujourd’hui de mettre en prod mon appli. J’suis assez content de cela sauf que cette même CI ne peut pas lancer les tests de façon un peu isolée. Il faudrait que j’utilise le même runner et que je me connecte en SSH pour lancer un test sur mon serveur. J’aimerais le faire plus directement en utilisant une approche de docker in docker.

Concrètement mon appli est splitée en plusieurs dockers, notamment le docker de base de données… Et j’aimerais lancer mes tests fonctionnels.

Donc j’ai essayé ceci:

  1. Installation d’un gitlab runner sur mon serveur https://docs.gitlab.com/runner/install/linux-manually.html

  2. J’utilise cette configuration pour mon projet:

    stages:
      - testing
    
    run tests:
      services:
        - docker:19.03.8-dind
      stage: testing
      script:
        - docker images
        - make build
        - make test.behat
    

Pour l’instant impossible de le faire démarrer, voici les logs:

Using Docker executor with image ubuntu:latest ...
 Starting service docker:19.03.8-dind ...
 Pulling docker image docker:19.03.8-dind ...
 Using docker image sha256:c814ba3a41a3de0a9a23b7d0bb36f64257b12aef5103b4ce1d5f1bfc3033aad3 for docker:19.03.8-dind ...
 Waiting for services to be up and running...
 *** WARNING: Service runner-qzr2td2z-project-39-concurrent-0-e6c744ac051ec809-docker-0 probably didn't start properly.
 Health check error:
 service "runner-qzr2td2z-project-39-concurrent-0-e6c744ac051ec809-docker-0-wait-for-service" timeout
 Health check container logs:
 Service container logs:
 2020-09-22T22:33:01.200443256Z Generating RSA private key, 4096 bit long modulus (2 primes)
 2020-09-22T22:33:01.229487871Z ....++++
 2020-09-22T22:33:01.272803533Z ........++++
 2020-09-22T22:33:01.273230846Z e is 65537 (0x010001)
 2020-09-22T22:33:01.288264240Z Generating RSA private key, 4096 bit long modulus (2 primes)
 2020-09-22T22:33:01.434288861Z ..............................++++
 2020-09-22T22:33:01.801949252Z ..................................................................................++++
 2020-09-22T22:33:01.802387437Z e is 65537 (0x010001)
 2020-09-22T22:33:01.826370465Z Signature ok
 2020-09-22T22:33:01.826383719Z subject=CN = docker:dind server
 2020-09-22T22:33:01.826523493Z Getting CA Private Key
 2020-09-22T22:33:01.837578085Z /certs/server/cert.pem: OK
 2020-09-22T22:33:01.840191851Z Generating RSA private key, 4096 bit long modulus (2 primes)
 2020-09-22T22:33:01.963107808Z ..........................++++
 2020-09-22T22:33:03.133745304Z ..........................................................................................................................................................................................................................................................................++++
 2020-09-22T22:33:03.134169816Z e is 65537 (0x010001)
 2020-09-22T22:33:03.157060121Z Signature ok
 2020-09-22T22:33:03.157086442Z subject=CN = docker:dind client
 2020-09-22T22:33:03.157238520Z Getting CA Private Key
 2020-09-22T22:33:03.168806817Z /certs/client/cert.pem: OK
 2020-09-22T22:33:03.171079474Z mount: permission denied (are you root?)
 2020-09-22T22:33:03.171183141Z Could not mount /sys/kernel/security.
 2020-09-22T22:33:03.171188432Z AppArmor detection and --privileged mode might break.
 2020-09-22T22:33:03.171876008Z mount: permission denied (are you root?)
 *********
 Pulling docker image ubuntu:latest ...
 Using docker image sha256:bb0eaf4eee00c28cb8ffd54e571dd225f1dd2ed8d8751b2835c31e84188bf2de for ubuntu:latest 

Preparing environment

 Running on runner-qzr2td2z-project-39-concurrent-0 via kido...
Getting source from Git repository

 Fetching changes...
 Reinitialized existing Git repository in /builds/GangBowl/prototype3/.git/
 Checking out 63ef2906 as feature/tests-on-ci...
 Skipping Git submodules setup
Executing "step_script" stage of the job script
 $ docker images
 /usr/bin/bash: line 97: docker: command not found
 ERROR: Job failed: exit code 1...

Concrètement ici plusieurs chooses ne vont pas: 1. Apparemment le service docker in docker ne démarre pas ?!… Mais ça continue quand même 2. Je n’ai pas accès à la commande docker donc bloqué. J’ai tenté en spécifiant l’image dind, du coup j’ai naturellement la commande mais il n’arrive pas à accéder à docker.

J’ai essayé plusieurs solutions mais rien n’y fait. Du coup si l’un d’entre vous a déjà tenté cela, j’aimerais profiter un peu de son experience.

Merci d’avance!

Est-ce que ton conteneur a le flag privileged pour pouvoir lancer d’autres conteneurs ?

À savoir que niveau sécurité c’est potentiellement dangereux de donner ce genre d’accès à un conteneur non maîtrisé.

De ce que j’ai pu en entendre parler aussi, Docker-in-Docker c’est pas toujours ce qu’il y a de plus stable… Est-ce que tu peux pas utiliser des services Docker plutôt que d’imbriquer tes conteneurs ?

Ouais je connais cette histoire de privileged, mais le container est lancé par le runner en soit non ? J’ai ajouté l’utilisateur gitlab-runner dans le groupe docker pour qu’il puisse lancer des dockers mais j’ai vu aucun changement au final ^^' . (de toutes il est lancé en root)

Qu’est-ce que tu entends par utiliser des services ?

+0 -0

Le conteneur principal oui, mais à l’intérieur du conteneur il faut les privilèges Docker pour pouvoir lancer d’autres conteneurs. Un conteneur Docker est en sandbox par défaut, il n’a pas accès à l’hôte (donc pas à la commande docker ni à l’utilisateur gitlab-runner).

Je parle d’utiliser d’autres services/conteneurs via l’équivalent de depends_on de Docker-compose. La doc Gitlab CI donne un exemple pour MySQL ou d’autres services.

Je ne sais pas à quoi tu fais référence quand tu dis "le conteneur principal" :/ .

Mais bon j’ai modifié ma conf (et découvert qu’elle existait au passage !) et j’ai set la valeur relative à docker privileged. On pourrait croire que tout est résolu mais il n’en est rien.

J’ai tenté cette config dans mon gitlab-ci.yaml et ça ne fonctionne pas:

run tests:
  services:
    - docker:19.03.8-dind
  stage: testing
  image: docker:19.03.8-dind
  script:
    - docker images

Et l’erreur:

 Cannot connect to the Docker daemon at tcp://docker:2375. Is the docker daemon running?

J’ai mis l’image docker dind parce que l’image ubuntu n’a pas docker préinstallé évidemment. Bref, tout cela change quelque chose: je n’ai plus la longue erreur précédente !… Mais ça ne fonctionne pas et je ne sais toujours pas pourquoi 🧐 .

Pour ce qui est du depend_on c’est dans le docker-compose donc tant que je ne peux pas lancer docker je ne vois pas ce que ça change.

Le runner gitlab est sur la machine hôte oui (et je n’ai qu’une seule machine, c’est pour mes petits projets perso 😊 ).

Je veux faire mon make test.behat qui cache en fait un script du genre ça:

docker-compose up -d
docker-compose exec manager bash -c "composer install"
docker-compose exec manager bash -c "bin/console doctrine:migration:migrate -n"
docker-compose exec manager bash -c "vendor/bin/behat"
+0 -0

Désolé pour le long silence radio, j’étais focus sur plein d’autres tâches ! ^^ Mais me re-voilà. Et grâce à toi, j’ai pu résoudre mes soucis.

J’ai simplement ajouté un runner en mode shell comme tu le suggérais :) .

sudo gitlab-runner register

J’ai encore un dernier soucis car il faut que le nom du dossier où le projet est clone soit unique sinon je ne peux pas lancer les build en parallèle (docker-compose se base sur le nom du dossier !). Mais j’ai bon espoir de réussir à corriger ce problème.

Merci !

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte