Difference between revisions of "Continuous Deliver"

From air
Jump to navigation Jump to search
 
(61 intermediate revisions by 2 users not shown)
Line 1: Line 1:
Avant de parler du continous delivery, il est important dans un premier temps de rappeler l’intégration continue :
 
   
== Le Continuous Delivery : Pourquoi ? ==
 
   
  +
== Le Continous Delivery : Click and Deploy ==
“Quand ça fait mal, il faut le faire souvent (if it hurts, do it more often)”
 
  +
'''En combien de temps votre entreprise peut-elle déployer une application dans laquelle une seule ligne de code a été modifiée?'''
   
Il est effectivement important de souligner que la construction du livrable et son déploiement, même quand cela est fait automatiquement, sont des moments chargés “d’émotions” et lourd de sens. Il est même courant d’espacer au maximum ces livraisons afin d’atténuer la souffrance. On est alors en droit de se demander : A-t-on vraiment besoin de souffrir ? Comment gérer ces prises de risque afin de les supprimer ?
 
   
  +
Cette problématique répond à l’utilité du concept du Continous Delivery (C.D).
Livrer aussi souvent que possible, livrer du matin au soir, que chaque commit soit immédiatement mis en production est le but ultime. Plus vous livrez, plus vos packages seront petits et les risques amoindris. Plus vous livrez et plus votre rigueur sera grande, car il n’est plus question de réaliser certaines tâches “plus tard” ou de laisser des choses à faire qu’on oublie parfois et qui rendent les phases de livraisons plus complexes que prévues.
 
  +
Le C.D est un ensemble de technique permettant que pour chaque modification du code, d’effectuer un ensemble de tests automatisé, pour que le code que soit prêt à être déployé directement à l'équipe de production.
  +
Si pour chaque commit le code :
  +
*Compilé, testé, déployé sur un environnement d’intégration = Continuous Integration
  +
*Compilé, testé, livré à l’équipe suivante (Tests, Qualification, Mise En Production, Ops) = Continuous Delivery
   
Alors vous vous dites peut être oui, mais… Si je n’ai pas envie de livrer cette fonctionnalité ?
 
Ma réponse : Vous n’avez pas envie de livrer cette fonctionnalité ou vous n’avez pas envie de l’activer ?
 
   
Une des approches est de découpler la livraison de l’activation. On parle du pattern toggle feature pattern. La fonctionnalité est présente dans le logiciel qui est mis en production mais elle n’est pas disponible, ni utilisable. L’activation de la fonctionnalité est rendu paramétrable dans la configuration du logiciel. Bien évidemment cette approche a aussi ses défauts et donne lieu à du refactoring régulier afin d’enlever le code conditionnel une fois que la fonctionnalité est validée et utilisée. Le toggle feature permet aussi d’être au plus près du besoin métier : activer une feature à la demande. Cela permet par exemple de gérer au niveau du produit une activation de service plutôt que de porter cette complexité au niveau d’une organisation / coordination d’équipe et des plannings éventuels. Aussi vite que ce besoin n’est plus exprimé par le métier, le code d’activation/désactivation est supprimé, permettant de rester en adéquation avec le besoin fonctionnel.
 
   
== Le continuous delivery : Comment ? ==
 
   
  +
[[File:Fonctionnement_Deploiement.png]]
===Etat des lieux et définition du pipeline de votre projet===
 
   
Une première étape lorsque vous voulez mettre en place le Continuous Delivery dans votre projet/entreprise est de faire un état des lieux de votre Pipeline (constitué par toutes les étapes à partir du besoin jusqu’à la mise en production) et d’estimer le temps passé lors de chaque étape. Il n’est pas question de faire un bing-bang : il faut faire évoluer étape par étape adressant les goulots d’étranglement les uns après les autres et savoir s’adapter au contexte de votre projet/entreprise.
 
   
  +
Ainsi le C.D est une évolution de l’intégration Continue. Comme nous l'avons vu en Génie Logiciel, l’intégration continue consiste à vérifier automatiquement et à chaque modification de code source que le résultat des modifications ne produit pas de régression. C'est à dire que si votre commit produit des erreurs sur les résultats, celui-ci ne va pas être accepté. (T'as le droit de tout péter, mais t'es obligé d'être au courant). L’intégration Continue permet de détectés rapidement les problèmes d’intégration et de les corrigés au fur et à mesure. Aussi grâce au test automatisés mis en place permette de d'identifier les changements problématique. Enfin de connaître et obtenir rapidement la dernière version stable de l'application
   
[[File:Pipeline.png]]
 
   
Une fois que vous avez identifié les différentes briques de votre Pipeline, vous pourrez identifier quelles sont les étapes qui prennent le plus de temps, celles qui sont les plus douloureuses ou celles qui sont le plus obscures. Posez vous la question de ce qui est possible d’améliorer. Pour cela, identifiez les pratiques automatisées et les pratiques manuelles ainsi que ce qui empêche l’automatisation. Quelles sont les étapes qui vous demande le plus de temps. Quelles sont les étapes qui sont entièrement sous votre contrôle et celles qui sont dépendantes de décisions ou d’actions externes à votre projet.
 
   
De cet état des lieux, vous pourrez investiguer sur les causes de vos maux afin de les adresser. Vous vous rendrez probablement compte que certaines étapes sont très consommatrices de temps (en charge ou en délais) sans forcément donner un retour sur investissement.
 
   
   
  +
Un petit rappel concernant l’intégration continue:
===Automate all the things – Il faut tout automatiser===
 
  +
*Le code source soit partagé (en utilisant des logiciels de gestion de versions tels que CVS, Subversion, git, Mercurial, etc)
Si vous vous posez la question de savoir qu’elle démarche appliquer la réponse est simple :
 
  +
* les développeurs commit quotidiennement (au moins une fois par jour) leurs modifications
   
  +
Pour ce faire, il nécessite de contrôler plusieurs points:
[[File:Automation.png]]
 
  +
*Contrôler l'intégrité de l'application a chaque commit
  +
*S'assurer de l'absence de régressions
  +
*Mesurer la couverture du code
  +
*Surveiller le respect des conventions de codage
  +
*Signaler les erreurs de codage
   
En effet, le continuous delivery prends tout son sens lorsque toutes les étapes du pipeline sont entièrement automatisées. Ainsi, lorsque toutes les étapes sont automatisées, le temps entre la première étape et la dernière étape peut être connu et garanti ( on n’est pas obligé d’attendre qu’une personne bien précise soit disponible pour pouvoir faire la livraison, chaque étape est rejouable à loisir et son temps d’exécution est mesuré et historisé).
 
Il faut par ailleurs garder à l’esprit que, bien que toutes les étapes soient automatisées (c’est-à-dire qu’aucune intervention manuelle n’est nécessaire pour réaliser une étape du pipeline), il peut arriver que le déclenchement d’une ou plusieurs étapes soit faite manuellement du fait de contraintes fortes externe au projet ( validation par une entité externe à l’entreprise par exemple). Même si c’est le genre de cas qu’on cherchera particulièrement à éviter.
 
   
  +
Un exemple d'outils permettant l’intégration continue est Jenkins, souvent utilisé dans les projets Java développés avec maven, Jenkins est un serveur d’intégration qui s'interface avec des systèmes de gestion de versions tels que CVS, Git et Subversion, et exécute des projets basés sur Apache Ant, Maven...
Les commandements de l’automatisation
 
  +
Jenkins fonctionne avec l'utilisation de Job, on peut configurer des jobs pour que celui-ci par exemple exécute un script à chaque commit ou bien permet de vérifier le bon fonctionnement du code.
Tu automatiseras tout, absolument tout :
 
  +
Une fois le job configuré, Jenkins permet d'obtenir des courbes de tests, d'analyse statique du code, un historique des productions effectuées. Et le tout de manière claire et simple:
   
*Tu n’installeras pas manuellement tes dépendances ;
 
*Tu automatiseras ta build ;
 
*Tu automatiseras tes tests ;
 
*Tu ne configureras pas à la main;
 
*Tu ne créeras plus de machine à la main ;
 
*Tu n’interviendras pas pour livrer ;
 
*Des métriques tu auras, tes machines tu monitoreras ;
 
   
  +
[[File:Hudson-job-main-page.png]]
Vous l’aurez compris, pour la mise en place du Continuous Delivery, il faut que tout soit automatisé et répétable. Ainsi, il faut adresser l’environnement de production (sa construction) dès le départ. De fait, dès la mise en place de l’intégration continue, il faut faire en sorte que l’environnement dans lequel se font les différents tests (unitaires, intégration, performance,…) soient fait dans un environnement identique, sinon le plus semblable possible à l’environnement de production, de façon à se rendre compte le plus tôt possible des problèmes potentiels liés à l’environnement.
 
   
  +
Un build représente sur Jenkis la creation d'un Job. Maintenant revenant au Continous Delivery, celui-ci est simplement:
Un pattern répandu qui peut être mis en place est l’Infrastructure As Code où l’environnement est mis en place grâce à des scripts de configuration. Pour cela on utilisera des outils permettant de simplifier ce travail (Puppet, Chef, Vagrant, Docker, …).
 
   
Donc plus rien ne doit rester une tâche manuelle, et tous les artefacts permettant la mise en production doivent ainsi être archivés dans le contrôleur de code source : les scripts de mise à jour de la base de donnée, la configuration des environnements, les scripts de déploiement, …
 
Le Continuous Delivery, c’est aussi un rythme
 
   
  +
[[File:Automate.png]]'''Le Continuous Delivery = C.I + des automates de test entièrement automatisé'''
== Quel rythme pour le continuous delivery ? Quel changement implique-t-il ? ==
 
   
  +
En effet, le but est d'automatiser l'ensemble des dépendances, des build, des test...
Une des interrogations des plus intéressantes qui nous pousse à avoir cette démarche, est de nous interroger, sur la valeur à donner à des fonctionnalités développées mais non encore mise en production. La réponse, brutale et non moins réalise, est : aucune.
 
   
  +
*Les tests de type "White-box". Ces tests vérifie la structure interne de l'application(code). Il s'agit de tester les implémentations.( donc on vérifie la compétence du programmeur)
Un des travers que nous pouvons rencontrer encore maintenant sur les projets, est de voir les fonctionnalités s’accumuler.
 
  +
*logiciel: Fitnesse, Greenpepper, etc.
   
  +
*Les tests de type "Black-box". Ces tests vérifie eu la structure externe de l'application, on testera donc uniquement les entrées-sorties de l'application, et sa stabilité.
Toute cette perte de temps est causée parfois par le focus mis sur le développement de nouvelles fonctionnalités sans se soucier de leur livraison… Cette perte de temps est un travers fréquent lors de l’utilisation de la méthode Scrum où la vélocité est calculé par la capacité de l’équipe à produire du code et non pas de la valeur.
 
  +
*Logiciel: Gatling, OpenSTA, etc.
   
  +
L’automatisation des tests peut sembler assez coûteuse car assez complexe à mettre en place. Mais lorsque ceux-ci sont exécutés plusieurs fois par jour (Certain test peuvent être lancé 1 millions de fois par jour), l'investissement est vite amortie
Nous pourrions proposer un nouveau principe : rendre votre produit déployable plutôt que livrer de nouvelle fonctionnalités puisque toute fonctionnalité non livrée n’amène pas de valeur.
 
  +
  +
== But du Continuous Delivery ==
  +
En plus de tous les avantages de l’intégration Continue une des premières utilité du C.D est de réduire ce qu'on appel le" time to market.". De nos jours, de nombreuse applications ont besoin de se mettre rapidement à jour pour suivre les besoins des utilisateus. Par exemple un site de commerce à besoin de rapidement suivre les nouveautés ou de rajouter de nouvelles fonctionnalités. Le C.D permet de faire de faire ces déploiements rapides et sans sans risque. Le site Etsy (site de commerce en ligne), a investi énormément dans ses tests automatisés et ses outils de déploiement et effectue plus de 25 déploiements par jour. Facebook, très agressif sur l’automatisation des tests, effectue 2 déploiements par jour.
  +
  +
Ensuite comme le C.D permet des cycles rapides, grâce à des déploiements rapides et peu risqués on peut envisager des mises à jour fréquentes des applications installées.
  +
  +
[[File:ContinuousDelivery-Fig-2.png]]
  +
  +
Aussi, on peut voir dans cette courbe issue du site http://www.slideshare.net/jallspaw/ops-metametrics-the-currency-you-pay-for-change-4608108, que plus les déploiements sont fréquent (donc les modifications sont moins important), plus le Time To Repair est important. Ainsi avec le C.D le TTR est réduit et donc un grand gain de temps pour l'entreprise.
  +
  +
== Exemple Avec circleci et HEROKU ==
  +
  +
  +
Nous allons dans créer une application dans laquelle nous allons faire un peu d’intégration continue. Pour se faire nous alors utilisé Heroku qui permet de stocker notre application sur le cloud (Heroku est un service de cloud computing de type plate-forme en tant que service). CircleCi permet quand à lui d’effectuer des jobs de test, ou de cherchée les dépendances des fichiers.
  +
  +
Pour ce faire, prenons les fichiers contenue dans le Tutorial d’exemple d'Heroku https://devcenter.heroku.com/articles/getting-started-with-python#introduction. Notre applis consiste simplement à afficher des mots à l'écran.:
  +
from flask import Flask
  +
app = Flask(__name__)
  +
@app.route("/")
  +
def hello():
  +
return "Hello World, I love continuous delivery a lot!"
  +
if __name__ == "__main__":
  +
app.run()
  +
  +
Lorsqu'on nous avons finis de configurer notre application Heroku, nous allons maintenant crée un test unitaire simple qui consiste à vérifier si hello est compris dans la phrase.
  +
  +
import unittest
  +
from .hello_app import app
  +
class HelloTest(unittest.TestCase):
  +
def setUp(self):
  +
self.app = app.test_client()
  +
def test_root(self):
  +
assert 'Hello' in self.app.get('/').data
  +
  +
Maintenant, modifiant la phrase mais gardant le mot hello dans la phrase :
  +
[[File:Demo_1.PNG]]
  +
  +
Lors du commit, un build est lancé automatiquement sur Circleci:
  +
  +
[[File:Demo_2.PNG]]
  +
  +
  +
  +
Quelques minutes plus tard:
  +
  +
  +
  +
[[File:Demo 3.PNG]]
  +
  +
On peut voir que le build à été un succès, et ainsi notre application stockée sur Heroku à été mise à jour. Pour vérifier on lance la commande:
  +
heroku open
  +
[[File:Data 6.PNG]]
  +
  +
Maintenant modifiant la phrase de tel maniéré à ce que "Hello" n’apparaisse plus et donc que le test ne fonctionne plus:
  +
[[File:Data 9.PNG]]
  +
  +
  +
  +
Resultat: lorsque l'on commit le code, le build à échoué à cause de l’exécution du test:
  +
[[File:Data_10.PNG]]
  +
  +
Et lorsqu'on lance l'application heroku:
  +
  +
On remarque qu'il n'y a eu aucun changement, tant que le build n'est pas correct, aucune modification de l'application n'est effectué.
  +
[[File:Data 12.PNG]]
   
 
== Voir aussi ==
 
== Voir aussi ==
Line 78: Line 136:
 
* [http://www.jetbrains.com/teamcity/index.html TeamCity]
 
* [http://www.jetbrains.com/teamcity/index.html TeamCity]
 
* [https://travis-ci.org/ Travis CI] propose un service d'intégration continue gratuit aux projets open sources.
 
* [https://travis-ci.org/ Travis CI] propose un service d'intégration continue gratuit aux projets open sources.
  +
  +
== Source Image==
  +
  +
* http://blog.octo.com/devops-de-lintegration-continue-au-deploiement-continu/
  +
* http://igm.univ-mlv.fr/~dr/XPOSE2010/Lecharpentier_Jenkins/images/hudson-job-main-page.png

Latest revision as of 18:28, 5 February 2015


Le Continous Delivery : Click and Deploy

En combien de temps votre entreprise peut-elle déployer une application dans laquelle une seule ligne de code a été modifiée?


Cette problématique répond à l’utilité du concept du Continous Delivery (C.D). Le C.D est un ensemble de technique permettant que pour chaque modification du code, d’effectuer un ensemble de tests automatisé, pour que le code que soit prêt à être déployé directement à l'équipe de production. Si pour chaque commit le code :

  • Compilé, testé, déployé sur un environnement d’intégration = Continuous Integration
  • Compilé, testé, livré à l’équipe suivante (Tests, Qualification, Mise En Production, Ops) = Continuous Delivery



Fonctionnement Deploiement.png


Ainsi le C.D est une évolution de l’intégration Continue. Comme nous l'avons vu en Génie Logiciel, l’intégration continue consiste à vérifier automatiquement et à chaque modification de code source que le résultat des modifications ne produit pas de régression. C'est à dire que si votre commit produit des erreurs sur les résultats, celui-ci ne va pas être accepté. (T'as le droit de tout péter, mais t'es obligé d'être au courant). L’intégration Continue permet de détectés rapidement les problèmes d’intégration et de les corrigés au fur et à mesure. Aussi grâce au test automatisés mis en place permette de d'identifier les changements problématique. Enfin de connaître et obtenir rapidement la dernière version stable de l'application



Un petit rappel concernant l’intégration continue:

  • Le code source soit partagé (en utilisant des logiciels de gestion de versions tels que CVS, Subversion, git, Mercurial, etc)
  • les développeurs commit quotidiennement (au moins une fois par jour) leurs modifications

Pour ce faire, il nécessite de contrôler plusieurs points:

  • Contrôler l'intégrité de l'application a chaque commit
  • S'assurer de l'absence de régressions
  • Mesurer la couverture du code
  • Surveiller le respect des conventions de codage
  • Signaler les erreurs de codage


Un exemple d'outils permettant l’intégration continue est Jenkins, souvent utilisé dans les projets Java développés avec maven, Jenkins est un serveur d’intégration qui s'interface avec des systèmes de gestion de versions tels que CVS, Git et Subversion, et exécute des projets basés sur Apache Ant, Maven... Jenkins fonctionne avec l'utilisation de Job, on peut configurer des jobs pour que celui-ci par exemple exécute un script à chaque commit ou bien permet de vérifier le bon fonctionnement du code. Une fois le job configuré, Jenkins permet d'obtenir des courbes de tests, d'analyse statique du code, un historique des productions effectuées. Et le tout de manière claire et simple:


Hudson-job-main-page.png

Un build représente sur Jenkis la creation d'un Job. Maintenant revenant au Continous Delivery, celui-ci est simplement:


Automate.pngLe Continuous Delivery = C.I + des automates de test entièrement automatisé

En effet, le but est d'automatiser l'ensemble des dépendances, des build, des test...

  • Les tests de type "White-box". Ces tests vérifie la structure interne de l'application(code). Il s'agit de tester les implémentations.( donc on vérifie la compétence du programmeur)
  • logiciel: Fitnesse, Greenpepper, etc.
  • Les tests de type "Black-box". Ces tests vérifie eu la structure externe de l'application, on testera donc uniquement les entrées-sorties de l'application, et sa stabilité.
  • Logiciel: Gatling, OpenSTA, etc.

L’automatisation des tests peut sembler assez coûteuse car assez complexe à mettre en place. Mais lorsque ceux-ci sont exécutés plusieurs fois par jour (Certain test peuvent être lancé 1 millions de fois par jour), l'investissement est vite amortie

But du Continuous Delivery

En plus de tous les avantages de l’intégration Continue une des premières utilité du C.D est de réduire ce qu'on appel le" time to market.". De nos jours, de nombreuse applications ont besoin de se mettre rapidement à jour pour suivre les besoins des utilisateus. Par exemple un site de commerce à besoin de rapidement suivre les nouveautés ou de rajouter de nouvelles fonctionnalités. Le C.D permet de faire de faire ces déploiements rapides et sans sans risque. Le site Etsy (site de commerce en ligne), a investi énormément dans ses tests automatisés et ses outils de déploiement et effectue plus de 25 déploiements par jour. Facebook, très agressif sur l’automatisation des tests, effectue 2 déploiements par jour.

Ensuite comme le C.D permet des cycles rapides, grâce à des déploiements rapides et peu risqués on peut envisager des mises à jour fréquentes des applications installées.

ContinuousDelivery-Fig-2.png

Aussi, on peut voir dans cette courbe issue du site http://www.slideshare.net/jallspaw/ops-metametrics-the-currency-you-pay-for-change-4608108, que plus les déploiements sont fréquent (donc les modifications sont moins important), plus le Time To Repair est important. Ainsi avec le C.D le TTR est réduit et donc un grand gain de temps pour l'entreprise.

Exemple Avec circleci et HEROKU

Nous allons dans créer une application dans laquelle nous allons faire un peu d’intégration continue. Pour se faire nous alors utilisé Heroku qui permet de stocker notre application sur le cloud (Heroku est un service de cloud computing de type plate-forme en tant que service). CircleCi permet quand à lui d’effectuer des jobs de test, ou de cherchée les dépendances des fichiers.

Pour ce faire, prenons les fichiers contenue dans le Tutorial d’exemple d'Heroku https://devcenter.heroku.com/articles/getting-started-with-python#introduction. Notre applis consiste simplement à afficher des mots à l'écran.:

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
   return "Hello World, I love continuous delivery a lot!"
if __name__ == "__main__":
    app.run()

Lorsqu'on nous avons finis de configurer notre application Heroku, nous allons maintenant crée un test unitaire simple qui consiste à vérifier si hello est compris dans la phrase.

import unittest
from .hello_app import app
class HelloTest(unittest.TestCase):
def setUp(self):
   self.app = app.test_client()
def test_root(self): 
   assert 'Hello' in self.app.get('/').data

Maintenant, modifiant la phrase mais gardant le mot hello dans la phrase : Demo 1.PNG

Lors du commit, un build est lancé automatiquement sur Circleci:

Demo 2.PNG


Quelques minutes plus tard:


Demo 3.PNG

On peut voir que le build à été un succès, et ainsi notre application stockée sur Heroku à été mise à jour. Pour vérifier on lance la commande:

heroku open

Data 6.PNG

Maintenant modifiant la phrase de tel maniéré à ce que "Hello" n’apparaisse plus et donc que le test ne fonctionne plus: Data 9.PNG


Resultat: lorsque l'on commit le code, le build à échoué à cause de l’exécution du test: Data 10.PNG

Et lorsqu'on lance l'application heroku:

On remarque qu'il n'y a eu aucun changement, tant que le build n'est pas correct, aucune modification de l'application n'est effectué. Data 12.PNG

Voir aussi

Liens externes

Source Image