Déploiement et Configuration Transparent d’accueil Cette présentation à pour but de présenter et de proposer des solutions pour résoudre les problèmes liés au déploiement et à la configuration automatique d’application. Cela à la fois dans un monde Unix/Windows, Client lourd/léger, grosse entreprise d’informatique ou petite structure. Déploiement et Configuration Nicolas Capponi, Alain Delafosse et Laurent Tardif By Agile4techos
Qui sommes nous ? Alain Delafosse Laurent TARDIF Nicolas Capponi Consultant Java / Objet Principal contributeur Pack/Conf chez Kelkoo Architecte chez Kelkoo Alain Delafosse Consultant Java Production chez Kelkoo Architecte chez Kelkoo Laurent TARDIF M&T chez Kelkoo Intl! Architecte chez Y! (IC, I18n, Securité) IC chez Agilent Présentons notre équipe. Nous avons travailler sur de grosses applications (kelkoo/yahoo), composées d’appli cation web et/ou de clients lourd avec des webservices, base de données, …. Cela dans un monde hétérogène : Unix (redhat, BSD, fefora, centa OX,) /windows. Sur des applications internationalisables. Dans des organisations agiles ou non, avec des équipes de dev/qa/prod avec ou non des déploiements chez des clients. Cette présentation se base sur des cas réels de nos projets.
Nous allons vous montrer comment La session Rendre une application existante configurable et installable automatiquement ? C’est possible !!! Nous allons vous montrer comment Présenter les pratiques agiles liées au déploiement et à la configuration Il est assez courant de rencontrer les problèmes suivant, nous allons apporter des réponses : Je ne maîtrise pas ma procédure d'installation, J'appréhende chaque déploiement car c'est long et compliqué, Je ne sais pas à quelle version de mon code correspondent mes binaires en production, Je ne sais pas exactement ce que contient mon application, Je ne fais pas valider ma procédure d'installation par la QA... ...et pourtant je dois bien livrer des nouvelles fonctionnalités régulièrement. et l'agilité pousse a livrer régulièrement ...
Notre application : Nokia Test Client lourd Traduction Questions Réponses Configuration Utilisateurs Ressources Client Q/R Client mi-lourd ServiceQ/R Client U ServiceU Rappel de l'appli en disant que c notre trame de la journée Base de données Des librairies métier des web services des clients un client lourd Un client mi-lourd (utilise les WS) Client léger ? (pas sur ) Un client qui a des stats On considère qu'on a une application classique. Le code est de bonne qualité mais déploiement et configuration non automatique. Stockage Statistiques Client S
Le deploiement c’est quoi ? Java Java Java Client lourd Traduction Questions Réponses Configuration Utilisateurs Grizzly : services, admin, conf, … Resources Client Q/R Client mi-lourd ServiceQ/R fichiers Client U ServiceU Mysql : services, conf, data La première fois il faut déployer l’infrastructure : Base de données Configuration Schéma de base de donnée des données Java le container de services (tomcat) Configuration général Configuration de mes services des fichiers de ressources ( traductions , ...) * des données (les questions, .... ) Après et à chaque fois, il faut déployer nos jars , et nos scripts … notre code. Une partie du problème de l’installation et de la perte de connaissance viens du fait de la fréquence de certaines opérations. Stockage Statistiques Client S
DEMONSTRATION Au début Je ne maîtrise pas l'installation incrémentale. Il manque des fichiers ? (ca marche car déjà présent). Je garde des fichiers qui ne servent plus. Je ne maîtrise pas les logiciels (versions) installés. Je ne sais pas ré-installer un nouveau serveur Je mets beaucoup de temps à installer. Si le principal contributeur n'est pas la, comment faire pour installer ? partage de connaissances/compétences DEMO : (le transparent sert de 2eme support ) Objectifs : montrer, lister les problèmes et essayer de faire que les gens se reconnaissent. Je lis la doc d’installation, (que je me suis imprimé), il y a des petites fautes, que je ne corrige pas, c’est pas facile, je me rappel jamais ou il est … Je compile tous les projets (note, c réaliste tant que je n’ai pas trop de projets) Je génère les jars / zip Je copie les jars ou il faut Je met a jour ma doc d’installation avec le nouveau schéma de base de données J’update mon schéma (et je perd mes données …) Je lance mon start all Je clic / clic / clic … Et je vérifie a la main que c’est bon … IDEE : avoir des slides sympa pour chaque étape de la démo ….
Comment aborder le problème Déploiement Automatisation du déploiement Configuration Automatisation de la configuration Déploiement continu C’est le plan On va aborder le problème en deux étapes : Le déploiement Et la configuration Sans oublier que le but final c’est le déploiement continu
Zoom sur le contenu d’un déploiement Des binaires Des dépendances Des ressources (fichiers de traductions, images, etc ...) Des données (questions, réponses, ... ) Des structures de données : schéma de base, xsd , ... Des templates de configuration La logique d'installation Des outils d'administration (crons, start, stop) Des documents (installation, release notes, ...) Automatisons cela en 9 étapes, l’ordre n’est pas anodin Un ensemble de binaires (scripts, exécutable, librairies) Des dépendances systèmes ou logiciels Un ensemble de ressources (fichiers de traductions, images, etc ...) Des données (questions, réponses, ... ) Des structures de données : schéma de base, xsd , ... Des templates de configuration La logique d'installation, de mise à jours, de suppression y compris les dépendances Des outils d'administration les crons / tâches planifiées le start/stop/resume Des documents (installation, release notes, ...)
DEMONSTRATION Déployons notre environnement de développement Pré-requis Le monde extérieur et les serveurs d’artefacts Un environnement configurable, mais standardisé …. Commençons par identifier les dépendances que nous avons : java, mysql, eclipse, … Je commence par automatiser cela. Je commence par quelquechose de simple. Histoire de se faire la main et de rencontrer rapidement la plupart des problèmes. Je liste ce dont j’ai besoin : eclipse, svn, mais aussi unzip, wget, ou autre …. Je recontre rapidement deux problèmes ou questions : J’ai quoi sur le PC au debut : ce de quoi j’ai besoin sur le PC initial pour commencer … svn , wget, …. Je défini donc une condition initiale : PC avec SVN . Une fois que j’ai SVN, je m’aperçois que j’ai besoin de wget / unzip /…. Je les mets donc sous svn. Les applications ? Je les prends sur les site oueb directement … Oula que c’est lent … en plus ca change tout le temps … (ca, je sais, j’ai de l’expérience). Ou est-ce que je stocke mes binaires : svn ? Pas adapté mais ca marche … répertoire partagé ? C vite le souk …. J’ai un outil dédié utilisé par l’équipe de déploiement ? Je m’en sert …… Au passage, ces outils font parti du framework d’installation, je les versionne. Je suis content, ca s’installe pas trop mal, mais pas chez nicolas, ni chez alain …. A, mes développeurs sont pénibles, j’ai un windows XP, 2 seven, laurent qui veut tout mettre sur le D, et pas sur le C … pffuuuu , au moins je permet un minimum de configuration …. En plus , mon application sera plus flexible et portable. Piège : duplication ou version unique ultra complexe ? Il faut faire la part des choses entre ce que j’impose et ce que je permet de rendre flexible DATA : utilisateur, install : admin, sous arbo : nous, conf : utilisateur Illustrer dans notre cas ce que cela veut dire :
DEMONSTRATION Déployons notre application Choix initiaux : mono/multi instance , que configurer ? Le script de déploiement peut échouer correction manuelle, roll-back automatique,… Installation par étape La gestion du down-grade ? La gestion de version des données L’automatisation est un ensemble de programmes … peut être buggé ? J’ai déjà 3 principes de bases, je m’en sers , et je continue. Je commence par me poser qqes questions : configurable ? Mono / multi instance ? J’ai identifié mes dépendances et je me coupe du monde extérieur (maven + artifactory) j’ai inclus mes ressources dans mon mécanisme de build (zip … bat … ) J’écris des scripts de mis à jours de mes schéma de base de donnée … tiens pourquoi ne pas le mettre dans mon code …. J’externalise toutes les configurations dans des ressources si ce n’est pas le cas (pour le moment une conf par defaut qui marche dans 90% des cas, et je garde le problème pour plus tard) J’écris mon script pour faire le start / stop …. Le fait d’avoir des chemins configurable fait que mes scripts sont configurable … J’écris mes documents d’installation A oui, je n’oublie pas d’inclure mon module de setup dans ma CI !!!
Nous avons maintenant : ENVIRONNEMENT Bénéfices Maîtrisé Versionné Reproductible Testable Généré régulièrement Développement QA Production / Client 3 minutes : conclusion demo Parler de l'idée de mettre un identifiant lié à la version du code dans le livrable déployé traçabilité RS: Faire le lien avec la session Build and CI Benefices : en prod : abaisse le niveau de compétences requis pour l'installation (et le temps !) dev : offre un environnement réinstallable (et reproductible chasse aux bugs - QA) cible aux développeurs test : automatisation et meme les environement de tests manuels sont plus souple
Le déploiement, compliqué ? Doit être configurable Ne pas confondre configurable et doit être configuré Configurable Développement QA Production / client Environnements Calcul de valeurs Configurable si je le désir Valeurs par defaut Et donc insister sur le fait que ca soit un problème compliqué. Notre installation, plus des environnements hétérogènes, … easy php : installer apache/php/mysql fonctionnels sur votre PC ne requiert aucune configuration. Il y a beaucoup de chose a configurer, mais il faut standardiser, homogénéiser et automatiser c’est ce que nous allons voir maintenant.
DEMONSTRATION Configuration Questions
DEMONSTRATION Les bonnes pratiques et les pièges Interagit mais indépendant de l'installation Utilisation de templates de configuration (Velocity, ERB, ...) Configuration = fonction (environnement, hardware, user, application ) Versions différentes par environnement Non versionné Je commence a écrire mon script qui met a jour la version. Je choisi de prendre une solution simple : arborescence svn : conf/outils/version Le script demande au début : qui (user) quoi (appli / version ) ou (server / env) … et après il fait tout tout seul. Quand je dis demande, il peut calculer certaines informations … Je peux l’exécuter quand je veux : pendant l’installation ou avant/après Du coup, quand j’installe il utilise mon script … accès svn ou fichier local ? Je peux pousser la configuration de manière asynchrone …. A oui , la plupart des configuration je les calculs …. calcul (ex Xms=%MEMORY%/3) standardisation de valeurs ( HTTP PORT = 8080, MYSQL PORT = 3306).... surcharge de valeurs : QA : MYSQLPORT=3307 ... Comment je traite le cas des valeurs définis plusieurs fois … * je met des priorités entre les 4 groupes, et je prend toujours dans le même sens * tiens, je rajoute un petit script qui me liste les doublons A oui, la conf cela doit se versionner, ca doit être traceable, comme des données, comme du code …
Favoriser les concepts plus que les outils Conclusion Concepts Favoriser les concepts plus que les outils Outils Les outils existent, ne réinventez pas la roue Choisissez celui adapté a vos besoins … si vos besoins changent … changez d’outils ! Choix Application Sans modifier l’application Configurable et installable ! Est-ce le but ou juste une étape ? But ? Au passage, je n’ai pas touché mon application. D’accord j’avais tout isolé dans des ressources, mais ce n’est pas difficile à faire. Le déploiement continu est plus dure a faire, car il nécessite de modifier l’application. On ne liste que quelques pistes de réflexions. Etape ! Si , on peut encore faire mieux …
Etapes suivantes: encore plus vite ! C’est possible ! L’application doit détecter le changement de configuration (ou être notifiée) Le code ne doit pas stocker localement la configuration initiale Chargement de la configuration à chaud L’application doit permettre de mettre à jour ses données sans redémarrer Chargement à chaud des données Je dois pouvoir mettre à jour mon application sans interrompre le service en cours Déploiement continu Je dois pouvoir mettre à jour le minimum de choses et le plus rapidement possible Installation incrémentale
Outils Conf et install Vous en vouliez ? En voila ! msiexec Installation msiexec Java webstart NuGet , openWrap… Conf et install http://docs.fabfile.org/0.9.2/ http://rubyhitsquad.com/Vlad_the_Deployer.html http://projects.puppetlabs.com/projects/puppet/wiki/About_Puppet http://www.capify.org/index.php/Capistrano http://heroku.com/ http://controltier.org/wiki/Main_Page
Questions By Agile4techos
ROTI (Return On Time Invested) 5 doigts : Excellente Super c'est exactement ce qu'il me fallait ! 4 doigts : Bonne Très intéressant, j’ai gagné plus que le temps que j’y ai passé. 3 doigts : Juste Moyenne Intéressant, sans plus. Je n’ai pas perdu mon temps. 2 doigts : Utile Bof ! J'ai perdu du temps. 1 doigt : Inutile Je n'ai rien appris. J’ai vraiment perdu mon temps