20091020 - Normandy Jug - Builders Battle

2 039 vues

Publié le

Présentation au NormandyJUG
le 20 oct. 2009
Builders Battle - Ant, Ivy, Gradle, EasyAnt, Maven

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

Aucun téléchargement
Vues
Nombre de vues
2 039
Sur SlideShare
0
Issues des intégrations
0
Intégrations
94
Actions
Partages
0
Téléchargements
16
Commentaires
0
J’aime
1
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

20091020 - Normandy Jug - Builders Battle

  1. 1. NormandyJUG 20 octobre 2009 Builders Battle Maven / Ivy / Ant / Gradle / EasyAnt ...
  2. 2. Grégory Boissinot <ul><li>Committer Hudson depuis 2008 </li></ul><ul><li>Consultant Zenika </li></ul><ul><ul><li>Spécialiste sur les outils de build et l'intégration continue </li></ul></ul><ul><ul><li>Formateur sur l'usine logicielle </li></ul></ul><ul><ul><li>A mis en place Gradle chez un grand acteur de l'industrie </li></ul></ul>
  3. 3. Jean-Louis Boudart <ul><li>Leader d’EasyAnt </li></ul><ul><li>Commiter Hudson </li></ul><ul><li>Consultant indépendant </li></ul><ul><ul><li>Spécialiste sur les outils de build et d’intégration continue </li></ul></ul>
  4. 4. Xavier Hanin <ul><li>Createur d’Apache Ivy </li></ul><ul><li>Architecte Principal 4SH </li></ul>
  5. 5. Arnaud Héritier <ul><ul><li>eXo Platform - http://www.exoplatform.com </li></ul></ul><ul><ul><li>Software Factory Manager </li></ul></ul><ul><ul><ul><li>Qualité </li></ul></ul></ul><ul><ul><ul><li>Outillage </li></ul></ul></ul><ul><ul><ul><li>Productivité des développements </li></ul></ul></ul><ul><li>Committer depuis 2004 et membre du PMC </li></ul><ul><li>Co-auteur « Apache Maven » aux éditions Pearson (FR) </li></ul>
  6. 6. Programme <ul><li>Un peu d’archéologie </li></ul><ul><li>Les protagonistes </li></ul><ul><ul><li>Apache Maven </li></ul></ul><ul><ul><li>Apache Ivy </li></ul></ul><ul><ul><li>EasyAnt </li></ul></ul><ul><ul><li>Gradle </li></ul></ul><ul><li>Le combat final </li></ul><ul><li>Questions / Réponses </li></ul>
  7. 7. UN PEU D’ARCHÉOLOGIE <ul><li>Retour au début du siècle </li></ul>
  8. 8. Construction d’un war en 2002 <ul><li>Utilisation d’Eclipse limitée </li></ul><ul><ul><li>Pas de WTP (uniquement dans la version payante d’IBM), </li></ul></ul><ul><ul><li>Eclipse ne permettait pas d’exporter des Wars </li></ul></ul>
  9. 9. Construction d’un war en 2002 <ul><li>Beaucoup de tâches manuelles </li></ul><ul><ul><li>Modifier les fichiers de paramétrage </li></ul></ul><ul><ul><li>Exporter les différents jar </li></ul></ul><ul><ul><li>Copier les dépendances (et nos jars), dans un répertoire lib </li></ul></ul><ul><ul><li>Faire un zip que l’on renomme en war </li></ul></ul><ul><ul><li>Tagguer l’ensemble des sources dans le répertoire de sources (CVS) </li></ul></ul><ul><ul><li>Envoyer le fichier par FTP sur le serveur d’intégration </li></ul></ul><ul><ul><li>Se connecter à la console d’administration du serveur et déployer l’application </li></ul></ul>
  10. 10. Construction d’un war en 2002 <ul><li>Un seul problème, Y’a toujours des problèmes </li></ul><ul><ul><li>Erreur dans la configuration </li></ul></ul><ul><ul><li>Oubli d’une dépendance </li></ul></ul><ul><ul><li>oubli d’un fichier </li></ul></ul><ul><ul><li>Correction de dernière minute qui introduit une régression… </li></ul></ul><ul><ul><li>Autres </li></ul></ul><ul><li>Combien de temps ça prend ? </li></ul><ul><ul><li>Quand tout va bien : 15 minutes </li></ul></ul><ul><ul><li>Quand il y a des problèmes : ½ journée </li></ul></ul>
  11. 11. APACHE MAVEN <ul><li>Builders Battle </li></ul>
  12. 12. Une première réponse : ANT <ul><li>Ecriture d’un script </li></ul><ul><ul><li>Permet d’automatiser le process </li></ul></ul><ul><ul><li>Durée du processus réduite de moitié </li></ul></ul><ul><ul><li>Le processus ne monopolise personne </li></ul></ul><ul><ul><ul><li>On le lance et on passe à autre chose </li></ul></ul></ul>
  13. 13. Les limites de ANT <ul><li>Ecrire le script, c’est long </li></ul><ul><li>Modifier un script, c’est très long </li></ul><ul><li>Au final, le gains de temps n’est pas évident </li></ul><ul><ul><li>Mais c’est quand même plus amusant </li></ul></ul><ul><ul><li>Il est possible de réutiliser le script ! </li></ul></ul>
  14. 14. La réutilisation de scripts ANT <ul><li>Les scripts ne sont pas directement réutilisables </li></ul><ul><ul><li>Structure de projets différents </li></ul></ul><ul><ul><li>Besoins différents </li></ul></ul><ul><li>Encore du temps perdu </li></ul><ul><ul><li>Modification du script </li></ul></ul><ul><ul><li>Réécriture pour le rendre plus générique </li></ul></ul><ul><li>Un nouveau métier s’est créé dans chaque projet : scripteur ANT </li></ul>
  15. 15. Quelques exemples <ul><li>J u nit : http://junit.cvs.sourceforge.net/viewvc/junit/junit/build.xml?view=markup </li></ul><ul><li>Findbugs : http://findbugs.googlecode.com/svn/trunk/findbugs/build.xml </li></ul><ul><li>J b oss SEAM : http://anonsvn.jboss.org/repos/seam/branches/community/Seam_2_0 </li></ul>
  16. 16. LES INTÉRÊTS POUR UN PROJET <ul><li>Apache Maven </li></ul>
  17. 17. Maven, le choix Projet <ul><li>Le projet peut-être librement découpé en modules </li></ul><ul><ul><li>Maven ne cristallise pas l’architecture de l’application </li></ul></ul><ul><li>Gestion des dépendances </li></ul><ul><ul><li>Déclaratif : Gestion automatique du téléchargement et de l’utilisation dans le projet. </li></ul></ul><ul><ul><li>Transitivité : On ne déclare que ce que l’on utilise </li></ul></ul>
  18. 18. Maven, le choix Projet <ul><li>Centralise et automatise les différents aspects du développement de logiciels </li></ul><ul><li>Une seule chose qu’il ne peut faire à votre place  : Développer </li></ul><ul><ul><li>Construction </li></ul></ul><ul><ul><li>Tests </li></ul></ul><ul><ul><li>Packaging </li></ul></ul><ul><ul><li>Déploiement </li></ul></ul><ul><ul><li>Documentation </li></ul></ul><ul><ul><li>Contrôles et rapports sur la qualité des développements </li></ul></ul>
  19. 19. LES INTÉRÊTS POUR UNE ENTREPRISE <ul><li>Apache Maven </li></ul>
  20. 20. Maven, le choix Entreprise <ul><li>Standard du marché </li></ul><ul><ul><li>Disponibilité des ressources </li></ul></ul><ul><li>Standardisation des développements </li></ul><ul><ul><li>Organisation des sources </li></ul></ul><ul><ul><li>Descripteur de projet </li></ul></ul>
  21. 21. Maven, le choix Entreprise <ul><li>Rationnaliser les coûts </li></ul><ul><ul><li>On ne réinvente pas la roue à chaque nouveau projet </li></ul></ul><ul><ul><li>Factorisation entre projets </li></ul></ul><ul><li>Promotion de la qualité et intégration de l’outillage associé </li></ul>
  22. 22. APACHE IVY <ul><li>Builders Battle </li></ul>
  23. 23. Qu'est ce qu'Apache Ivy <ul><li>Un gestionnaire de dépendances </li></ul><ul><ul><li>Resolving / Publishing / Reporting </li></ul></ul><ul><li>Peut être utiliser en tant que </li></ul><ul><ul><li>Plugin Ant </li></ul></ul><ul><ul><li>Librairie (Gradle, IDE Integration...) </li></ul></ul><ul><ul><li>Depuis la ligne de commande </li></ul></ul>1/2
  24. 24. Features <ul><li>Flexible et configurable </li></ul><ul><li>Supporte les dépendances transitive </li></ul><ul><li>Assurer la reproductibilité d'un build </li></ul><ul><li>Robuste et documenté </li></ul>1/2
  25. 25. Features <ul><li>Gestionnaire de conflits </li></ul><ul><li>Intégration avec Ant </li></ul><ul><li>Comptabilité avec les dépôts maven </li></ul><ul><li>Support de gros graphes de dépendances </li></ul>1/2
  26. 26. Comparatif Ivy / Maven POM <ul><li><ivy-module version=&quot;2.0&quot;> </li></ul><ul><li><info organisation=&quot;org.jug.normandyjug&quot; module=&quot;hello-ivy&quot;/> </li></ul><ul><li><dependencies> </li></ul><ul><li><dependency org=&quot;commons-lang&quot; name=&quot;commons-lang&quot; rev=&quot;2.0&quot;/> </li></ul><ul><li><dependency org=&quot;commons-cli&quot; name=&quot;commons-cli&quot; rev=&quot;1.0&quot;/> </li></ul><ul><li></dependencies> </li></ul><ul><li></ivy-module> </li></ul><ul><li>… </li></ul><ul><li><dependency> </li></ul><ul><li><groupId>commons-lang</groupId> </li></ul><ul><li><artifactId>commons-lang</artifactId> </li></ul><ul><li><version>2.0</version> </li></ul><ul><li></dependency> </li></ul>1/2
  27. 27. L'esprit d'Ivy : La flexibilité ! <ul><li>Adaptable à votre environnement selon vos besoin </li></ul><ul><li>Configurable et facilement intégrable </li></ul><ul><li>Large choix de repository (FTP, SSH, HTTP, iBiblio, etc...) </li></ul><ul><li>Nombreuses taches ant </li></ul>1/2
  28. 28. L'esprit d'Ivy : La flexibilité ! <ul><li>Definir son propre parser </li></ul><ul><li>Rajouter des extra attributes </li></ul><ul><li>Personnaliser son versionning </li></ul><ul><ul><li>Définir ses propres contraites de version (Alpha, Beta, RC, etc...) </li></ul></ul><ul><ul><li>Définir quel version est plus récente qu'une autre </li></ul></ul><ul><li>Gestion de conflits </li></ul><ul><li>Cache (metadata, artifact) </li></ul><ul><li>Triggers </li></ul>1/2
  29. 29. EASYANT <ul><li>Builders Battle </li></ul>
  30. 30. Qu’est ce qu'EasyAnt ? <ul><li>Build system basé sur des standard (Ant + Ivy) </li></ul><ul><li>Open Source (Apache Software Foundation) </li></ul><ul><li>Architecture extensible à base de Plugins </li></ul><ul><li>Conventions </li></ul><ul><li>Simple, Flexible, Extensible </li></ul>1/2
  31. 31. Objectif ? <ul><li>Gérer le cycle de vie de nos applications </li></ul><ul><li>Industrialiser les développement </li></ul><ul><ul><li>Ne pas réinventer la roue a chaque foi </li></ul></ul><ul><ul><li>Factoriser les ressources inter projet </li></ul></ul><ul><ul><li>Organisation des sources </li></ul></ul><ul><li>Gestion des dépendances </li></ul><ul><li>Promouvoir la qualité et l'intégration </li></ul><ul><li>Rester souple et adaptable </li></ul><ul><li>Etre OpenSource!! </li></ul>1/2
  32. 32. Plugins éxistant <ul><li>Compilation : Java, Scala, Groovy </li></ul><ul><li>Packaging : Jar, War, OSGi </li></ul><ul><li>Test : Junit, TestNG </li></ul><ul><li>Couverture de code : Emma, Cobertura(*) </li></ul><ul><li>SCM : SVN </li></ul><ul><li>Divers: Checkstyle, Javadoc, Jetty, etc... </li></ul><ul><li>Documentation : DocBook, Xooki </li></ul><ul><li>Build types (Java standard, Java Web, Scala, etc...) </li></ul>1/2
  33. 33. Features <ul><li>Gestion du cycle de vie </li></ul><ul><li>Gestion multi-modules </li></ul><ul><li>Gestion de dépendances </li></ul><ul><ul><li>Resolution </li></ul></ul><ul><ul><li>Reporting </li></ul></ul><ul><ul><li>Publication </li></ul></ul><ul><li>Gestion de squelettes de projets </li></ul><ul><li>Phases </li></ul><ul><li>Build-configurations </li></ul><ul><li>Documentation des plugins auto-générée </li></ul>1/2
  34. 34. Contribution connexes <ul><li>Apache Ant </li></ul><ul><ul><li>Phase </li></ul></ul><ul><ul><li>Import / Include </li></ul></ul><ul><ul><li>Abstraction du format d'entrée </li></ul></ul><ul><li>Apache Ivy </li></ul><ul><ul><li>Introduction d'un mécanisme d'héritage de méta donnée </li></ul></ul><ul><li>Apache IvyDE </li></ul><ul><li>Beet ( http://beet.sourceforge.net/ ) </li></ul><ul><ul><li>Utilisation d'EasyAnt en tant que build-system </li></ul></ul>1/2
  35. 35. Prochaines versions <ul><li>Abstraction de langage pour les plugins (XML, Java, Groovy?) </li></ul><ul><li>Simplifier le développement de plugin </li></ul><ul><li>Gestion de projet eclipse </li></ul><ul><li>Gestion de projet android </li></ul><ul><li>EasyAnt4e </li></ul><ul><li>Hudson </li></ul>1/2
  36. 36. EasyAnt4e : intégration dans eclipse <ul><li>Création / import de nouveau projet EasyAnt </li></ul><ul><li>Completion de code : </li></ul><ul><ul><li>Les tags du descripteur de modules </li></ul></ul><ul><ul><li>Les plugins </li></ul></ul><ul><ul><li>Property </li></ul></ul><ul><li>Classpath dynamique </li></ul><ul><li>Visualisation / Execution des targets </li></ul>1/2
  37. 37. GRADLE <ul><li>Builders Battle </li></ul>
  38. 38. Gradle en quelque mots <ul><li>Système de build complet et flexible à la Ant </li></ul><ul><li>Utilisation des conventions de Maven à la demande </li></ul><ul><li>Une gestion multi projet avancée </li></ul><ul><li>Utilisation de Apache Ivy comme gestionnaire de </li></ul><ul><li>dépendances </li></ul><ul><ul><li>Utilisation par API </li></ul></ul><ul><li>Support et Insertion totale dans une infrastructure </li></ul><ul><li>Maven et Ivy existante </li></ul><ul><li>Chaîne de build en Groovy </li></ul><ul><li>Modèle de description du build très riche </li></ul>
  39. 39. Architecture CORE UI DOCS OPEN-API WRAPPER api project-reports code-quality groovy java maven osgi war jetty scala eclipse plugins build tools Ant Ivy Maven Ant Tasks checkstyle codeNarc webdav other dependencies librairies tierces Gradle Groovy
  40. 40. Notion de tâche <ul><li>Un script de build Gradle est défini par un ensemble de tâches sur lesquelle est ajouté des actions qui sont des closures Groovy </li></ul><!-- build.gradle --> task distribution <<{ println &quot;Distribution&quot; } task release ( dependsOn : 'distribution')<<{ println &quot;Release&quot; } > gradle distribution Distribution > gradle release Distribution Release Tâche simple Accès à l'API Java
  41. 41. Les tâches ont une API Copy myCopy = task (myCopy, type:Copy ) myCopy .from (file('resources')) myCopy .into (file('target')) myCopy .include ('**/*.txt', '**/*.xml') task mycopy ( type:Copy ) mycopy{ description ='Copies the resources dir' from (file('resources')) into (file('target')) include ('**/*.txt', '**/*.xml') } task mycopy ( type:Copy ){ description ='Copies the resources dir' from (file('resources')) into (file('target')) include ('**/*.txt', '**/*.xml') } Tâche améliorée CustomTask Copy mycopy
  42. 42. Une API très riche task source( type:Jar ){ baseName='source' from sourceSets.main.java } task distrib( type:Zip ){ dependsOn(jar) baseName='dist' from sourceSets.main.java from jar.archivePath } CustomTask Abstract ArchiveTask Zip Jar War Tar SourceTask task javadoc( type: Javadoc ) { source sourceSets.main.allJava } Javadoc
  43. 43. Plusieurs tâches par défaut <!-- build.xml --> <project default=&quot;all&quot; > <target name=&quot;clean&quot;> <echo message=&quot;Cleaning&quot;/> </target> <target name=&quot;jar&quot;> <echo message=&quot;Packaging&quot;/> </target> <target name=&quot;all&quot;> <antcall target=&quot;clean&quot;/> <antcall target=&quot;jar&quot;/> </target> </project> <!-- build.gradle --> defaultTasks 'clean', 'jar' task clean << { println &quot;Cleaning&quot; } task jar << { println &quot;Packaging&quot; } > ant Cleaning Packaging > gradle Cleaning Packaging
  44. 44. Exécution unique et ordonnée compile compileTest test dist > ant test dist compile compileTest test compile compileTest test dist > gradle test dist :compile :compileTest :test :dist
  45. 45. Pour un projet Java/JEE CORE UI DOCS OPEN-API WRAPPER api project-reports code-quality groovy java maven osgi war jetty scala eclipse plugins build tools Ant Ivy Maven Ant Tasks checkstyle codeNarc webdav other dependencies librairies tierces Gradle Groovy
  46. 46. Build d'une librairie <!-- build.gradle --> usePlugin 'java' archivesBaseName = 'core' version = '3.5' manifest.mainAttributes ( 'Implementation-Version': version ) repositories { mavenCentral() } dependencies { compile group: 'commons-collections', name: 'commons-collections', version: '3.2' testCompile group: 'junit', name: 'junit', version: '4.+' } > gradle compileJava > gradle jar core-3.5.jar Gradle jar Configuration accessible sous forme de propriétés
  47. 47. Build d'une webapp <!-- build.gradle --> usePlugin 'war' usePlugin 'jetty' archivesBaseName = 'web' version = '1.0' repositories { mavenCentral() } dependencies { compile &quot;commons-io : commons-io : 1.4&quot; compile (&quot;log4j : log4j : 1.2.15&quot;){ exclude(group:'javax.jms') exclude(group:'com.sun.jdmk') exclude(module:'jmxri') } } > gradle war > gradle jettyRun WEB-INF optionel JEE6 compatible web-2.4.war Gradle war
  48. 48. Phases de build <ul><li>Gradle fournit 3 phases distinctes de build </li></ul><ul><li>Initialisation </li></ul><ul><ul><li>Détermine l'ensemble des projets à builder </li></ul></ul><ul><ul><li>Création d'un objet Projet pour chaque module </li></ul></ul><ul><li>Configuration </li></ul><ul><ul><li>Configuration des objets Project </li></ul></ul><ul><li>Exécution </li></ul><ul><ul><li>Exécution des tâches crées et configurés précédemment </li></ul></ul>gradle.taskGraph.whenReady {taskGraph -> if (taskGraph .hasTask (':release')) { version = '1.0' } else { version = '1.0-SNAPSHOT' } } Nombreux hooks disponibles
  49. 49. Intégration native avec Ant CORE UI DOCS OPEN-API WRAPPER api project-reports code-quality groovy java maven osgi war jetty scala eclipse plugins build tools Ant Ivy Maven Ant Tasks checkstyle codeNarc webdav other dependencies librairies tierces Gradle Groovy
  50. 50. Utilisation possible des tâches Ant <!-- build.gradle --> task generateStub << { ant { def wsdl2java_classpath = path { fileset (dir: 'lib') { include(name: '*.jar') } } taskdef ( name: 'axisWsdl2java', classname: 'org.apache.axis.tools.ant.wsdl.Wsdl2javaAntTask', classpath: wsdl2java_classpath ) axisWsdl2java( output:&quot;generated&quot;, verbose:&quot;true&quot; , url:&quot;Exemple.wsdl&quot;) } } Utilisation de l'objet Groovy AntBuilder
  51. 51. LES INTÉRÊTS POUR UNE ENTREPRISE Gradle
  52. 52. Gradle, un choix pertinent en Entreprise <ul><li>Utiliser Gradle en lieu et place de vos scripts Ant </li></ul><ul><ul><li>Réutilisation (Import) de scripts Ant existant </li></ul></ul><ul><ul><li>Utilisation de toute tâche native </li></ul></ul><ul><li>Utiliser Gradle avec votre infrastructure Ivy </li></ul><ul><ul><li>Intégration plus profonde et plus riche </li></ul></ul><ul><li>Utiliser Gradle avec votre infrastructure Maven </li></ul><ul><li>existante </li></ul><ul><ul><li>Les même conventions que Maven </li></ul></ul><ul><ul><li>Simplicité de gestion des dépendances Maven </li></ul></ul><ul><ul><li>Flexibilité au besoin </li></ul></ul>
  53. 53. LES PROBLEMES Gradle
  54. 54. Les problèmes <ul><li>Ce qui manque </li></ul><ul><ul><li>Gestion d'un ear pour JEE </li></ul></ul><ul><ul><li>Génération de la configuration IDEA et NetBeans </li></ul></ul><ul><ul><li>Intégration avec les outils de couvertures de code ou d'autres outils de métriques (Findbugs, …) </li></ul></ul><ul><ul><ul><li>Délégation à des tâches Ant aujourd'hui </li></ul></ul></ul><ul><li>Un manque de maturité </li></ul><ul><ul><li>Changement de la DSL entre chaque release </li></ul></ul>
  55. 55. LE COMBAT FINAL <ul><li>Il n’en restera plus qu’un … ou pas </li></ul>
  56. 56. LES DOCUMENTATIONS DOCUMENTATIONS ? <ul><li>Apache Maven </li></ul>
  57. 57. Quelques liens <ul><li>Le site web : </li></ul><ul><ul><li>http://maven.apache.org </li></ul></ul><ul><li>Le wiki projet : </li></ul><ul><ul><li>http://docs.codehaus.org/display/MAVEN </li></ul></ul><ul><li>Le wiki utilisateurs : </li></ul><ul><ul><li>http://docs.codehaus.org/display/MAVENUSER </li></ul></ul>
  58. 58. Ouvrages <ul><li>Sonatype / O’Reilly : </li></ul><ul><ul><li>The Definitive Guide </li></ul></ul><ul><ul><li>http://www.sonatype.com/books </li></ul></ul><ul><ul><li>Gratuit en version électronique </li></ul></ul><ul><ul><li>D’ici la fin de l’année (?) en français </li></ul></ul>
  59. 59. Ouvrages <ul><li>Exist Global </li></ul><ul><ul><li>Better builds with Maven </li></ul></ul><ul><ul><li>http://www.maestrodev.com/better-build-maven </li></ul></ul><ul><ul><li>Gratuit </li></ul></ul><ul><ul><li>Version électronique uniquement </li></ul></ul>
  60. 60. Ouvrages <ul><li>Nicolas De loof – Arnaud Héritier </li></ul><ul><ul><li>Aux éditions Pearson </li></ul></ul><ul><ul><li>Collection Référence </li></ul></ul><ul><ul><li>Un ouvrage original condensé de retours d’expériences </li></ul></ul><ul><ul><li>En français </li></ul></ul><ul><ul><li>Disponible le 20 Novembre </li></ul></ul>
  61. 61. Support <ul><li>Listes de diffusion </li></ul><ul><ul><li>http://maven.apache.org/mail-lists.html </li></ul></ul><ul><li>IRC </li></ul><ul><ul><li>irc.codehaus.org - #maven </li></ul></ul><ul><li>Developpez.net </li></ul><ul><ul><li>http://www.developpez.net/ forum maven </li></ul></ul><ul><ul><li>En français </li></ul></ul><ul><li>Contrats de support </li></ul><ul><ul><li>Sonatype et quelques autres entreprises </li></ul></ul>
  62. 62. DOCUMENTATIONS <ul><li>EasyAnt </li></ul>
  63. 63. Documentations / Contact <ul><li>Le site web : </li></ul><ul><ul><li>http://www.easyant.org/ </li></ul></ul><ul><li>La documentation : </li></ul><ul><ul><li>http://www.easyant.org/doc/ </li></ul></ul><ul><li>La mailing list : </li></ul><ul><ul><li>http://groups.google.com/group/easyant/ </li></ul></ul><ul><li>IRC: </li></ul><ul><ul><li>irc.freenode.net - #easyant </li></ul></ul>1/2
  64. 64. LES DOCUMENTATIONS ? Gradle
  65. 65. Quelques liens <ul><li>Le site web : </li></ul><ul><ul><li>http://www.gradle.org/ </li></ul></ul><ul><li>Un user guide </li></ul><ul><ul><li>http://www.gradle.org/0.8/docs/userguide/userguide.html </li></ul></ul><ul><ul><li>http://www.gradle.org/0.8/docs/userguide/userguide.pdf </li></ul></ul><ul><li>Un cookbook </li></ul><ul><ul><li>http://docs.codehaus.org/display/GRADLE/Cookbook </li></ul></ul><ul><li>Le wiki projet : </li></ul><ul><ul><li>http://docs.codehaus.org/display/GRADLE/Home </li></ul></ul>
  66. 66. Support <ul><li>Liste de diffusion </li></ul><ul><ul><li>http://www.gradle.org/lists.html </li></ul></ul><ul><li>Support commercial </li></ul><ul><ul><li>http://www.gradle.biz/ </li></ul></ul>
  67. 67. LA COMMUNAUTÉ <ul><li>Apache Maven </li></ul>
  68. 68. La communauté des utilisateurs <ul><li>1780 inscrits sur la liste de diffusion des utilisateurs </li></ul><ul><li>Statistiques sur 90 jours </li></ul><ul><li>En bleu le nombre d’inscrits </li></ul><ul><li>En rouge le nombre de messages par jours </li></ul>
  69. 69. Le site web
  70. 70. Les téléchargements <ul><li>Nombre de téléchargements par mois depuis un an </li></ul>
  71. 71. L’équipe projet <ul><li>Près de 60 committeurs enregistrés, </li></ul><ul><li>Plus de 20 actifs depuis le début de l’année, </li></ul><ul><li>Des entreprises comme Sonatype ou MaestroDev fournissent des ressources pour le projet et du support professionnel pour les utilisateurs, </li></ul><ul><li>Une communauté de développeurs moins isolée : rapprochements avec Eclipse, Jetty, … </li></ul>
  72. 72. LA COMMUNAUTÉ <ul><li>EasyAnt </li></ul>
  73. 73. Vie du projet <ul><li>1 ans d'existence </li></ul><ul><li>6 développeur enregistrés </li></ul><ul><li>3 développeur actif </li></ul><ul><li>Constante évolution </li></ul><ul><li>Un produit loin d’être « parfait », </li></ul><ul><li>Encore beaucoup de choses à faire </li></ul><ul><ul><li>Aidez nous à le faire évoluer </li></ul></ul>1/2
  74. 74. LA COMMUNAUTÉ Gradle
  75. 75. La communauté des utilisateurs <ul><li>Les utilisateurs Groovy </li></ul>
  76. 76. L'équipe projet <ul><li>6 committeurs enregistrés </li></ul><ul><li>L'entreprise « Gradle inc » soutient le projet </li></ul><ul><li>De nouvelles contributions arrivent </li></ul>
  77. 77. SOUS LE CAPOT <ul><li>Diesel ou essence ? </li></ul>
  78. 78. Gradle fournit des cycles de vies (1/2) <ul><li>Ensemble de tâches prédéfinies </li></ul>Exemple du plugin 'java'
  79. 79. Des conventions de répertoires <ul><li>Gradle utilise par défaut les mêmes conventions de répertoires que Maven </li></ul><!-- répertoires --> + build.gradle +src/main/java +src/main/resources +src/main/webapp +src/test/java +src/test/resources +build/classes +build/libs +build/reports +build/test-results <!-- build.gradle --> sourceSets{ main{ java { srcDir 'src/java' } resources { srcDir 'src/resources' } } main{ java { srcDir 'src2/java' } resources { srcDir 'src2/resources' } } } Très configurable Séparation propre
  80. 80. Gestion des dépendances avec Ivy CORE UI DOCS OPEN-API WRAPPER api project-reports code-quality groovy java maven osgi war jetty scala eclipse plugins build tools Ant Ivy Maven Ant Tasks checkstyle codeNarc webdav other dependencies librairies tierces Gradle Groovy
  81. 81. Gestion des dépendances <ul><li>Support complet de repository Maven ou Ivy existant </li></ul><ul><li>Interaction possible avec un gestionnaire de configuration </li></ul><ul><ul><li>Gestion des dépendances transitives (client module) </li></ul></ul>Gradle VCS Repository Maven local/distant Repository Ivy local/distant Artifacts + méta Maven (pom.xml) Artifacts + méta Ivy (ivy.xml) Artifacts + méta gradle Ivy
  82. 82. Définition des repositories repositories { mavenCentral() mavenRepo urls:&quot;http://serveur/archiva/repo-group&quot; } repositories { flatDir name: 'localRepository', dirs: 'lib' } repositories { add( new org.apache.ivy.plugins.resolver.FileSystemResolver()){ name = 'repo' addArtifactPattern &quot; $projectDir/lib/[module]_[revision].[ext] &quot; descriptor = 'optional' checkmodified = true } }
  83. 83. Déclaration des dépendances <ul><li>Dépendances vers des modules (+deps) </li></ul>dependencies { compile &quot;log4j:log4j:1.2.14&quot; testCompile &quot;junit:junit:4.7&quot; } <ul><li>Dépendances vers des artefacts (-deps) </li></ul>dependencies { runtime &quot;org.groovy:groovy:1.5.6@jar&quot; } <ul><li>Client modules </li></ul>dependencies { runtime module(&quot;commons-lang:commons-lang:2.4&quot;) { dependency(&quot;commons-io:commons-io:1.2&quot;) } } Dépendances transitives sans XML
  84. 84. Gradle et Ant: dans les deux sens (1/2) <!-- build.xml --> <property name=&quot;src.dir&quot; value =&quot;src&quot; > <target name=&quot;compile&quot; > <echo message=&quot;Compile,from Ant&quot;/> </target> <!-- build.gradle --> ant.importBuild 'build.xml' //Complément de la tâche compile compile << { println &quot;Added compiling from Gradle&quot; println &quot;SourceDir: ${ant.properties['src.dir']}&quot; } > gradle compile :compile [ant:echo] Compile, from Ant Added compiling from Gradle SourceDir: src
  85. 85. Gradle et Ant: dans les deux sens (2/2) <!-- build.xml --> <target name=&quot; deploy &quot; depends=&quot;assemble&quot; > <echo message=&quot;Deploy, from Ant&quot;/> </target> <!-- build.gradle --> task assemble ( dependsOn: 'compile' ) << { println 'Assemble, from Gradle' } > gradle deploy :compile [ant:echo] Compile, from Ant Added compiling from Gradle :assemble Assemble, from Gradle :deploy [ant:echo] Deploy, from Ant
  86. 86. Gestion multi projet très avancée CORE UI DOCS OPEN-API WRAPPER api project-reports code-quality groovy java maven osgi war jetty scala eclipse plugins build tools Ant Ivy Maven Ant Tasks checkstyle codeNarc webdav other dependencies librairies tierces Gradle Groovy
  87. 87. Gestion multi projet (1/3) <ul><li>Les descripteurs dans les sous modules sont optionnels </li></ul><ul><li>Injection de configuration </li></ul><ul><li>Possibilité de mettre toute la logique de build dans le parent </li></ul><!-- Structure de répertoires --> + build.gradle + settings.gradle +common/ +pz/ + build.gradle -biz/ - biz-auth/ common biz-auth pz depends depends war war jar <!-- settings.gradle --> include &quot;common&quot;, &quot;pz&quot;, &quot;biz:auth&quot;
  88. 88. Gestion multi projet (2/3) <!-- master build.gradle --> subprojects { usePlugin('java') group='org.jug.normandyjug' version='1.0' repositories{ mavenCentral() } dependencies { testCompile 'junit:junit:4.7' } } project(':biz:biz-auth') { dependencies{ compile project(':common') } usePlugin 'war' } <!-- pz/build.gradle --> usePlugin 'war' dependencies{ compile project(':common') } cross project configuration
  89. 89. Gestion multi projet (3/3) /web> gradle compileJava :common:compileJava :common:processResources :common:classes :common:jar :common:uploadDefaultInternal :pz:compileJava :biz:biz-auth:compileJava /web/biz/biz-auth> gradle compileJava :common:compileJava :common:processResources :common:classes :common:jar :common:uploadDefaultInternal :biz:biz-auth:compileJava /web/biz/biz-auth> gradle compileJava -a :biz:biz-auth:compileJava Compilation des projets dépendants Utilisation des jars dans le cache
  90. 90. Gradle GUI <ul><li>Lancé par </li></ul><ul><li>> gradle –gui </li></ul><ul><li>Exécution de tâches </li></ul><ul><li>Paramétrage du niveau de log </li></ul>
  91. 91. Publie dans une infra Maven et Ivy CORE UI DOCS OPEN-API WRAPPER api project-reports code-quality groovy java maven osgi war jetty scala eclipse plugins build tools Ant Ivy Maven Ant Tasks checkstyle codeNarc webdav other dependencies librairies tierces Gradle Groovy
  92. 92. Publication dans des repo Ivy usePlugin 'java' version='1.0' uploadArchives{ repositories{ flatDir( dirs:'destRepo') } } IVY API Gradle Repository Ivy Artifacts + meta Ivy > gradle uploadArchives upload Archives
  93. 93. Publication dans des repo Maven usePlugin 'java' usePlugin 'maven' group= 'org.jug.normandyjug' archivesBaseName= 'artefact-ex' version='1.0-SNAPSHOT' uploadArchives { repositories .mavenDeployer { snapshotRepository (url: &quot;http://serveur/archiva/repository/snapshots&quot;)  } > gradle install > gradle uploadArchives Repository Maven loca l Repository Maven distant Maven Ant Tasks Gradle Artifacts + meta Maven Artifacts + meta Maven install upload Archives
  94. 94. Production de plusieurs artefacts <ul><li>Une librairie/module peut avoir plusieurs artefacts </li></ul><!-- sample/build.xml --> usePlugin 'java' task sourceJar(type: Jar) task distrib(type: Zip) artifacts{ archives sourceJar, distrib } repositories{ flatDir name:'repo', dirs:'repo' } uploadArchives { repositories { add project.repositories.repo } } > gradle uploadArchives ivy.xml Gradle upload Archives Repository Ivy dist -1.0.zip sample -1.0.jar source -1.0.jar
  95. 95. Gestion simplifié des configurations usePlugin 'java' configurations{ sources master { extendsFrom archives, sources } } artifacts{ sources sourceJar master distrib } uploadArchives { repositories{ flatDir(dirs: file('repos'), name:'destRepo') } } uploadSources { repositories{ add project.uploadArchives.repositories.destRepo } } uploadMaster .repositories=uploadSources.repositories Ajout automatique de build[ConfigurationName] et upload[ConfigurationName]
  96. 96. Agir simplement sur le cycle de vie <ul><li>Un cycle de vie Gradle est composé d'un ensemble </li></ul><ul><li>de tâches </li></ul><ul><ul><li>Chaque tâche est une propriété du projet </li></ul></ul><ul><ul><li>Chaque tâche possède une propriété « enabled » </li></ul></ul>compileTestJava.enabled=false processTestResources.enabled=false testClasses.enabled=false test.enabled=false
  97. 97. Portée des dépendances (1/2) <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2;14</version> </dependency> <dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> <version>3.0</version> <scope> provided </scope> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.2</version> </dependency> <!-- Contenu de l'archive --> WEB-INF/lib - log4j-1.2.14.jar - commons-codec-1.2jar commons-httpclient Common-codec
  98. 98. Portée des dépendances (2/2) <ul><li>Le plugin ' war ' fournit les scopes ' providedCompile ' et ' providedRuntime ' </li></ul><build.gradle --> dependencies { compile &quot;log4j:log4j:1.2.14&quot; providedCompile &quot;commons-httpclient:commons-httpclient:3.0&quot; compile &quot;commons-codec:commons-codec:1.2&quot; } <!-- Contenu de l'archive --> WEB-INF/lib - log4j-1.2.14.jar
  99. 99. Questions ?
  100. 100. Licence et droits d’auteurs <ul><li>Les photos et logos appartiennent à leurs auteurs respectifs </li></ul><ul><li>Le contenu de la présentation est sous licence Creative Commons 2.0 France </li></ul><ul><ul><li>Contrat Paternité </li></ul></ul><ul><ul><li>Pas de modification </li></ul></ul><ul><li>http://creativecommons.org/licenses/by-nd/2.0/fr/ </li></ul>
  101. 101. Sponsors

×