  Mettre en place une **intégration continue** et un **déploiement continu** en moins de 10mn grace à **Gitlab** et **Docker**
Alexandre Buisine [@alexbuisine](https://twitter.com/alexbuisine)

# Les ingrédients * Docker *[docker.com](https://www.docker.com/)* * Gitlab *[gitlab.com](https://about.gitlab.com/product/)* * Intégration continue *[Wikipédia](https://fr.wikipedia.org/wiki/Int%C3%A9gration_continue)* * Déploiement continu *[Wikipédia](https://fr.wikipedia.org/wiki/Livraison_continue)* * et un **projet** à passer en CI/CD !
# Le projet du jour * cette présentation est disponible sur [github](https://github.com/enix/meetup-docker-ci-cd) et https://meetup-docker-ci-cd.enix.io * elle utilise le framework [reveal.js](https://revealjs.com/) 
\> c'est parfait pour ce qui va suivre
On prend l'hypothèse que l'application est déjà en conteneur ```Dockerfile FROM node:8 EXPOSE 8000 WORKDIR / RUN git clone --depth 1 https://github.com/hakimel/reveal.js.git WORKDIR /reveal.js ENV NPM_CONFIG_LOGLEVEL info RUN npm install COPY www/ ./ CMD ["npm", "start"] ```
\> il est bien simple ce [Dockerfile](https://docs.docker.com/engine/reference/builder/#parser-directives)
# Idéalement **build** > **test** > **deploy** > **apéro**
Le **build** aka _la mise en conteneur_ dans le principe ca donne ca ```yaml stages: - build job_build_a_la_sauce_docker: stage: build script: - docker build -t meetup-docker-ci-cd . - docker push meetup-docker-ci-cd ```
\> dans un beau [.gitlab-ci.yml](https://docs.gitlab.com/ee/ci/yaml/) à la racine du projet
Le **build** aka _la mise en conteneur_ dans les faits c'est plutôt ca ```yaml image: docker:latest stages: - build variables: IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA job_build_a_la_sauce_docker: stage: build script: - docker info - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY - docker build -t $IMAGE_TAG . - docker push $IMAGE_TAG ```
\> attention aux collisions de tag sur la registry
\> les [variables d'environnement](https://docs.gitlab.com/ee/ci/variables/#predefined-variables-environment-variables) possibles
# Si tout s'est bien passé sur gitlab on va avoir  et sur slack par exemple 
Passons au **test** ```yaml image: docker:latest stages: - build - test variables: IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA job_build_a_la_sauce_docker: ... htmlvalidator: stage: test before_script: - docker info - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY script: - docker run --rm -v /www:/www $IMAGE_TAG \ cp -r /reveal.js/ -T /www - docker run --rm -v /www:/www validator/validator \ java -jar ./vnu.jar --skip-non-html --errors-only /www/index.html ```
\> [validator/validator](https://hub.docker.com/r/validator/validator/) ou autrement dit "The Nu Html Checker"
# Si tout s'est bien passé on va avoir une belle **erreur**  dans le détail 
faire une **stack** applicative avec **docker-compose** ```yaml version: '3' services: www: image: meetup-docker-ci-cd # image: ${IMAGE_TAG:-meetup-docker-ci-cd} build: . loadbalancer: image: nginx ports: - "80:80" - "443:443" ```
\> il vous faut le [binaire](https://github.com/docker/compose/releases) et un fichier de configuration [yaml](https://docs.docker.com/compose/compose-file/)
\> le loadbalancer ne suffit pas ! **grunt serve** ne doit pas être utilisé en production
**deploy** à la sauce docker-compose ```yaml stages: - build - test - deploy [...] job_docker_compose_deploy: stage: deploy only: - production script: - export DOCKER_HOST="tcp://
:2375" - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY - docker-compose pull - docker-compose up -d ```
\> c'est la version à la mano mais il existe beaucoup d'outils pour **orchestrer** vos conteneurs
# et voilà 
# Quelques sujets connexes * Github [actions](https://github.com/features/actions) * _automations_ avec [Jenkins](https://jenkins.io/) * orchestration sur [Kubernetes](https://kubernetes.io/)
Si vous avez **besoin** de ce genre de système mais que vous n'avez **pas le temps** ou ne **savez pas** trop comment vous y prendre, [Enix](https://enix.io/fr/contact/) peut le faire pour vous.
Pour [monter en compétence](https://enix.io/fr/services/formation/bien-demarrer-avec-les-conteneurs/) sur [Docker](https://enix.io/fr/services/formation/bien-demarrer-avec-les-conteneurs/),
2 jours les 7 et 8 Janvier à Paris. Et pour les ceintures noires en conteneurs,
[devenez expert en orchestration](https://enix.io/fr/services/formation/deployer-ses-applications-avec-kubernetes/) sur [Kubernetes](https://enix.io/fr/services/formation/deployer-ses-applications-avec-kubernetes/) les 17 et 18 décembre à Paris.
\> il reste peu de places !
[formation@enix.io](formation@enix.io)
