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

Gitlab, Docker et Capistrano sont dans un bateau

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

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