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

Industrialisation et automatisation chez M6Web Lille

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. Industrialisation des
    développements
    Be lazy, automate.
    Pierre Marichez Renaud Bougré

    View Slide

  2. Nos sites
    Nos services

    View Slide

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

    View Slide

  4. É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

    View Slide

  5. É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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  10. GitLab-ci : pourquoi faire ?
    Après un push, déclenchement de pipelines :
    ◎ Contrôles qualité
    ◎ Tests
    ◎ Création de MR auto

    View Slide

  11. Job
    KO
    Vue
    projet
    Job
    OK

    View Slide

  12. Vue
    job

    View Slide

  13. View Slide

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

    View Slide

  15. ◎ 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

    View Slide

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

    View Slide

  17. GitLab-ci … et plus encore
    ◎ Environnements pour les déploiements
    ◎ Repository docker privé
    ◎ Résolution des conflits
    ◎ … des nouveautés très fréquentes !

    View Slide

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

    View Slide

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

    View Slide

  20. Le métier La technique
    (*visuel non contractuel)

    View Slide

  21. Utilisation de Jenkins (pour de vrai)
    Sonar
    Jenkins
    Sentry
    Grafana
    Slack
    Target
    Process
    Mail
    release
    note
    Change
    Log
    Capistrano
    Dashboard
    métier

    View Slide

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

    View Slide

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

    View Slide

  24. Boîte à outils
    ◎ Slack
    ◎ versions.oxygem.it
    ◎ versions.radins.com
    ◎ User script versions
    ◎ TargetProcess
    ◎ Jenkins
    ◎ Grafana
    ◎ Ad Charts
    ◎ Kibana
    ◎ Sonar
    ◎ Sentry

    View Slide

  25. Slack

    View Slide

  26. Bash script

    View Slide

  27. Dashboard métier

    View Slide

  28. User script

    View Slide

  29. TargetProcess .... au début

    View Slide

  30. TargetProcess .... aujourd’hui

    View Slide

  31. Jenkins

    View Slide

  32. Grafana

    View Slide

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

    View Slide

  34. Kibana

    View Slide

  35. Sonar

    View Slide

  36. Sentry

    View Slide

  37. 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 :

    View Slide

  38. Ad charts

    View Slide

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

    View Slide

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

    View Slide

  41. Merci !
    DES
    QUESTIONS ?

    View Slide