Construction et déploiement d applications Java avec Maven, Archiva, Groovy et Jenkins Un retour d expérience Patrice RINGOT Ingénieur en développement et déploiement d applications - INIST/CNRS Rencontre DevelopR6 sur les outils de packaging et de déploiement 14 juin 2012
Rappels Java est un langage compilé. L entité minimale livrable est une classe compilé correspondant à un fichier source. Dans la pratique on ne livre pas des classes compilées à l unité. On rassemble les classes au sein de fichiers ZIP (jar,war,aar,ear) dont la structure interne dépend du type de livrable (librairie, application web, ). Le packaging en Java consiste donc à produire des «jars» qui sont à la base des processus de déploiement (nécessaires, mais pas suffisants). Construction et déploiement d'applicatifs Java 2
Le contexte (cf saisons 1 et 4 de DevelopR6!) Applicatif de production de métadonnées bibliographiques Serveurs: Linux, Windows, (HPUX) JBoss 6.1 (EJB 3.1, JPA 1.0, JDBC, Servlet) PostgreSQL 9.1 & Lucene (serveurs à l intérieur ou à l extérieur de l INIST) Clients: Windows, MacOS, (Linux) Mode client-serveur: IHM Swing, EJB 3.1, HTTP Mode déconnecté: IHM Swing, H2 + Lucene + JPA 1.0, HTTP Construction et déploiement d'applicatifs Java 3
Développement/Déploiement Swing EJB (LAN) ou H2/JPA/HTTP(WAN) Lucene Prod (INIST ou externe) Deploy/Deploy! Dev/integration (INIST) Prod (INIST ou externe) Deploy! Deploy! JBoss 6.1 EJB/JPA/Servlet PostgreSQL Lucene Deploy! JBoss 6.1 EJB/JPA/Servlet PostgreSQL Lucene Construction et déploiement d'applicatifs Java 4
Apache Maven Concurrents: Ant, Gradle, Ivy et Ant, Outil de build/packaging Java Bien intégré dans les IDE Indépendant des IDE Déclaratif Basé sur des conventions (over configuration) Système de phase (compile/test/package/install/deploy) Modulaire et extensible S appuie (http) sur un repository public d artefacts (~ jars) et des dépendances exprimées Construction et déploiement d'applicatifs Java 5
Maven pom de base Conventions SNAPSHOT Coordonnées Maven Construction et déploiement d'applicatifs Java 6
Maven Dépendances Scopes Dépendances transitives Construction et déploiement d'applicatifs Java 7
Maven: phases Phases Maven principales compile compile the source code of the project test test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed package take the compiled code and package it in its distributable format, such as a JAR. install install the package into the local repository, for use as a dependency in other projects locally deploy done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects. Construction et déploiement d'applicatifs Java 8
Maven: packaging F:\workspaces\workspace_test\simple>mvn package [INFO] ------------------------------------------------------------------------ [INFO] Building simple 1.0-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ simple --- [INFO] Compiling 1 source file to F:\workspaces\workspace_test\simple\target\classes [INFO] [INFO] --- maven-compiler-plugin:2.3.2:testcompile (default-testcompile) @ simple --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-surefire-plugin:2.10:test (default-test) @ simple --- [INFO] Surefire report directory: F:\workspaces\workspace_test\simple\target\surefire-reports T E S T S Results : Tests run: 0, Failures: 0, Errors: 0, Skipped: 0 [INFO] --- maven-jar-plugin:2.3.2:jar (default-jar) @ simple --- [INFO] Building jar: F:\workspaces\workspace_test\simple\target\simple-1.0-SNAPSHOT.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.530s [INFO] Finished at: Fri Jun 01 13:07:20 CEST 2012 [INFO] Final Memory: 8M/153M [INFO] ------------------------------------------------------------------------ Construction et déploiement d'applicatifs Java 9
Maven: repository local F:\workspaces\workspace_test\simple>mvn install [INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ simple --- Tests run: 0, Failures: 0, Errors: 0, Skipped: 0 [INFO] [INFO] --- maven-jar-plugin:2.3.2:jar (default-jar) @ simple --- [INFO] [INFO] --- maven-install-plugin:2.3.1:install (default-install) @ simple --- [INFO] Installing F:\workspaces\workspace_test\simple\target\simple-1.0-SNAPSHOT.jar to d:\ringot\.m2\repository\org\tognir\simple\1.0-snapshot\simple-1.0-snapshot.jar [INFO] Installing F:\workspaces\workspace_test\simple\pom.xml to d:\ringot\.m2\repository\org\tognir\simple\1.0- SNAPSHOT\simple-1.0-SNAPSHOT.pom [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS Ce qui est dans le repository local de l utilisateur ($HOME/.m2) peut être utilisé comme dépendance dans d autres projets de l utilisateur (en local): <dependency> <groupid>org.tognir</groupid> <artifactid>simple</artifactid> <version>1.0-snapshot</version> <scope>compile</scope> </dependency> Construction et déploiement d'applicatifs Java 10
Maven: avenir Statut «legacy» (comme Ant) Challengé (comme ses concurrents) par Jigsaw (Java 8, sept. 2013) Modularisation de Java, gestion des dépendances, packaging (jmod, rpm, deb) Plus de classpath, ni de jars mais des modules A voir: Présentation d Alexis Moussine-Pouchkine (Oracle à l époque) au Paris JUG : http://www.parleys.com/#st=5&id=3124 Construction et déploiement d'applicatifs Java 11
Maven: en résumé Maven permet de compiler, tester et packager des livrables Java. Il s appuie sur un système de dépendances servies par un repository public central. Il marche aussi bien dans les IDE qu en ligne de commande, ce qui signifie qu il est automatisable. Construction et déploiement d'applicatifs Java 12
Apache Archiva Concurrents: Nexus et Artifactory. Eléments de comparaison: ici. Repository de site d artefacts Proxy Maven vis-à-vis des repositories externes moins de dépendances opérationnelles % Mr Internet un unique fournisseur pour les configurations Maven Gestion centralisée des artefacts (= les produits du build ~ jar/war/ear/aar/tar/zip/ ) produits sur site introuvables en libre accès sur des repositories externes Service indispensable quand on développe avec Maven en équipe Administrable et utilisable via HTTP Construction et déploiement d'applicatifs Java 13
Archiva: vue de haut Recherche d artefacts Page d accueil d Archiva Gestion (rapports, utilisateurs, artefacts) Administration (repositories, proxy, entretien du système) Construction et déploiement d'applicatifs Java 14
Archiva: artefact versionné Navigation par Coordonnées Maven Construction et déploiement d'applicatifs Java 15
Archiva: artefact en dev Construction et déploiement d'applicatifs Java 16
Archiva: repositories Internal repository { Central repo Codehaus repo règles règles Snapshots repository XYZ repo règles Serveur Archiva local Construction et déploiement d'applicatifs Java 17
Archiva & Maven junit 4.10? junit 4.10? Internal repository junit 4.10 { junit 4.10? Central repo junit 4.10 Codehaus repo règles règles junit 4.10? Snapshots repository XYZ repo règles junit 4.10 Serveur Archiva local Construction et déploiement d'applicatifs Java 18
mvn deploy Internal repository { Central repo Codehaus repo règles règles simple 1.0- SNAPSHOT Snapshots repository simple 1.0- SNAPSHOT XYZ repo Serveur Archiva règles local Construction et déploiement d'applicatifs Java 19
mvn release SVN simple 1.0 Internal repository Création version 1.0 de simple Version Central courante repo= 1.1-SNAPSHOT { Codehaus repo règles règles simple simple 1.0- SNAPSHOT 1.0 Snapshots repository simple 1.0- SNAPSHOT XYZ repo Serveur Archiva règles local Construction et déploiement d'applicatifs Java 20
Maven et Archiva: en résumé Maven permet de compiler, tester et packager des livrables Java, en cours de développement, ou prêts à la mise en production. Archiva est un proxy spécialisé Maven qui permet de partager sur le réseau local des livrables Java. Construction et déploiement d'applicatifs Java 21
Serveur d Intégration Continue Jenkins Concurrents: Hudson, Teamcity, CruiseControl Construction automatique et régulière d applicatifs à partir de leur lieu de stockage dans un SCM (SVN, Git, ) en utilisant leur outil de build (Maven, Gradle, Ant, ) sur évènement (commit, à heure fixe, dépendance entre builds, action utilisateur) Détection rapide des problèmes d intégration ou des régressions Production de rapports état des tests unitaires (nombre, taux de succès, couverture) conformité à des critères de qualité définis par l équipe de dev (Findbugs, Checkstyle) Contrôle qualité permanent, homogénéisation du travail d équipe Etapes pre/post build Base de déploiement (possibilité de déposer des livrables quelque part) Construction et déploiement d'applicatifs Java 22
Jenkins: vue de haut Construction et déploiement d'applicatifs Java 23
Jenkins: administration Construction et déploiement d'applicatifs Java 24
Jenkins: plugins Construction et déploiement d'applicatifs Java 25
Jenkins Construction et déploiement d'applicatifs Java 26
Jenkins Construction et déploiement d'applicatifs Java 27
Jenkins: config projet 1/2 Construction et déploiement d'applicatifs Java 28
Jenkins: config projet 2/2 Construction et déploiement d'applicatifs Java 29
Jenkins: build! Construction et déploiement d'applicatifs Java 30
Jenkins: en résumé Jenkins permet d intégrer les applicatifs Java le plus souvent possible On est alerté au plus tôt des erreurs d intégration ou des régressions et on garde un contrôle constant sur le niveau de qualité que l on souhaite respecter Jenkins est également capable de déployer les artefacts qu ils construit dans le cadre de sa fonction première grâce aux postactions Construction et déploiement d'applicatifs Java 31
Groovy Langage dynamique tournant sur la JVM (2003) Inspiré de Ruby, Python, Smalltalk Interopérable avec Java et intégré dans son écosystème Très proche syntaxiquement de Java Ticket d entrée plus que raisonnable et à la fois beaucoup plus expressif que Java Syntaxe allégée, Regexp, Closures, Builders, Moins performant que Java et bientôt au coude à coude (static compilation à venir en 2.0, avec quelques limitations) Construction et déploiement d'applicatifs Java 32
Groovy: nos use cases Utilisé en périphérie des applicatifs Comme un meilleur Java (on est loin d être des experts Groovy ) Comme un remplaçant de Perl (et Bash/DOS au plus possible) Scripts de déploiement, de livraison d artefacts, d administration d applicatif en ligne de commande Déployé en OneJar (jar autosuffisant: l ami du déployeur) Construction et déploiement d'applicatifs Java 33
Groovy: un exemple convainquant def schema = "PROD" def sql = Sql.newInstance("jdbc:oracle:thin:@hostname:1526:${schema}", "scott", "tiger", "oracle.jdbc.driver.oracledriver") def xml = new MarkupBuilder(new FileWriter(new File('out.xml'))) xml.agents { sql.eachrow(" SELECT id, name, givenname, unit FROM ${schema}.people ") { row -> xml.agent(id:row.id) { name( row.name ) givenname( row.givenname ) unit( row.unit ) } } } Construction et déploiement d'applicatifs Java 34
Déploiement serveur Script Groovy, fabriqué et livré en OneJar grâce à Maven/Archiva $JAVA_HOME/bin/java -jar prodmd-setup-2.0.8-onejar.jar deploy-coop --install-dir=/un/petit/chemin/qui/sent/la/noisette --deploy-jboss --jboss-server-host=monserver.tognir.org --jboss-server-port=11111 --jboss-jndi-port=11112 --jboss-admin-username=treme --jboss-admin-password=the-wire --jboss-zip-file=/softs/jboss-as-distribution-6.1.0.final.zip --postgresql-dir=/usr/lib/postgresql/9.1 --postgresql-server-host=localhost --postgresql-server-port=51819 --db-name=mydb --db-user=dbuser --db-password=dbpass --java-home=$java_home --java-xmx=1024 --java-xms=256 L applicatif complet (etc, bin, crontab, logrotate, jboss dézippé/configuré, ) est installé en une commande. Il reste ensuite à y installer les livrables (ear,jar,war,zip) construits avec Maven Construction et déploiement d'applicatifs Java 35
Installation/Mise à jour livrables Cas des livrables versionnés (développeurs, production) V=1.0 URL=http://server:port/archiva/repository/internal # Récupération du livrable à partir d Archiva curl -v -O --user $U:$P $URL/fr/inist/prodmd/prodmd-coop-ea/$V/prodmd-coop-ea-$V.ear # Utilisation d une sous-commande du script de déploiement pour déployer # le livrable au bon endroit pour JBoss $SCRIPT_DEPLOY install-prodmd --deliverable=prodmd-coop-ea-$v.ear Cas des livrables SNAPSHOT : utilisation de Jenkins (tests fonctionnels CDP) Chaque nuit, si le build du projet réussit: Copie par SCP des livrables produits par Jenkins sur le serveur de TEST SSH sur le serveur de test de $SCRIPT_DEPLOY install-prodmd Construction et déploiement d'applicatifs Java 36
Avantages d automatiser le déploiement (à ce point) Tout le monde n est pas un expert de tout Automatiser le déploiement permet à tous les membres de l équipe (dev, prod) d installer la totalité de l applicatif sans difficulté et de la même manière Les paramètres du script évitent d avoir à modifier manuellement les configurations des différents middlewares (façade) Personne n est parfait Aussi bien en sécurité, qu en paramétrage de middleware, qu en général Les progrès (corrections de bug, tunning, nouveaux paramètres) sont «gravés» dans le script de déploiement, et donc partagés par tout le monde Construction et déploiement d'applicatifs Java 37
Déploiement client JavaWebStart: trop de problèmes! IHM Client = Un OneJar dont on assure la livraison (via un servlet de l applicatif), l installation (création de raccourcis) et la mise à jour, pour les différents OS supportés Mise à jour côté serveur comme tout livrable de l applicatif (utilisation du script de déploiement), et détection des nouveautés côté client à chaque exécution Java: une version de Java qualifiée livrée (et éventuellement mise à jour) de la même manière que l applicatif client réservée à l utilisation exclusive de l applicatif pas de lien avec les navigateurs = pas de problème de sécurité indépendante des autres versions de Java installée sur le poste de l utilisateur Pas de regression Construction et déploiement d'applicatifs Java 38
Groovy: en résumé Un langage qui a les mêmes prérequis que Java et qui permet d écrire beaucoup plus simplement/rapidement qu en Java des logiciels de déploiement complets d applicatifs Construction et déploiement d'applicatifs Java 39
Perspectives Aller dans la direction du packaging natif (rpm, deb) y inclure les livrables script de déploiement se mettre en position d être provisionné (Puppet/Chef) Le packaging natif, c est un excellent trait d union entre les Devs et les OPs Construction et déploiement d'applicatifs Java 40
DevOps: bonne médecine Continuous Delivery: Reliable Software Releases through Build, Test, and Deployment Automation By Jez Humble, David Farley, ISBN-13: 978-0-321-60191-9 Présentations DevOps d Henri Gomez Au Lyon JUG: DevOps, Retour d'expérience http://www.slideshare.net/henri.gomez/20111220-lyon-jugdevopsculture Au Paris JUG: DevOps, l approche packaging natif http://www.parleys.com/#st=5&id=2979 Arnaud Héritier: Setup your DevOps playground with Puppet, Vagrant & co http://blog.aheritier.net/setup-your-devops-playground-with-puppet-vagrant-co/ Construction et déploiement d'applicatifs Java 41
Merci! Construction et déploiement d'applicatifs Java 42