gradle_lavajug

401
-1

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
401
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
8
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

gradle_lavajug

  1. 1. GRADLE Grégory BOISSINOT (@gboissinot) 14/06/2012 LavaJUG - Présentation Gradle 1
  2. 2. •  Architecte Zenika – Consultant – Formateur – Spécialiste sur lunivers de lusine logicielle•  Committer Jenkins – > 40 plugins Grade, xUnit, EnvInject, xTrigger (FSTrigger, URLTrigger, ScriptTrigger, ...), BuildContextCapture Intégration des outils pour le C++, ADA and .NET•  Contributor Gradle – Conférences – Articles – Utilisateur Gradle depuis Gradle 0.4 LavaJUG - Présentation Gradle 2
  3. 3. Build etIntégration continue LavaJUG - Présentation Gradle 3
  4. 4. •  Transformation dune production humaine (le code source) en une représentation machine (le binaire) Fichier JAR Source Build Tool Fichier Binaire JVMprintln "Hello World" A;^A^@^Am^A^@^T()Ljava/lang/Object;^C^for (int i:[1,2,3]){ @^@^@^@^A^@^KHello World^H^@2^A^@- print i org/codehaus/groovy/runtime/callsite/} CallSite^G^@4^A^@^KcallCurrent^A^@@ (Lgroovy/lang/GroovyObject; Ljava/lang/Object;)Ljava/lang/Object; ^L^@6^@7^K^@5^@8^C^@^@^@^A^L^@^H^ .... LavaJUG - Présentation Gradle 4
  5. 5. INTERNETEvent Polling SVN GIT ... LavaJUG - Présentation Gradle 5
  6. 6. •  La nature des besoins dautomatisation changent Un build peut faire beaucoup plus de choses que la simple création dune archive Java•  Les besoins dautomatisation ont augmentés significativement ces dernières années •  La portée des outils existants ne couvrait pas tous les besoins ou partiellement LavaJUG - Présentation Gradle 6
  7. 7. 1ère génération 2ème génération 3ème génération 2000 2004 2008 20082001 3 2 1 LavaJUG - Présentation Gradle 7
  8. 8. java.net Central Maven … Codehaus JBoss Artifacts + maven meta Ivy Repository Artifacts + ivy meta Other Repository Artifacts + custom metaLavaJUG - Présentation Gradle 8
  9. 9. <!–- ANT -- build.xml --><project> <target name="retrieceDeps> <!–- MAVEN – pom.xml--> ... <?xml version="1.0" encoding="UTF-8"?> </target> <project> <target name="compile" ... <modelVersion>4.0.0</modelVersion></project> <groupId>org.lyonjug</groupId> <artifactId>maven</artifactId><!–- GRADLE– build.gradle --> <version>1.0</version>apply plugin:java <dependencies> <dependency>version=1.0 <groupId>org.apache.wicket</groupId> <artifactId>wicket</artifactId>repositories { <version>1.4.7</version> mavenCental() <scope>compile</scope> flatDir(dirs:lib) </dependency>} </dependencies> </project>dependencies { compile( group:org.apache.wicket, name:wicket, version:1.4.7)} LavaJUG - Présentation Gradle 9
  10. 10. •  Peut-on anticiper tous les besoins dautomatisation? – Est-ce que tous les projets sont identiques? – Est-ce que le besoin dautomatisation évolue au cours du cycle de vie du projet?•  Souhaite-on uniformiser lautomatisation entre les anciens projets et les nouveaux projets ?•  Quelles sont les compétences des personnes – qui vont mettre en place les processus de build? – qui vont maintenir les descripteurs de build? LavaJUG - Présentation Gradle 10
  11. 11. GRADLELavaJUG - Présentation Gradle 11
  12. 12. DSLConventions Flexibilité LavaJUG - Présentation Gradle 12
  13. 13. •  Un langage de build (API) – A la frontière entre un langage de script et un modèle statique•  Les conventions de Maven à la demande – Facilite lapprentissage et la migration•  De nombreux cycles de construction (cycle de vie) fournies par défaut•  Build incrémental à tous les niveaux•  Systèmes de plugins LavaJUG - Présentation Gradle 13
  14. 14. •  Une réutilisation native des tâches Ant•  Lecture et écriture dans un repository Maven (Nexus, Artifactory, Archiva, etc)•  Gestion de dépendances simple, flexible et puissante – Des concepts et des mécanismes issus de Ivy LavaJUG - Présentation Gradle 14
  15. 15. •  Gradle tente de résoudre les problèmes Maven suivants: •  Difficulté de personnalisation du cycle de vie •  Mauvaise granularité entre phase et plugins •  Gestion des dépendances difficile •  Non distinction des dépendances de type projet et de type externes •  Lié strictement à un pattern de version •  Pas de possibilité les algorithmes de résolution •  1 seul artefact par projet (par défaut) •  Difficulté de mise en place des tests dintégration •  Difficulté de packaging -complexe LavaJUG Présentation Gradle 15
  16. 16. •  Spécification du quoi et pas du comment iture Fourn le yc dun c de vie Même ntion > gradle clean build conve en avapply plugin:java :clean que M :compileJava srcrepositories { :processResources} :classes myLib main :jar .jardependencies { java :assemble} :compileTestJava resources :processTestResources :testClasses :test test :check java :build BUILD SUCCESSFUL resources LavaJUG - Présentation Gradle 16
  17. 17. Écrire un script Gradle consiste à configurer un élément Project configurationsbuild.gradle repositories dependencies Project ant Eléments task personnalisés artifacts Public API LavaJUG - Présentation Gradle 17
  18. 18. apply plugin:javaversion = 1.0 APIrepositories{ Gradle mavenCentral()} API Java/dependencies{ Groovy compile "log4j:log4j:1.2.16" testCompile "junit:junit:4.7" > gradle build :compileJava} :processResources :classestask release << { :jar println "Release" :assemble} :compileTestJava :processTestResourcesvoid printMessage(String message){ :testClasses println "Print " + message :test :check} :build LavaJUG - Présentation Gradle 18
  19. 19. apply plugin:javaprocessResources.enabled=falsetest.onlyIf{ !project.hasProperty(skipTests)}task(preJar) > gradle build –PskipTestsjar.dependsOn preJar :compileJava :processResources SKIPPED//Change the source directory :classessourceSets{ :preJar main{ :jar :assemble java.srcDirs file(src/java), :compileTestJava file(src/java2) :processTestResources } :testClasses} :test SKIPPED :check//Création dun uberjar :buildjar { configurations.compile.each { BUILD SUCCESSFUL from zipTree (it) }} LavaJUG - Présentation Gradle 19
  20. 20. ConventionTask Mise à disposition dun ensemble de tâches prédéfinies AbstractCopyTask SourceTask Facile à Facile à utiliser étendreAbstractArchiveTask Copy Javadoc public class Copy extends AbstractCopyTask { public AbstractCopyTask from(Object... sourcePaths); Zip Tar public AbstractCopyTask into(Object destDir); public AbstractCopyTask include(String... includes); . . . } Jar task mycopy (type:Copy){ description =Copies the resources dir from(file(resources)) into(file(destination)) War include(**/*.txt, **/*.xml) } LavaJUG - Présentation Gradle 20
  21. 21. <!– HelloTask.groovy -->class HelloTask extends DefaultTask { def message="Default Message" @TaskAction public void print(){ > gradle myhello println message :myhello } Default Message} > gradle myhello2 :myhello2<!-- build.gradle --> Task Messagetask(myhello, type:HelloTask)task(myhello2, type:HelloTask){ message="Task Message"} LavaJUG - Présentation Gradle 21
  22. 22. java Java Configuration Objectpublic class JavaPluginConvention { public SouceSetContainer sourceSets(); public void setSourceCompatibility(Object value); public void setTargetCompatibility(Object value); public Manifest manifest() . . .} <!-- build.gradle --> Facile à apply plugin:java mettre en Simple à place et apprendre facile à sourceCompatibility = 1.6 maintenir targetCompatibility = 1.6 LavaJUG - Présentation Gradle 22
  23. 23. LavaJUG - Présentation Gradle 23
  24. 24. CONFIGURATION PHASE t1 t2 t3 t1 t2 t3 EXECUTION PHASEGRADLE t4 t4 HOOKSCRIPT Project Project Engine Convention 1 Convention 2gradle properties gradle.taskGraph.whenReady { taskGraph ->gradle tasks if (taskGraph.hasTask(:release)){gradle dependencies status = releasegradle –-dry-run build } } // Other hooks gradle.taskGraph.beforeTask { task -> .. . gradle.beforeProject { project -> .. . ... LavaJUG - Présentation Gradle 24
  25. 25. Soyez informé des événements: TestListener, BuildListener, TaskActionListener, …class MyTestListener implements TestListener{ beforeTest void beforeTest(TestDescriptor test) { GRADLE println testStarting: +test.getName() } Test (junit) void afterTest(TestDescriptor test, TestResult result) { println testFinished: +test.getName() afterTest +, result: +result.getResultType() }} LavaJUG - Présentation Gradle 25
  26. 26. Les scripts dinitialisation permettent dinvoquer différents listeners au chargement du script//Script dinitialisationaddListener(new ApplyEclipsePlugin())class ApplyEclipsePlugin extends BuildAdapter { Invoquer par défaut public void projectsEvaluated(Gradle gradle){ si placé dans le gradle.rootProject.allprojects { home de apply plugin:eclipse lutilisateur } }}gradle eclipse –I init.gradle LavaJUG - Présentation Gradle 26
  27. 27. import org.junit.Assert > gradle myziptask myzip (type:Zip) { :myzip from(somedir) include(*.txt) baseName=zipname doLast { Assert.assertEquals(zipname.zip, myzip.archiveName) createZip Assert.assertEquals(file(build/distributions), myzip.destinationDir) Assert.assertTrue( zipname .zip !zipTree(myzip.archivePath).isEmpty()) txtfiles = fileTree(somedir).include(*.txt) check ziptxtfiles=zipTree(myzip.archivePath).matching{ include(*.txt) } Assert.assertEquals ( txtfiles.getFiles().size(), BUILD SUCCESSFUL ziptxtfiles.getFiles().size()) > }} LavaJUG - Présentation Gradle 27
  28. 28. LavaJUG - Présentation Gradle 28
  29. 29. task generateTask(dependsOn:preSchemaGen) << { ant.echo (message:"Generating ...") ant { def schemagenTaskPath = path { fileset(dirs:lib, includes: *.jar) } taskdef ( name: "xjc", classname: "com.sun.tools.xjc.XJCTask", classpath: schemagenTaskPath ) xjc(destdir:generatedSources, package:"com.zenika.lib.model"){ schema(dir:"src/main/resources", includes:"**/*.xsd") } }} LavaJUG - Présentation Gradle 29
  30. 30. build.xml <project> <target name="antTarget"> <echo message="Hello from Ant"/> </target> </project> build.gradle ant.importBuild(build.xml) antTarget.doLast { println(Hello from Gradle) }> gradle antTarget:antTargetHello from AntHello from Gradle LavaJUG - Présentation Gradle 30
  31. 31. apply plugin:javarepositories { mavenCental() flatDir(dirs:destrepo, IVY name:ivyrep’)}group=com.zenika.gradledemos > gradle uploadArchivesversion=1.0status=releaseuploadArchives { repositories { add(repositories.ivyrep) }} Repository Ivy distant Artifacts + meta Ivy LavaJUG - Présentation Gradle 31
  32. 32. apply plugin:javaapply plugin:maven Maven Antgroup=test Tasksversion=1.0-SNAPSHOTuploadArchives { repositories { mavenDeployer { repository( > gradle > gradle install uploadArchives url: remoteRepo) } }} Repository Repository Maven Maven Local Artifacts + distant Artifacts + meta Maven meta Maven LavaJUG - Présentation Gradle 32
  33. 33. • Gestion avancée dun multi projet• Utilisation dun cache• Exécution parallèle des tests• Build daemon LavaJUG - Présentation Gradle 33
  34. 34. // settings.gradle sharedinclude api, shared, services:webservices webservices api// root build.gradlesubprojects { api > gradle buildNeeded apply plugin: java :shared:jar} :api:jarproject(:api) { :api:test dependencies { :shared:test compile project(:shared) }} api > gradle buildDependents :shared:jar :api:jar// webservices/build.gradleapply plugin:war :api:test :webservices:wardependencies { :webservices:test compile project(:shared), project(:api), api > gradle jar –-no-rebuild commons-io:commons-io:1.2 api:jar} LavaJUG - Présentation Gradle 34
  35. 35. 1.  Le script Gradle est compilé uniquement en cas de changement2.  Détection des changements pour chaque entrée et chaque sortie pour la plupart des tâches fournies > gradle myzip :myzip > gradle myzip :myzip UP-TO-DATE > gradle myzip –-cache rebuild :myzip LavaJUG - Présentation Gradle 35
  36. 36. class GenerateSchemaType extends DefaultTask { String depsPath @InputFiles SourceDirectorySet inputXsdDirs @OutputDirectory File outputFile > gradle build :generateTask UP-TO-DATE @TaskAction :compileGeneratedJava UP-TO-DATE void generate() { :processGeneratedResources UP-TO-DATE ant { ...} :generatedClasses UP-TO-DATE } :compileJava UP-TO-DATE} ...task generateTask(type:GenerateSchemaType) { inputXsdDirs = sourceSets.main.resources outputFile = generatedSources depsPath = configurations.jaxb.asPath} LavaJUG - Présentation Gradle 36
  37. 37. EXECUTION Process 1 Process 6 TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST CLASS CLASS CLASS CLASS CLASS CLASS CLASS CLASS CLASS CLASSPARALLELISATION Process 2 Process 7 TEST TEST TEST TEST TEST TEST TEST CLASS CLASS CLASS CLASS CLASS CLASS CLASS Process 3 TEST TEST TEST TEST TEST CLASS CLASS CLASS CLASS CLASS apply plugin:java Process 4 TEST TEST TEST TEST TEST CLASS CLASS CLASS CLASS CLASS test { forkEvery = 5 maxParallelForks = 4 } LavaJUG - Présentation Gradle 37
  38. 38. •  Utilisation dun processus parallèle pour éviter le cout de lancement > gradle build ... Total time: 3s > gradle build –daemon ... Total time: 3s > gradle build ... Total time: 1s•  Va favoriser lintégration de Gradle avec Gradle UI et les IDE (Eclipse, IDEA, ...) LavaJUG - Présentation Gradle 38
  39. 39. IDE MaturitéNetBeansEclipse +Eclipse STS ++Idea IntelliJ ++ LavaJUG - Présentation Gradle 39
  40. 40. HUDSON JENKINSFonctionnalités:- Installation automatique de Gradle (via URL, Run Script)- Wizard de configuration- Utilisation possible du Gradle wrapper- Dry-Run- Coloration syntaxique LavaJUG - Présentation Gradle 40
  41. 41. Environment Instancie Processus identifié (traçabilité) et répétable DEPLOY TEST BUILD RELEASE INSTALL VALIDATION LavaJUG - Présentation Gradle 41
  42. 42. gmock security spock integration 4 LavaJUG - Présentation Gradle 42
  43. 43. •  Mailing List très active•  User guide très riche (400 pages)•  Nombreuses contributions de plugins•  Le nombre darticles et de conférences augmentent LavaJUG - Présentation Gradle 43
  44. 44. LavaJUG - Présentation Gradle 44
  45. 45. •  Des besoins spécifiques de construction •  Structure de répertoires propre au projet •  Définition dun cycle de vie personnalisé •  Plusieurs artefacts par projet•  Des besoins spécifiques de tests •  Tests dintégration complexe •  Tests sur plusieurs JDK •  Beaucoup de tests à paralléliser•  Gestion fine des dépendances•  Build incrémental à plusieurs niveaux•  Définition de modèle de build (proche des concepts de Maven) LavaJUG - Présentation Gradle 45
  46. 46. •  Comme tous les outils, un outil de build ne simpose pas•  Ne pas lopposer à Maven ou à Ant mais lutiliser comme complément •  Construction avec Gradle et déploiement dans un repo Maven •  Réutilisation des scripts Ant existants et surcharge/ réécriture des cible Ant existantes (sans modifications des scripts actuels)•  Solution parfaite pour construire son propre modèle de build entreprise adapté à ses besoins •  Gradle est utilisé comme un framework •  Lutilisation de Gradle est caché (GradleWrapper) LavaJUG - Présentation Gradle 46
  47. 47. •  Utiliser Gradle comme un langage de build (API, réutilisabilité de modules, orientation objet, ...) et pas juste un langage de script de luxe•  Cadrer les descripteurs Gradle dun projet à un autre •  Des revues de code des scripts sont à prévoir •  Comme tout code source, le build évolue et donc est soumis à des refactoring réguliers •  Essayer dabstraire des modèles de build réutilisables•  Utiliser une version stable LavaJUG - Présentation Gradle 47
  48. 48. Questions? LavaJUG - Présentation Gradle 48
  49. 49. LavaJUG - Présentation Gradle 49

×