• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Gradle_ToulouseJUG
 

Gradle_ToulouseJUG

on

  • 840 views

 

Statistics

Views

Total Views
840
Views on SlideShare
840
Embed Views
0

Actions

Likes
0
Downloads
5
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Gradle_ToulouseJUG Gradle_ToulouseJUG Presentation Transcript

    • GRADLE Grégory BOISSINOT (@gboissinot) 16/03/2011 Toulouse JUG - Présentation Gradle 1
    • •  Consultant et formateur Zenika – Mes spécialités: le build et lintégration continue – Responsable technique de la solution dintégration continue chez Thales • ntroduction et déploiement de Gradle I•  Ancien Committer Hudson – Intégration des chaînes de build Java (Gradle), C/C++, ADA•  Committer Jenkins – Maintenance corrective et évolutive des plugins réalisés – Développement de solutions transverses Toulouse JUG - Présentation Gradle 2
    • INTERNETEvent ENV Toulouse JUG - Présentation Gradle 3
    • •  Transformation dune production humaine (le code source) en une représentation machine (le binaire) Fichier JAR Source Fichier Binaire JVM println "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^ .... Toulouse JUG - Présentation Gradle 4
    • •  Les besoins dautomatisation ont augmentés significativement ces dernières années•  La nature des besoins dautomatisation a changé Un build peut faire beaucoup plus de choses que la simple création dune archive Java Toulouse JUG - Présentation Gradle 5
    • 1ère génération 2ème génération 3ème génération 2000 2005 2008 20082001 3 2 1 Toulouse JUG - Présentation Gradle 6
    • <!–- 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)} Toulouse JUG - Présentation Gradle 7
    • •  Système de build complet focalisé sur le build des applications dentreprise Java, Web, Groovy, Scala et OSGI•  Flexible à la Ant avec les conventions de Maven à la demande•  Modèle de description du build très riche à travers une API Java et une DSL Groovy•  Support et insertion totale dans des infrastructures Maven et Ant/Ivy existantes Toulouse JUG - Présentation Gradle 8
    • Central java.net Maven JBoss … Codehaus Artifacts + maven meta Ivy Repository Artifacts + ivy meta Other Repository Artifacts + custom metaToulouse JUG - Présentation Gradle 9
    • •  Spécification du quoi et pas du comment iture Fourn le yc dun c de vie Même ntionapply plugin:java > gradle clean build conve en av :clean que Mrepositories { :compileJava src mavenCentral() :processResources} :classes myLib main .jar :jardependencies { java :assemble compile :compileTestJava resources "jdom:jdom:1.1" :processTestResources testCompile :testClasses "junit:junit:4.8" :test test} :check java :build BUILD SUCCESSFUL resources Toulouse JUG - Présentation Gradle 10
    • On ne peut pas anticiper tous les besoins Aucun projet nest pas pareil!Il est important de fournir au minimum le même niveau de supportpour les anciens projets que les nouveaux projets Toulouse JUG - Présentation Gradle 11
    • Écrire un script Gradle consiste à configurer un objet Project configurationsbuild.gradle repositories dependencies Project ant Eléments task personnalisés artifacts Public API Toulouse JUG - Présentation Gradle 12
    • •  Conçu pour répondre à un maximum de scénarios – Plusieurs répertoires de sources par projet – Des dépendances distinctes par répertoire – Plusieurs artefacts par projet – ....•  De nombreux points dextension pour enrichir les éléments existant•  La possibilité de fournir ses propres éléments qui vont former un modèle de build, le tout dans une approche déclarative Toulouse JUG - Présentation Gradle 13
    • compile jar test custom build warUn processus Gradleest un ensemble de tâches Toulouse JUG - Présentation Gradle 14
    • Possibilité décrire du code Java/Groovy sous forme dunités detraitement réutilisables<!-- build.gradle -->task(boucleTask).doFirst{ for (int i:[1,2,3]){ print i } > gradle boucleTask} :boucleTask 123void printMessage(String message){ println "Print " + message > gradle distribution} :distribution Print Distributiontask(distribution).doFirst { > gradle release printMessage("Distribution") :distribution} Print Distribution :releasetask(release) Print Releaserelease.dependsOn(distribution)release.doFirst{ println "Print Release"} Toulouse JUG - Présentation Gradle 15
    • task mycopy (type:Copy){ description =Copies the resources dir from(file(resources)) ConventionTask into(file(destination)) include(**/*.txt, **/*.xml)} SourceTask AbstractCopyTask Javadoc Copy AbstractArchiveTask Zip Tarpublic class Copy extends AbstractCopyTask { public AbstractCopyTask from(Object... sourcePaths); public AbstractCopyTask into(Object destDir); public AbstractCopyTask include(String... includes); . . . Jar} War Toulouse JUG - Présentation Gradle 16
    • <!– 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"} Toulouse JUG - Présentation Gradle 17
    • • Les plugins Gradle• Insertion dans un environnement agile Toulouse JUG - Présentation Gradle 18
    • Chaque plugin- est un ensemble de tâches préconfigurées- expose un objet de configuration (avec des conventions) Plugins maven Java Configuration Object eclipse idea Jetty Configuration War Configuration Object Object code-quality war projects-reports java … … jetty osgi … scala ... Project Configuration Toulouse JUG - Présentation Gradle 19
    • Mise à disposition config-1.0.gradle <!– build.gradle --> task config { ... } Utilisation<!– build.gradle --> > gradle configapply from "http://repomanager/config-1.0.gradle" ...... Toulouse JUG - Présentation Gradle 20
    • Toulouse JUG - Présentation Gradle 21
    • •  Flexibilité dans la définition des dépôts repositories{ mavenCentral() mavenRepo urls: "http://download.java.net/maven/2/" flatDir name: localRepository, dirs: lib }•  Possibilité de mettre en place des exclusions globales•  Possibilité de définir les dépendances transitives dans le script Gradle dependencies { runtime module("org.codehaus.groovy:groovy-all:1.7.5") { dependency("commons-cli:commons-cli:1.0") { transitive = false } } } Toulouse JUG - Présentation Gradle 22
    • apply plugin:javaprocessResources.enabled=falsetest.onlyIf{ !project.hasProperty(skipTests)} > gradle build –PskipTests//Add behavior in the lifecycle :compileJavatask(preJar) :processResources SKIPPEDjar.dependsOn preJar :classes :preJar//Change the output directory :jar :warbuildDirName=target :assemble :compileTestJava//Change the source directory :processTestResourcessourceSets{ :testClasses main{ :test SKIPPED java.srcDirs file(src/java), :check file(src/java2) :build } BUILD SUCCESSFUL} Toulouse JUG - Présentation Gradle 23
    • apply plugin:java > gradle clean build :cleansourceSets{ :generateTask . . . myGenSourceSet { :compileMyGenSourceSetJava java { :processMyGenSourceSetResources srcDir build/generated :myGenSourceSetClasses } . . . }} Mise à disposition automatique dun ensemble de tâches de traitement pour le nouveau besoin fonctionnel Toulouse JUG - Présentation Gradle 24
    • > gradle clean buildsourceSets{ :clean myGenSourceSet { :generateTask java { :compileMyGenSourceSetJava srcDir build/generated :processMyGenSourceSetResources } :myGenSourceSetClasses :compileJava main { :processResources compileClasspath = :classes configurations.compile . . . + sourceSets.myGenSourceSet.classes runtimeClasspath = classes + configurations.runtime + sourceSets.myGenSourceSet.classes }}jar { from sourceSets.myGenSourceSet.classes} Toulouse JUG - Présentation Gradle 25
    • CONFIGURATION PHASE t1 t2 t3 t1 t2 t3 EXECUTION PHASEGRADLE t4 t4 HOOKSCRIPT Project Project Engine Convention 1 Convention 2gradle –-properties version = 1.0gradle –-tasks gradle.taskGraph.whenReady { taskGraph ->gradle –-dependencies if (! taskGraph.hasTask(:release)){gradle –-dry-run build version+=- + System.currentTimeMillis()} } // Other hooks gradle.taskGraph.beforeTask { task -> .. . gradle.beforeProject { project -> .. . ... Toulouse JUG - Présentation Gradle 26
    • 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() }} Toulouse JUG - Présentation Gradle 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()) > }} Toulouse JUG - Présentation Gradle 28
    • Toulouse JUG - Présentation Gradle 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") } }} Toulouse JUG - Présentation Gradle 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 Toulouse JUG - Présentation Gradle 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 Toulouse JUG - Présentation Gradle 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 Toulouse JUG - Présentation Gradle 33
    • • Gestion avancée dun multi projet• Utilisation dun cache• Exécution parallèle des tests• Build daemon Toulouse JUG - Présentation Gradle 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} Toulouse JUG - Présentation Gradle 35
    • 1.  Le script Gradle est compilé uniquement en cas de changement2.  Détéction 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 Toulouse JUG - Présentation Gradle 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} Toulouse JUG - Présentation Gradle 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 } Toulouse JUG - Présentation Gradle 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, ...) Toulouse JUG - Présentation Gradle 39
    • IDE MaturitéNetBeansEclipse +IntelliJ ++ Toulouse JUG - Présentation Gradle 40
    • Toulouse JUG - Présentation Gradle 41
    • gmock security spock integration 4 Toulouse JUG - Présentation Gradle 42
    • •  Mailing List très active•  User guide très riche (300 pages)•  Nombreuses contributions de plugins•  Le nombre darticles et de conférences sur le sujet augmentent Toulouse JUG - Présentation Gradle 43
    • •  Fourniture de consulting et de formation Toulouse JUG - Présentation Gradle 44
    • Toulouse JUG - Présentation Gradle 45
    • •  Bootstrap pour Sonar•  Nouveau DSL de gestion des dépendances•  Introduction de modèles de JVM basés sur la nature des applications•  Fourniture dun DSL de composition du build•  Amélioration du DSL du graphe des tâches•  Réutilisation possible des plugins Maven•  Un livre en préparation Toulouse JUG - Présentation Gradle 46
    • Toulouse JUG - Présentation Gradle 47
    • • Essayez-le !• Utilisez-le !• Faites du buzz! Toulouse JUG - Présentation Gradle 48
    • MerciToulouse JUG - Présentation Gradle 49
    • •  Les meilleurs spécialistes, reconnus internationalement•  Des thématiques utilisées au jour le jour : Java Avancé, NoSQL, Clojure, HTML5, RabbitMQ, Scala, performance, Eclipse Orion, Spring, Jenkins (Hudson), services decoupling, etc.•  Vous pourrez poser toutes vos questions aux grands acteurs de la sphère Java•  Eligible aux DIF ou prise en charge par le budget de formation (FAFIEC, OPCALIA, …) http://www.whatsnextparis.com Toulouse JUG - Présentation Gradle 50