GRADLE                                      Grégory BOISSINOT                                           (@gboissinot)     ...
•  Consultant et formateur Zenika    – Mes spécialités: le build et lintégration continue    – Responsable technique de la...
•  Transformation dune production humaine (le code   source) en une représentation machine (le binaire)       Fichier     ...
INTERNETEvent        ENV              Bordeaux JUG - Présentation Gradle              4
•  Les besoins dautomatisation ont augmentés   significativement ces dernières années•  La nature des besoins dautomatisat...
1ère génération   2ème génération                       3ème génération    2000                      2005                 ...
<!–- ANT -- build.xml --><project>   <target name="retrieceDeps>                               <!–- MAVEN – pom.xml-->    ...
•  Système de build complet focalisé sur le build des   applications dentreprise Java, Web, Groovy, Scala et   OSGI•  Flex...
Central       java.net                              Maven                         JBoss                                 … ...
•  Spécification du quoi et pas du comment                             iture                        Fourn le              ...
On ne peut pas anticiper tous les besoins   Aucun projet nest pas pareil!Il est important de fournir au minimum le même ni...
Écrire un script Gradle consiste à assembler un ensemble déléments  autour dun objet Project                              ...
•  Conçu pour répondre à un maximum de scénarios    – Plusieurs répertoires de sources par projet    – Plusieurs artefacts...
compile   jar       test         custom                                                   build              warUn process...
Possibilité décrire du code Java/Groovy sous forme dunités detraitement réutilisables<!-- build.gradle -->task(boucleTask)...
ConventionTask                                          Mise à disposition dun ensemble                                   ...
• Les plugins Gradle• Insertion dans un environnement agile                  Bordeaux JUG - Présentation Gradle   17
Chaque plugin- est un ensemble de tâches préconfigurées- expose un objet de configuration (avec des conventions)     Plugi...
Java Configurationjava                       Object       public class JavaPluginConvention {          public SouceSetCont...
Mise à                        disposition                                                                config-1.0.gradle...
Bordeaux JUG - Présentation Gradle   21
•  Possibilité de mettre en place des exclusions globales•  Flexibilité dans la définition des dépôts repositories{   mave...
apply plugin:javaprocessResources.enabled=falsetest.onlyIf{ !project.hasProperty(skipTests)}task(preJar)                  ...
apply plugin:java                              > gradle clean build                                                 :clean...
> gradle clean buildsourceSets{                                          :clean myGenSourceSet {                          ...
CONFIGURATION PHASE                                t1         t2    t3                        t1             t2   t3      ...
Soyez informé des événements: TestListener,     BuildListener, TaskActionListener, …class MyTestListener implements TestLi...
import org.junit.Assert                                                                      > gradle myziptask myzip (typ...
Bordeaux JUG - Présentation Gradle   29
task generateTask(dependsOn:preSchemaGen) << {  ant.echo (message:"Generating ...")  ant {     def schemagenTaskPath = pat...
build.xml                   <project>                     <target name="antTarget">                       <echo message="H...
apply plugin:javarepositories {  mavenCental()  flatDir(dirs:destrepo,                                   IVY          name...
apply plugin:javaapply plugin:maven                                          Maven                                        ...
• Gestion avancée dun multi projet• Utilisation dun cache• Exécution parallèle des tests• Build daemon                   B...
// settings.gradle                                                      sharedinclude api,        shared,        services:...
1.  Le script Gradle est compilé uniquement en cas de    changement2.  Détéction des changements pour chaque entrée et    ...
class GenerateSchemaType extends DefaultTask {    String depsPath    @InputFiles    SourceDirectorySet inputXsdDirs    @Ou...
EXECUTION                                                          Process 1                                              ...
•  Utilisation dun processus parallèle pour éviter le cout de   lancement             > gradle build             ...      ...
IDE                             MaturitéNetBeansEclipse                         +IntelliJ                        ++       ...
Bordeaux JUG - Présentation Gradle   41
gmock                                                       security spock                                              in...
•  Mailing List très active•  User guide très riche (300 pages)•  Nombreuses contributions de plugins•  Le nombre darticle...
•  Fourniture de consulting et de formation                       Bordeaux JUG - Présentation Gradle   44
Bordeaux JUG - Présentation Gradle   45
•  Bootstrap pour Sonar•  Introduction de modèles de JVM basés sur la nature des   applications•  Fourniture dun DSL de co...
Bordeaux JUG - Présentation Gradle   47
• Essayez-le !• Utilisez-le !• Faites du buzz!                  Bordeaux JUG - Présentation Gradle   48
MerciBordeaux JUG - Présentation Gradle   49
Prochain SlideShare
Chargement dans…5
×

Gradle_BordeauxJUG

856 vues

Publié le

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

  • Soyez le premier à aimer ceci

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

Aucune remarque pour cette diapositive

Gradle_BordeauxJUG

  1. 1. GRADLE Grégory BOISSINOT (@gboissinot) 17/03/2011 Bordeaux JUG - Présentation Gradle 1
  2. 2. •  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 Bordeaux JUG - Présentation Gradle 2
  3. 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^ .... Bordeaux JUG - Présentation Gradle 3
  4. 4. INTERNETEvent ENV Bordeaux JUG - Présentation Gradle 4
  5. 5. •  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 Bordeaux JUG - Présentation Gradle 5
  6. 6. 1ère génération 2ème génération 3ème génération 2000 2005 2008 20082001 3 2 1 Bordeaux JUG - Présentation Gradle 6
  7. 7. <!–- 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)} Bordeaux JUG - Présentation Gradle 7
  8. 8. •  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•  Support et insertion totale dans des infrastructures Maven et Ant/Ivy existantes•  Modèle de description du build très riche à travers une API Java et une DSL Groovy Bordeaux JUG - Présentation Gradle 8
  9. 9. Central java.net Maven JBoss … Codehaus Artifacts + maven meta Ivy Repository Artifacts + ivy meta Other Repository Artifacts + custom metaBordeaux JUG - Présentation Gradle 9
  10. 10. •  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 Bordeaux JUG - Présentation Gradle 10
  11. 11. 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 Bordeaux JUG - Présentation Gradle 11
  12. 12. Écrire un script Gradle consiste à assembler un ensemble déléments autour dun objet Project configurationsbuild.gradle repositories dependencies Project ant Eléments task personnalisés artifacts Public API Bordeaux JUG - Présentation Gradle 12
  13. 13. •  Conçu pour répondre à un maximum de scénarios – Plusieurs répertoires de sources par projet – Plusieurs artefacts par projet – La mise en place de tests dintégration avec des dépendances distinctes – ....•  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 Bordeaux JUG - Présentation Gradle 13
  14. 14. compile jar test custom build warUn processus Gradleest un ensemble de tâches Bordeaux JUG - Présentation Gradle 14
  15. 15. Possibilité décrire du code Java/Groovy sous forme dunités detraitement réutilisables<!-- build.gradle -->task(boucleTask).doLast{ for (int i:[1,2,3]){ print i } > gradle boucleTask} :boucleTask 123void printMessage(String message){ println "Print " + message > gradle distribution} :distributiontask(distribution).doLast { Print Distribution printMessage("Distribution") > gradle release} :distribution Print Distributiontask(release) :releaserelease.dependsOn(distribution) Print Releaserelease.doLast{ println "Print Release"} Bordeaux JUG - Présentation Gradle 15
  16. 16. ConventionTask Mise à disposition dun ensemble de tâches - réutilisables - faciles à étendre AbstractCopyTask SourceTaskAbstractArchiveTask 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) } Bordeaux JUG - Présentation Gradle 16
  17. 17. • Les plugins Gradle• Insertion dans un environnement agile Bordeaux JUG - Présentation Gradle 17
  18. 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 Bordeaux JUG - Présentation Gradle 18
  19. 19. Java Configurationjava Object public class JavaPluginConvention { public SouceSetContainer sourceSets(); public void setSourceCompatibility(Object value); public void setTargetCompatibility(Object value); public Manifest manifest() . . . } <!-- build.gradle --> apply plugin:java sourceCompatibility = 1.6 targetCompatibility = 1.6 Bordeaux JUG - Présentation Gradle 19
  20. 20. Mise à disposition config-1.0.gradle <!– build.gradle --> task config { ... } Utilisation<!– build.gradle --> > gradle configapply from "http://repomanager/config-1.0.gradle" ...... Bordeaux JUG - Présentation Gradle 20
  21. 21. Bordeaux JUG - Présentation Gradle 21
  22. 22. •  Possibilité de mettre en place des exclusions globales•  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 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 } } } Bordeaux JUG - Présentation Gradle 22
  23. 23. 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 :checkjar { :build configurations.compile.each { from zipTree (it) } BUILD SUCCESSFUL} Bordeaux JUG - Présentation Gradle 23
  24. 24. apply plugin:java > gradle clean build :cleansourceSets{ :generateTask . . . myGenSourceSet { :compileMyGenSourceSetJava java { :processMyGenSourceSetResources srcDir output/generated :myGenSourceSetClasses } . . . }} Mise à disposition automatique dun ensemble de tâches de traitement pour le nouveau besoin fonctionnel Bordeaux JUG - Présentation Gradle 24
  25. 25. > gradle clean buildsourceSets{ :clean myGenSourceSet { :generateTask java { :compileMyGenSourceSetJava srcDir output/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} Bordeaux JUG - Présentation Gradle 25
  26. 26. 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 -> .. . ... Bordeaux JUG - Présentation Gradle 26
  27. 27. 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() }} Bordeaux JUG - Présentation Gradle 27
  28. 28. 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()) > }} Bordeaux JUG - Présentation Gradle 28
  29. 29. Bordeaux JUG - Présentation Gradle 29
  30. 30. 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") } }} Bordeaux JUG - Présentation Gradle 30
  31. 31. 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 Bordeaux JUG - Présentation Gradle 31
  32. 32. 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 Bordeaux JUG - Présentation Gradle 32
  33. 33. 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 Bordeaux JUG - Présentation Gradle 33
  34. 34. • Gestion avancée dun multi projet• Utilisation dun cache• Exécution parallèle des tests• Build daemon Bordeaux JUG - Présentation Gradle 34
  35. 35. // 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} Bordeaux JUG - Présentation Gradle 35
  36. 36. 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 Bordeaux JUG - Présentation Gradle 36
  37. 37. 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} Bordeaux JUG - Présentation Gradle 37
  38. 38. 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 } Bordeaux JUG - Présentation Gradle 38
  39. 39. •  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, ...) Bordeaux JUG - Présentation Gradle 39
  40. 40. IDE MaturitéNetBeansEclipse +IntelliJ ++ Bordeaux JUG - Présentation Gradle 40
  41. 41. Bordeaux JUG - Présentation Gradle 41
  42. 42. gmock security spock integration 4 Bordeaux JUG - Présentation Gradle 42
  43. 43. •  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 Bordeaux JUG - Présentation Gradle 43
  44. 44. •  Fourniture de consulting et de formation Bordeaux JUG - Présentation Gradle 44
  45. 45. Bordeaux JUG - Présentation Gradle 45
  46. 46. •  Bootstrap pour Sonar•  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 Bordeaux JUG - Présentation Gradle 46
  47. 47. Bordeaux JUG - Présentation Gradle 47
  48. 48. • Essayez-le !• Utilisez-le !• Faites du buzz! Bordeaux JUG - Présentation Gradle 48
  49. 49. MerciBordeaux JUG - Présentation Gradle 49

×