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

Industrialisation et automatisation chez M6Web ...

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).

Renaud Orienté Objet

October 27, 2016
Tweet

Other Decks in Programming

Transcript

  1. 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
  2. Écosystème 2015 Projets Radins Radins bon plan Météo Météo mobile

    Radins mobile Fourchette Croqkilos Devs capable de déployer 2 3 2 0 2 1 3 Techno php maison SF2 php maison bis jquery mobile Angular 1 / ionic drupal 7 php 5.6 SF2 Env de dev distant vagrant distant distant distant vagrant Livraison delivery git pull capistrano + intervention manuelle git pull git pull git pull git pull capistrano Livraison prod rsync capistrano git pull git pull git pull drush rsync capistrano
  3. É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
  4. 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
  5. 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
  6. 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
  7. Workflow de développement - Feature git clone [email protected] : radins.git

    feature/US_346-cashback Code Tests unitaires Tests fonctionnels Git pull rebase origin develop Git push Code review Merge sur develop • Q/A (sniff, etc…) • Tests unitaires • Tests fonctionnels Build gitlab-ci Création merge request auto Déploiement automatique sur staging
  8. GitLab-ci : pourquoi faire ? Après un push, déclenchement de

    pipelines : ◎ Contrôles qualité ◎ Tests ◎ Création de MR auto
  9. 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
  10. ◎ filtres “only” / “except”, “when” (“on_failure”, “on_success”) ◎ “before_script”

    (commun aux jobs) ◎ cache ◎ artefacts ◎ syntaxe avancée YAML ◎ jobs “cachés” pour factoriser la conf merge_auto: stage: deploy when: on_success only: - /^feature\/.*$/ - /^hotfix\/.*$/ script: - curl http://XXXXXXXX cache: key: "$CI_BUILD_REF_NAME/$CI_BUILD_STAGE" untracked: true paths: - vendor/ test-php56-behat: stage: test image: m6web/php56-apache-symfony services: *full_stack_services artifacts: paths: - app/logs/ script: - *composer_script - ... .composer: script: - &composer_script | composer config -g github-oauth.github.com $GITHUB_TOKEN -q composer self-update -q composer install --no-interaction -q GitLab-ci
  11. Variables d’environnement … ◎ … propres au build en cours

    ◎ … définies par projet cache: key: "$CI_BUILD_REF_NAME/$CI_BUILD_STAGE" untracked: true paths: - vendor/ .composer: script: - &composer_script | composer config -g github-oauth.github.com $GITHUB_TOKEN -q composer self-update -q composer install --no-interaction -q GitLab-ci
  12. GitLab-ci … et plus encore ◎ Environnements pour les déploiements

    ◎ Repository docker privé ◎ Résolution des conflits ◎ … des nouveautés très fréquentes !
  13. 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
  14. 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
  15. Utilisation de Jenkins (pour de vrai) Sonar Jenkins Sentry Grafana

    Slack Target Process Mail release note Change Log Capistrano Dashboard métier
  16. 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
  17. 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
  18. Boîte à outils ◎ Slack ◎ versions.oxygem.it ◎ versions.radins.com ◎

    User script versions ◎ TargetProcess ◎ Jenkins ◎ Grafana ◎ Ad Charts ◎ Kibana ◎ Sonar ◎ Sentry
  19. 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.<method>.<endpoint>
  20. Sentry côté code require_once '/path/to/Raven/library/Raven/Autoloader.php' ; Raven_Autoloader ::register(); $client =

    new Raven_Client('https://*****@sentry.io/12345' ); PHP standard : $ composer require sentry/sentry Symfony : $ composer require sentry/sentry-symfony sentry: dsn: "https://*****@sentry.io/12345" + Activer le bundle dans le AppKernel + app/config/config.yml :
  21. 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
  22. Liens utiles ◎ Doc runners gitlab-ci http://docs.gitlab.com/ce/ci/runners/README.html ◎ Doc fichier

    de conf gitlab-ci http://docs.gitlab.com/ce/ci/yaml/README.html ◎ Lancer un build gitlab-ci en local https://gitlab.com/gitlab-org/gitlab-ci-multi-runner ◎ Client Sentry PHP https://docs.sentry.io/clients/php/ ◎ PacketBeat https://www.elastic.co/fr/products/beats/packetbeat ◎ Github https://github.com/M6Web ◎ Docker hub M6 https://hub.docker.com/r/m6web/ ◎ Licornes http://www.cornify.com/ www.odiso.com www.mindbaz.com tech.m6web.fr