Continuous Delivery chez LesFurets -- Deep dive Dec 2015

561 vues

Publié le

Support d'une présentation de 2h faite au Nantes JUG décrivant d'un haut niveau jusqu'au détail de gestion de la code base pour notre organisation du Daily Delivery.

La vidéo est ici : https://www.youtube.com/watch?v=V37UJ7_V22s (début à 4:30).

Bonne lecture, et surtout faites nous des retours.

Publié dans : Ingénierie
0 commentaire
0 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Aucun téléchargement
Vues
Nombre de vues
561
Sur SlideShare
0
Issues des intégrations
0
Intégrations
10
Actions
Partages
0
Téléchargements
7
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Continuous Delivery chez LesFurets -- Deep dive Dec 2015

  1. 1. Livrer chaque jour ce qui est prêt
 Continuous Delivery & Continuous Merge
  2. 2. Contexte
  3. 3. @BeastieFurets#LesFuretsContinuous 1er site indépendant de comparaison d’assurance : • Lancé en 2012 • 2,5M de devis par an • 31% du marché de la comparaison de contrats auto
  4. 4. @BeastieFurets#LesFuretsContinuous 4
  5. 5. @BeastieFurets#LesFuretsContinuous Application • 6 produits : • Java (tomcat) & GWT (client) • 400k LOC & 40k tests unitaires • 200 tests Selenium • 22 Devs & Tech Leads, 2 Ops, 2 Managers
  6. 6. Livrer plus souvent
  7. 7. @BeastieFurets#LesFuretsContinuous Rythme 2012 - Mensuel 12 releases L’esprit : planifier / estimer / coder / tester / liver de manière mensuelle Sprints
  8. 8. @BeastieFurets#LesFuretsContinuous L’ancienne organisation en SCRUM classique : • Sprints d’un mois, Planification au mois, Recette 1 semaine • Build : 15 minutes • 200 Seleniums : 1 heure • Blocages : Build + Selenium + Recette Rythme 2012 - Mensuel
  9. 9. @BeastieFurets#LesFuretsContinuous Rythme 2013 - Mois + Sem 45 releases L’esprit : planifier / estimer / coder / tester liver de manière mensuelle Sprints + Bonus Déploiement chaque semaine (cherry-pick)
  10. 10. @BeastieFurets#LesFuretsContinuous • Livraison mensuelle + cherry-pick chaque semaine en bonus • Améliorations: • Build : 3 minutes (contre 15 minutes) • Blocages: • Selenium + Recette Rythme 2013 - Mois + Sem
  11. 11. @BeastieFurets#LesFuretsContinuous Rythme 2014/15 - Quotidien 208 releases en 2014 (déjà 150 en 2015) L’esprit : livrer ce qui est prêt aujourd’hui … tous les jours ! Marathon
  12. 12. @BeastieFurets#LesFuretsContinuous • Livraison mensuelle + cherry-pick chaque semaine en bonus • Améliorations: • Selenium : 10 minutes + Zeno (regressions graphiques) • Blocages: • Temps de release (2-3h par 1 dev) • Risque par release (15d / release en moyenne) Rythme 2014/15 - Jour
  13. 13. @BeastieFurets#LesFuretsContinuous 0" 20" 40" 60" 80" 100" 120" 140" 160" 10" 20" 30" 40" 50" 60" 70" 80" 90" 100" 250" 500" 1000" 5000" 5000" Histogramme"du"nombre"de"modifica<on"des"releases" Releases & Modifications 13 Par Release >150 lignes 5 - 6 Tickets 2h de travail Objectif: 100 lignes 10min
  14. 14. @BeastieFurets#LesFuretsContinuous Objectif 2016 - Par feature 500+ releases en 2016 (déjà 150 en 2015) L’esprit : livrer ce qui est prêt aujourd’hui … par fonctionnalité ! Marathon
  15. 15. @BeastieFurets#LesFuretsContinuous Time To Market • 2012 : ➡ Début dev à la MEP : Temps dev + 2 semaines ➡ Non satisfaisant pour le business • 2014 : ➡ Début dev à la MEP : Temps dev + 2 jours ➡ Quand c’est prêt
  16. 16. @BeastieFurets#LesFuretsContinuous Vue du métier : 2012 • Mindset “Itération” : ➡ Focalisé sur la date de livraison de l’ensemble ➡ Tendance naturelle à charger • Mauvaises Surprises : ➡ Pas dans la release = Au min 1 itération d’attente ➡ Demande de livraisons séparées (pour voir l’impact !)
  17. 17. @BeastieFurets#LesFuretsContinuous • Mindset “Quand c’est prêt” : ➡ Petit = vite ➡ Tendance naturelle à alléger • Bonnes Surprises : ➡ Demande de livraisons séparées (pour voir l’impact !) ➡ MVP devient naturel pour décider des gros projets ➡ Pas dans la release = au min +1 jour Vue du métier : 2014+
  18. 18. Livraison Continue – Jours / Heures
  19. 19. Points de repère
  20. 20. @BeastieFurets#LesFuretsContinuous Manifeste agile Principe #1 « Notre plus haute priorité est de satisfaire le client en livrant rapidement et régulièrement des fonctionnalités à grande valeur ajoutée. » http://agilemanifesto.org/iso/fr/principles.html
  21. 21. @BeastieFurets#LesFuretsContinuous Livrer tôt, livrer souvent http://paulhammant.com/2013/03/13/facebook-tbd-take-2/
  22. 22. @BeastieFurets#LesFuretsContinuous Continuous Delivery 1. Build rapide 2. Build robuste 3. Déploiements simples et automatisés 4. Monitoring de production et alertes 5. Analyse des causes racines
  23. 23. @BeastieFurets#LesFuretsContinuous Git / Git Flow / Github Flow Git: Un puissant modèle de branches http://nvie.com/posts/a-successful-git-branching-model/ Master Branch Pull Request Github
  24. 24. Points clés : de la conception à l’exploitation
  25. 25. @BeastieFurets#LesFuretsContinuous Améliorer par la fin 5. Monitoring & Exploitation 4. Mise En Production 3. Release Création &Validation 2. Développement 1. Conception
  26. 26. 1. Conception
  27. 27. @BeastieFurets#LesFuretsContinuous Flux de fonctionnalités • #1 Fonctionnalités conçues pour être indépendantes • Livrable dès que c’est prêt • Découplage des fonctionnalités • Si dépendant alors attendre ou fusionner • #2 Fast feedback • Petites taches vites en production • Retour chiffré rapide pour prise de décision : stop / cont.
  28. 28. Organisation Prioritisation Resource Allocation Team Team Team Strategic program initiatives 5% RUN 35% BAU / QUAL 60% BUILD
  29. 29. @BeastieFurets#LesFuretsContinuous Flow from Portfolio 29
  30. 30. 2. Développement
  31. 31. @BeastieFurets#LesFuretsContinuous Environnement Dev • Chaque fonctionnalité sur une branche feature dédiée • Code Production (master) + fonctionnalité uniquement • Isolation sur le poste de chaque développeur (+ alias DNS) • Environnements quasi iso Production • Capacité de se focaliser sur ce développement
  32. 32. @BeastieFurets#LesFuretsContinuous Intégration Continue Feature Branching + Intégration Continue
  33. 33. @BeastieFurets#LesFuretsContinuous Intégration Continue L’intégration continue effectue à chaque commit : • Compilation • Tests automatisés • Merge des features branches (Octopus) ➡ On fait du continuous merge avec l’Octopus
  34. 34. @BeastieFurets#LesFuretsContinuous Continuous Merge Octopus • Outil Open Source de merge en continu • Développé en interne chez LesFurets.com : ➡ https://github.com/lesfurets/git-octopus • Il existe une conférence dédiée par Arnaud Pflieger
  35. 35. @BeastieFurets#LesFuretsContinuous Continuous Merge Octopus
  36. 36. @BeastieFurets#LesFuretsContinuous Environnement Stage • Quasi iso environnement de Production • Regroupement de toutes les features en cours (Octopus) • Effets de bord des features • Seleniums sur le regroupement • Suivi des logs plus facile
  37. 37. 3. Release Création & Validation
  38. 38. @BeastieFurets#LesFuretsContinuous Création Release Branche Création entièrement automatisée : • Regroupement des features prêtes (Octopus) • Déploiement sur Pre-Prod (quasi iso Prod) • Validation sur Pre-Prod
  39. 39. @BeastieFurets#LesFuretsContinuous Validation Release Branche Validation à l’aide d’outils manuels et automatiques : • Tests unites et d’intégration • Code review • Validation fonctionnelle (sur env Stage) • Grid Selenium • Non régression UI (Zeno)
  40. 40. @BeastieFurets#LesFuretsContinuous Grid Selenium on LXC • 200 Tests Selenium : 6 heures • Grid Selenium classique : 1heure • Grid Selenium RamFS : 10 minutes • 1 Machine OVH, 128 Go RAM, 300 euros/mois • Détails sur https://github.com/lesfurets/selenium-lxc
  41. 41. @BeastieFurets#LesFuretsContinuous Zeno Pixel • Outil Open Source de comparaison d’images (perceptual diff) • Développé en interne chez LesFurets.com : ➡ https://github.com/lesfurets/zeno-pixel • Il existe une conférence dédiée par Matthieu Fourtina
  42. 42. @BeastieFurets#LesFuretsContinuous Zeno Pixel • Screenshots automatiques des pages du site • Cross-environment (Stage, Pre-Prod, Prod) • Cross-device (Desktop, Mobile,Tablet) • Comparaisons des versions de chaque page • Calcul des différences graphiques
  43. 43. @BeastieFurets#LesFuretsContinuous Zeno Pixel
  44. 44. 4. Mise En Production
  45. 45. @BeastieFurets#LesFuretsContinuous Mise En Production • Réalisée de A à Z par un seul développeur • Automatisée via Jenkins : ➡ Création de la Release Branche ➡ Déploiement de Release Branche ➡ Merge de la Release Branche dans le master ➡ Création et diffusion de la Release Note
  46. 46. @BeastieFurets#LesFuretsContinuous Infrastructure As Code Toutes les modifications de configuration sont historisées Les bugs de configuration sont des bugs de code
  47. 47. @BeastieFurets#LesFuretsContinuous Déploiement Tout le déploiement est fait avec 0 downtime en utilisant un système Blue / Green
  48. 48. @BeastieFurets#LesFuretsContinuous Git Flow Résumé 48
  49. 49. 5. Monitoring & Exploitation
  50. 50. @BeastieFurets#LesFuretsContinuous Monitoring technique Sondes Datadog - Indicateurs techniques
  51. 51. @BeastieFurets#LesFuretsContinuous Monitoring fonctionnel Sondes Zabbix - Indicateurs fonctionnels
  52. 52. @BeastieFurets#LesFuretsContinuous Alertes & Logs Chaque logs/traces d'erreurs arrivent par mail depuis de chaque environnement : • 200-1000 erreurs / jour, dont 20% depuis le JS • 1h synthétisée = 1 mail • 24h synthétisées = 1 mail
  53. 53. @BeastieFurets#LesFuretsContinuous Post Mortem • Work in progress • Post Mortem sur chaque incident de Production • Analyse de la cause profonde • Suivi de résolution de la cause • Actuellement 5-10 incidents mineurs par mois, ~1 major
  54. 54. Git Octopus en détails
  55. 55. @YourTwitterHandle@YourTwitterHandle@beastiefuretsgithub.com/lesfurets/git-octopus Le Continuous Merge Merge automatique !
  56. 56. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2
  57. 57. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 merged-features
  58. 58. @YourTwitterHandle@YourTwitterHandle@beastiefuretsgithub.com/lesfurets/git-octopus n’existe pas !git merge features/* git octopus github.com/lesfurets/git-octopus
  59. 59. @YourTwitterHandle@YourTwitterHandle@beastiefuretsgithub.com/lesfurets/git-octopus Git Octopus How it works ?
  60. 60. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2
  61. 61. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 octopus √
  62. 62. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 octopus √
  63. 63. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 octopus √
  64. 64. @YourTwitterHandle@YourTwitterHandle@beastiefuretsgithub.com/lesfurets/git-octopus Git Octopus What about conflicts ?
  65. 65. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 octopus √
  66. 66. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 octopus features/new √
  67. 67. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 octopus features/new x
  68. 68. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 merge-master features/new √
  69. 69. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 features/new merge-f1 √
  70. 70. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 features/new merge-f2 x
  71. 71. @YourTwitterHandle@YourTwitterHandle@beastiefuretsgithub.com/lesfurets/git-octopus Git Octopus Avoid conflicts ! #1
  72. 72. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 octopus features/new #1
  73. 73. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 features/new* #1
  74. 74. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 octopus features/new* √ #1
  75. 75. @YourTwitterHandle@YourTwitterHandle@beastiefuretsgithub.com/lesfurets/git-octopus Git Octopus Remove Branch #2
  76. 76. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 octopus features/new x #2
  77. 77. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 studies/new #2
  78. 78. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 octopus studies/new √ #2
  79. 79. @YourTwitterHandle@YourTwitterHandle@beastiefuretsgithub.com/lesfurets/git-octopus Git Octopus Merge Branch #3
  80. 80. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 octopus features/new x #3
  81. 81. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 features/new feature/f2_new #3
  82. 82. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 feature/f2_new #3
  83. 83. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 feature/f2_new octopus #3
  84. 84. @YourTwitterHandle@YourTwitterHandle@beastiefuretsgithub.com/lesfurets/git-octopus Git Octopus Rebase branches #4
  85. 85. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 octopus features/new x #4
  86. 86. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 features/new #4
  87. 87. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 octopus features/new √ #4
  88. 88. @YourTwitterHandle@YourTwitterHandle@beastiefuretsgithub.com/lesfurets/git-octopus Git Octopus git conflict #5
  89. 89. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 octopus features/new x #5
  90. 90. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 octopus features/new x conflict/resolutions #5
  91. 91. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 features/new merge-f2 conflict/resolutions #5
  92. 92. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 features/new conflict/resolutions ? merge-f2 x #5
  93. 93. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 features/new conflict/f2_new conflict/resolutions #5
  94. 94. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 features/new conflict/f2_new conflict/resolutions #5
  95. 95. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 features/new merge-f2 conflict/resolutions #5
  96. 96. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 features/new merge-f2 conflict/resolutions √ #5 ?
  97. 97. @beastiefuretsgithub.com/lesfurets/git-octopus master features/f1 features/f2 features/new octopus conflict/resolutions √ #5
  98. 98. @YourTwitterHandle@YourTwitterHandle@beastiefuretsgithub.com/lesfurets/git-octopus Safe Zone: • Eviter le conflit (!) • Git conflict Danger Zone: • Merge des branches (attention) • Sortir de l’IC (le temps que ça sorte) • Rebase l’une sur l’autre Lors des conflits
  99. 99. @YourTwitterHandle@YourTwitterHandle@beastiefuretsgithub.com/lesfurets/git-octopus Demo
  100. 100. @YourTwitterHandle@YourTwitterHandle@beastiefuretsgithub.com/lesfurets/git-octopus Workflow chez LF.com
  101. 101. @beastiefuretsgithub.com/lesfurets/git-octopus ticket1 ticket2 ticket3 ticket4 ticket5 features releaseslocal ticket3 master ticket3 ticket1 master octopus-features octopus-releases Le temps de commiter 1 jour à 1 mois 1 - 2 jours pull requests 0 - 2 jours release
  102. 102. @YourTwitterHandle@YourTwitterHandle@beastiefuretsgithub.com/lesfurets/git-octopus Bonnes pratiques •Proximité des équipes •Développements indépendants •Bonne maitrise de Git •Code sain •MEPs fréquentes
  103. 103. @YourTwitterHandle@YourTwitterHandle@beastiefuretsgithub.com/lesfurets/git-octopus Commencez chez Vous
  104. 104. @YourTwitterHandle@YourTwitterHandle@beastiefuretsgithub.com/lesfurets/git-octopus Utilisation locale •brew install git-octopus (or from sources) •Si vos branches ont un nommage “features/xxx” •On merge uniquement les branches remote entre elles git octopus -n origin/features/* origin/master
  105. 105. @YourTwitterHandle@YourTwitterHandle@beastiefuretsgithub.com/lesfurets/git-octopus Peut-on mieux faire ?
  106. 106. @YourTwitterHandle@YourTwitterHandle@beastiefuretsgithub.com/lesfurets/git-octopus La suite •Feature: Merge Github Pull-requests •Better documentation (please contribute) •LesFurets :Tendre vers 1 Mep / branche
  107. 107. @YourTwitterHandle@YourTwitterHandle@beastiefuretsgithub.com/lesfurets/git-octopus Just Do It Tu releases ton soft au moins une fois par mois ? Le continuous delivery n’est pas loin ! •Dans l’intégration continue (CI & QA) •Un peu plus de devops •Git •Process de validation incrémentale
  108. 108. Quelques Inspirations
  109. 109. @BeastieFurets#LesFuretsContinuous How Google Test Software • Quality Engineering plutôt que 
 Quality Assurance • Création d’outils de test pour les devs • Les devs font la QA eux même
  110. 110. @BeastieFurets#LesFuretsContinuous Kanban : Evolutionary Change • Visualisation du travail • Limiter le travail en cours (WIP) • Règles explicites • Amélioration continue • Leadership
  111. 111. @BeastieFurets#LesFuretsContinuous Product Development Flow • Travailler en flux • Gérer les files d’attentes • Regarder le lead time plutôt que le coût de développement • Réduire le coût de livraison
  112. 112. @BeastieFurets#LesFuretsContinuous How to measure anything • Lié à une décision à prendre • Poser le problème • Beaucoup plus simple qu’on pense 112
  113. 113. @BeastieFurets#LesFuretsContinuous The Phoenix project • How to avoid experts as SPOF • DevOps as Business enabler • Small and motivated teams • Resilience ! 113
  114. 114. Merci !

×