Utiliser docker-compose avec GitLab CI dans un runner Docker
June 25, 2018 âą Tags : GitLab Docker
Table des matiĂšres
Chez HeavyCookie, on utilise GitLab pour son cÎté tout en un, et plus particuliÚrement pour les aspects CI/CD.
Lâarchitecture de nos projets ne nous permet pas pour lâinstant dâutiliser la fonctionnalitĂ© Auto-DevOps puisque :
- On a pas de Kubernetes derriĂšre pour lâinstant.
- On utilise Docker Compose dans un seul dépot git contenant nos projets backend sous Rails et nos frontend Node/Webpack.
Le problĂšme, câest que lâimage de base docker
nâa pas lâexĂ©cutable docker-compose
.
CrĂ©ation de lâimage Docker custom
La partie CI de GitLab fonctionne Ă lâaide de runner qui sont des daemons a installer sur les machines exĂ©cutant les process dâintĂ©gration continue.
Je vous laissez voir la doc sur lâinstallation dâun runner qui est assez explicite. Jâai choisi lâinstallation via le package Debian.
Le choix un peu tricky se situe sur lâexecutor qui dĂ©finit la façon dont vont-ĂȘtre gĂ©rĂ© les commandes fournies au gitlab-runner.
Perso, jâai choisi le type docker basĂ© sur lâimage docker:latest
un peu custom pour me permettre dâavoir dĂ©jĂ docker-compose dans mon image et une instance de docker sĂ©parĂ©e de celle qui tourne sur mon serveur.
Le container devra-ĂȘtre lancĂ© avec des privilĂšges alors attention aux petits malins, surtout si vos process de builds peuvent dĂ©clencher du code ne venant pas seulement de personnes de confiance.
Lâimage est basĂ© sur Alpine Linux, on reprend donc lâimage docker:latest
et on y ajoute docker-compose
via apk
update
# Dockerfile
FROM docker:latest
RUN apk add --no-cache python py-pip python-dev && pip install docker-compose
Pour builder le container sur GitLab-CI, un simple fichier .gitlab-ci.yml :
# .gitlab-ci.yml
image: docker:latest
services: ['docker:dind']
stages:
- build
before_script:
# Authenticate to GitLab Docker Registry before executing tasks
- echo $CI_JOB_TOKEN | docker login -u gitlab-ci-token --password-stdin registry.heavycookie.co
build:docker:
stage: build
script:
- docker build -t registry.example.com/ci/docker . # Building image from `Dockerfile`
- docker push registry.example.com/ci/docker # Pushing builded image to registry
Utilisation / Configuration
Pour utiliser ce runner, deux solutions :
-
soit vous précisez dans chaque
.gitlab-ci.yml
de vos projet lâimage Ă utiliser et le service :# .gitlab-ci.yml.example image: registry.example.com/ci/docker services: - docker:dind # [...]
-
Soit vous configurez votre runner de façon Ă ce quâil utilise toujours la bonne image et le service associĂ© en Ă©ditant son toml de configuration (
/etc/gitlab-runner/config.toml
). Voici un exemple de celui que lâon utilise :# [...] [[runners]] name = "Docker-in-docker" url = "https://gitlab.example.com/" token = "your-token" executor = "docker" environment = ["DOCKER_DRIVER=overlay2"] [runners.docker] privileged = true # Needed to run docker:dind image = "registry.example.com/ci/docker" services = ["docker:dind"]
Les variables importantes dans cette configuration sont les 3 derniĂšres
privileged
,image
etservices
.
DerniĂšre chose, attention aux droits de lâutilisateur qui dĂ©clenche le process de CI : il faut quâil ai le droit dâaccĂ©der Ă lâimage registry.example.com/ci/docker
(donc ajoutez-le comme membre du dépot).
Et voilĂ , vous pouvez utiliser la commande docker-compose
dans vos scripts .gitlab-ci.yml
une fois pour toute !
-
Utiliser
â©--no-cache
a lâair mieux que--update
dâaprĂšs @Floweb & la doc de Alpine
Ăcrit par Thibault Lacroux, dĂ©veloppeur freelance Ruby on Rails, React, Elixir & co. Vous devriez le suivre sur Twitter