Industrialisation et automatisation chez M6Web Lille
Petit tour d'horizon des différents outils et workflows utilisés et des actions menées depuis 1 an chez M6 Web Lille pour faciliter le quotidien des développeurs (mais pas que).
Constat 2015 ◎ Organisation trop compartimentée ○ Organisation verticale ○ SPOF ◎ Pas de process ○ Mise en production risquée ○ Outil de gestion de projet non performant ○ Correction des bugs en production ○ Pas de workflow de développement ◎ Mal outillés ○ Pas d’alerting en place ○ Aucun monitoring
Écosystème 2016 Projets Radins Radins bon plan Météo Météo mobile Fourchette Croqkilos Radins batch Devs capable de déployer Toute l’équipe Techno php maison SF2 php maison bis jquery mobile drupal 7 php 7 SF2 SF3 php7 Env de dev Docker Env de test Gitlab-ci Livraison staging Jenkins Livraison delivery Livraison prod
Comment c’est-y qu’on a fait ? ◎ Uniformisation des environnements de dev ◎ Formalisation des étapes de vies des US/Bug ◎ Définition d’un workflow de dev ◎ Intégration continue ◎ Déploiement ◎ Automatisation ◎ Monitoring / Alerting
Uniformisation des environnements de dev Passage à docker : ◎ Une baleine ◎ Le standard émergeant ◎ Plus d’environnements de dev distants ◎ Flexibilité et sécurité en se passant des VM ◎ Performance en local ◎ Rationalisation des projets
Cycle de vie d’une User Story US_1234 → SEO - création arborescence TargetProcess 3 5 8 → SEO - création arborescence 8pt - Renaud Sprint Code... branch feature/US_1234-SEO-arborescence push build Déploiement Validation Scrum Master Validation Product Owner Mise en production --------------- --------------- --------------- --------------- --------------- # Slack
image: bobey/docker-gitlab-ci-runner-php5.6 stages: - qa - build - test - deploy services: - mysql - redis variables: SYMFONY_ENV: "test" MYSQL_ALLOW_EMPTY_PASSWORD: "yes" sniff_code: image: m6web/php56 stage: qa [...] test-php56-phpunit: image: m6web/php56 stage: test [...] test-php56-behat: image: m6web/php56-apache-symfony stage: test [...] merge_auto: stage: deploy [...] GitLab-ci ◎ Créer le(s) runner(s) (executor : docker) ◎ Configurer .gitlab-ci.yml ◎ image docker de base ◎ N stages redéfinissables ◎ services : images pour les services de base ◎ variables d’environnement partagées entre tous les containers ◎ N “jobs” par stage pas de persistance de données entre les jobs $ sudo gitlab-ci-multi-runner register
GitLab-ci … et plus encore ◎ Environnements pour les déploiements ◎ Repository docker privé ◎ Résolution des conflits ◎ … des nouveautés très fréquentes !
Déploiement et environnements ◎ Pipeline OK => déploiement env. à la volée par US ◎ Merge sur develop => déploiement auto en staging ◎ Tag sur delivery ◎ Tag sur prod ◎ Capistrano sur staging, delivery, prod
Déploiement US_1234 → SEO - création arborescence TargetProcess Déploiement en PRODUCTION --------------- --------------- --------------- --------------- --------------- # Slack Build OK Création merge request auto Création espace de recettage à la volée Validation par l’équipe Validation par le métier Merge sur develop Déploiement en STAGING Validation par le métier Création TAG sur develop Déploiement en DELIVERY N Features
Monitoring ◎ ElasticSearch et Packetbeat pour le trafic, les codes HTTP et temps de réponse. ◎ Grafana et statsd pour les applications. ◎ Sonar pour la qualité du code ◎ Outil interne pour le suivi de la pub
Alerting ◎ Sentry pour les erreurs applicatives (serveur et javascript) avec alerting par mails ou notifs via slack ou création US dans TargetProcess. ◎ Alerting humain via les écrans de monitoring dans le bureau. ◎ Directement par l’hébergeur
Statsd m6web/statsd-bundle - Activation du bundle - Un peu de conf - Listener global - Évènement => action sur métrique Ex : évènement de création d’un bon plan : $this->eventDispatcher ->dispatch('deal.creation.succeeded' , new Event()); Configuration évènements => actions sur métriques (app/config/config.yml) : m6_statsd: # ... clients: default: events: deal.creation.succeeded: increment: %statsd_env%.backend.event.dealfeed-client.deal.creation.succeeded # ... api.call: timing: %statsd_env%.backend.event.dealfeed-client.api.call..
J’adore quand un plan se déroule sans accroc ◎ Docker Toolbox ◎ Docker + windows = Joie ◎ Docker for mac (beta) : plus d’IP pour les containers ◎ Communication dockers (ex. client / API) ◎ Timeout gitlab-ci ◎ Capistrano (FPM + symlink) ◎ Full disk jenkins (ou gitlab) ◎ Faux positifs gitlab-ci ◎ Lenteur pour créer un environnement à la volée ◎ Dépassement de quota dans sentry ◎ Monitoring qui freeze ◎ Encore trop de manuel pendant les déploiements