Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Gitlab, Docker et Capistrano sont dans un bateau

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

Gitlab, Docker et Capistrano sont dans un bateau

Retour d'expérience sur la suite de l'industrialisation chez M6 Web Lille - Apéro PHP à Lille de décembre 2017

Avatar for Marichez Pierre

Marichez Pierre

December 05, 2017
Tweet

More Decks by Marichez Pierre

Other Decks in Programming

Transcript

  1. Qui sommes-nous ? ◎ Rémi T’Jampens ◦ Developpeur chez Link

    Value ◦ Fullstack ◦ Fan de musique et dévoreur de Pitch ◎ Pierre Marichez ◦ Responsable PHP M6 Web Lille ◦ 20 ans de PHP ◦ Spécialisé en PHP Cunéiforme
  2. Qui sommes-nous vraiment ? ◎ Equipe PHP ◦ Julien ◦

    Pierre ◦ Joseph ◦ Charly ◦ Nicolas ◦ Cédric ◦ Guillaume ◦ Sébastien ◦ Rachid ◦ Sylvain ◦ Tom ◦ Geoffrey ◦ Gwénolé ◦ Rémi ◦ Pierre ◦ Pierre ◦ Antoine
  3. Schéma 2015 Qui sait déployer Techno Dev Delivery Prod PHP

    Radins 2 PHP distant git rsync 5.6 Dealfeed 3 sf2 vagrant capistrano + humain capistrano 5.6 Meteo 2 PHP distant git git 5.3 Meteo Mobile 0 Jquery Mobile distant git git n/a Radins mobile 2 Angular 1 / Ionic distant git git n/a Fourchette 1 Drupal 7 n/a git drush 5.6 CroqKilos 3 sf2 vagrant capistrano capistrano 5.6
  4. Schéma 2016 Qui sait déployer Techno Dev Test Staging Delivery

    Prod PHP Radins Equipe PHP docker gitlab-ci jenkins jenkins jenkins 5.6 Dealfeed Equipe sf2 docker gitlab-ci jenkins jenkins jenkins 5.6 Meteo Equipe PHP docker gitlab-ci jenkins jenkins jenkins 5.3 Meteo Mobile Equipe Jquery Mobile docker gitlab-ci jenkins jenkins jenkins n/a Radins mobile Equipe Angular 1 / Ionic docker gitlab-ci jenkins jenkins jenkins n/a Fourchette Equipe Drupal 7 docker gitlab-ci jenkins jenkins jenkins 5.6 CroqKilos Equipe sf2 docker gitlab-ci jenkins jenkins jenkins 5.6 Batch Equipe sf3 docker gitlab-ci jenkins jenkins jenkins 7
  5. Schéma 2017 Qui sait déployer Techno Dev Test Recette Delivery

    Prod PHP Radins Equipe sf3 docker docker docker gitlab-ci gitlab-ci 7.1 Meteo Equipe PHP docker docker docker jenkins jenkins 7 Meteo Mobile Equipe Jquery Mobile docker docker docker jenkins jenkins n/a Fourchette Equipe Drupal 7 docker docker docker gitlab-ci gitlab-ci 7 CroqKilos Equipe sf3 docker docker docker gitlab-ci gitlab-ci 7 Batch Equipe sf3 docker docker docker jenkins jenkins 7 Clubic Equipe sf2 docker docker docker jenkins jenkins 5.6 Deco Equipe sf2 docker docker docker gitlab-ci gitlab-ci 5.6 Turbo Equipe PHP docker docker docker jenkins jenkins 5.6 Shopper Equipe sf2 docker docker docker jenkins jenkins 7 Racepack API Equipe sf3 docker docker docker gitlab-ci gitlab-ci 7.1 Racepack front Equipe Angular 4 docker docker docker gitlab-ci gitlab-ci n/a Switfi API Equipe sf3 docker docker docker jenkins jenkins 7 CroqKilos API Equipe sf3 docker docker docker gitlab-ci gitlab-ci 7 Déco visionneuse Equipe React n/a n/a n/a jenkins jenkins n/a Mindtarget API Equipe sf3 docker docker docker gitlab-ci gitlab-ci 7.1 Mindtarget front Equipe Angular 4 docker docker docker gitlab-ci gitlab-ci n/a Images Equipe sf2 docker docker docker gitlab-ci gitlab-ci 7.1
  6. Présentation de SUPERPROJET v2 ◎ Gitlab ◦ .gitlab-ci.yml ◦ Du

    code ◎ Docker ◦ Environnements ◦ Ecosystème ◎ Capistrano ◦ Déploiements et hook ◦ Gem ruby
  7. Présentation de SUPERPROJET v2 ◎ Gitlab ◦ .gitlab-ci.yml ◦ Du

    code ◎ Docker ◦ Environnements ◦ Ecosystème ◎ Capistrano ◦ Déploiements et hook ◦ Gem ruby
  8. Gitlab - gitlab-ci.yml Fichier utilisé par le Gitlab Runner pour

    gérer les jobs du projet Exemple image: ruby:2.1 services: - postgres before_script: - bundle install stages: - build - test - deploy job1: stage: build script: - execute-script-for-job1 only: - master
  9. Gitlab - Code Jobs cachés Job qui n’est pas automatiquement

    lancé par Gitlab CI variables: TEST_FILE_NAME: build_is_done.txt .script_template: capistrano: &capistrano_script | if [ ! -f $TEST_FILE_NAME ]; then echo "Please launch the build job in this pipeline to get an artifact."; exit 1; fi bundle install bundle exec cap $CI_ENVIRONMENT_NAME deploy tag=$CI_COMMIT_REF_NAME --trace populate_dependencies: &populate_dependencies_script | composer install --no-interaction --optimize-autoloader composer run-script post-install-dev --no-interaction touch $TEST_FILE_NAME
  10. Gitlab - gitlab-ci.yml Artefacts Liste de fichiers et de répertoires

    rattachés à un job après qu’il se termine avec succès. Exemple .artifact_template: &artifact_definition artifacts: name: "${CI_PROJECT_NAME}_${CI_COMMIT_REF_NAME}" paths: - . expire_in: 1 month
  11. Gitlab - Code Stages Définit les différentes étapes du pipeline

    stages: - qa - build - test - deploy_review - deploy_staging - sanity_staging - deploy_delivery - sanity_delivery - deploy_prod
  12. Gitlab - gitlab-ci.yml Builds Building php source Project Automatically: image:

    registrydocker.odiso.net:443/php:7.2-cli stage: build only: - tags script: - *populate_dependencies_script <<: *artifact_definition Building node source Project Automatically: image: registrydocker.odiso.net:443/node:8 stage: build only: - tags script: - npm install --no-shrinkwrap - node_modules/.bin/gulp build <<: *artifact_definition
  13. Gitlab - Code Pipelines strategies Deploy to Delivery: variables: SYMFONY_ENV:

    "preprod" stage: deploy_delivery environment: preproduction when: manual only: - tags script: - *capistrano_script Sanity Delivery test: image: registrydocker.odiso.net:443/php:7.2-nginx stage: sanity_delivery allow_failure: false only: - tags script: - php scripts/check_api_signature.php delivery
  14. Présentation de SUPERPROJET v2 ◎ Gitlab ◦ .gitlab-ci.yml ◦ Du

    code ◎ Docker ◦ Environnements ◦ Ecosystème ◎ Capistrano ◦ Déploiements et hook ◦ Gem ruby
  15. Docker - Environnements Du dev à la recette - Docker-compose

    - Définition des containers - Makefile - Gestion des alias par environnement
  16. Docker - Environnements Du dev à la recette - Docker-compose

    - Définition des containers - Makefile - Gestion des alias par environnement
  17. Docker - Ecosystème Docker compose dev networks: default: external: name:

    ws-projet-v2 services: app: image: registrydocker.odiso.net:443/php:7.2-fpm container_name: ws-projet-v2-app volumes: - .:/var/www/html front: build: docker/nginx container_name: ws-projet-v2-front volumes: - ./docker/nginx/config/app.conf:/etc/nginx/conf.d/app.conf:ro - .:/var/www/html environment: - VIRTUAL_HOST=local.ws.projet-v2.fr redis: image: redis container_name: ws-projet-v2-redis
  18. Docker - Ecosystème Docker compose recette services: app: container_name: {ENVIRONMENT_SLUG}-app

    environment: - VIRTUAL_HOST={ENVIRONMENT_SLUG}.recette.odiso.com - HOST=http://{ENVIRONMENT_SLUG}.recette.odiso.com - DOCKER_ENV=dev - REDIS1_SERVER_IP={ENVIRONMENT_SLUG}-redis - REDIS2_SERVER_IP={ENVIRONMENT_SLUG}-redis - REDIS3_SERVER_IP={ENVIRONMENT_SLUG}-redis - REDIS4_SERVER_IP={ENVIRONMENT_SLUG}-redis redis: container_name: {ENVIRONMENT_SLUG}-redis
  19. Docker - Environnements Du dev à la recette - Docker-compose

    - Définition des containers - Makefile - Gestion des alias par environnement [dev] make install == [test] make install == [builds] make install == [recette] make install
  20. Docker - Ecosystème Makefile SYNC = docker-sync-stack NETWORK = ws-projet-v2

    COMPOSE = docker-compose ifneq (,$(ENVIRONMENT_REF_NAME_SLUG)) COMPOSE = docker-compose -f docker-compose.yml -f docker-compose.recette.yml -p $(ENVIRONMENT_REF_NAME_SLUG) endif install: configure containers dependencies configure: network proxy network: @if [ ! $$(docker network ls -qf 'name=$(NETWORK)') ]; then\ printf "\e[33mCreate network $(NETWORK)\e[0m\n";\ docker network create $(NETWORK) &> /dev/null;\ sleep 3;\ else\ printf "\e[32mNetwork $(NETWORK) already exists\e[0m\n";\ fi
  21. Docker - Environnements Nginx Proxy - Gestion simple des urls

    des projets par variable d’environnement - Facilite la cohabitation des environnements de recette - /!\ La génération de la conf peut échouer - /!\ Il a ses propres confs nginx par défaut
  22. Docker - Environnements Network - Permet la communication des différents

    containers d’un même projet - Permet la communication entre plusieurs projets API + API images + client Angular + Prerender
  23. Docker - Ecosystème Dockerfiles & registry - Repository git avec

    tous les Dockerfiles des images - Script pour faciliter le build des images - Registry docker privé
  24. Présentation de SUPERPROJET v2 ◎ Gitlab ◦ .gitlab-ci.yml ◦ Du

    code ◎ Docker ◦ Environnements ◦ Ecosystème ◎ Capistrano ◦ Déploiements et hook ◦ Gem ruby
  25. Capistrano Permet de déployer du code sur des serveurs et

    d’automatiser des tâches avant, pendant et après le déploiement. Et oui, c’est du ruby.
  26. Capistrano - Déploiements Arborescence - Gemfile => dépendances - Capfile

    => déclarations globales - capistrano - stages => variables + serveurs - recette.rb - delivery.rb - production.rb - tasks => commandes cli - make.rake - tasks.rake - deploy.rb => variables globales
  27. Capistrano - Gems Factorisation - Build gems (bootstrap) - Gem

    Changelog - Gem scm copy - Gem notification
  28. J’adore quand un plan se déroule sans accroc ◎ Mettre

    à jour conf gitlab-runner ◎ Gestion multi-projets (api + front + service tiers) ◎ copier/coller dockerfiles : pourquoi ? C’est historique ;) ◎ Docker + windows => LENT ◎ Docker In Docker dans runner : NE PAS MONTER LE SOCKET DE LA VM ! ◎ Version docker en local vs gitlab vs les autres (env recette, dev, …) ◎ Job manuel peuvent toujours être lancés même si allow_failure: false