SlideShare una empresa de Scribd logo
1 de 49
GRADLE
                                      Grégory BOISSINOT
                                           (@gboissinot)
                                            17/03/2011




 Bordeaux JUG - Présentation Gradle                        1
•  Consultant et formateur Zenika
    – Mes spécialités: le build et l'intégration continue
    – Responsable technique de la solution d'inté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
•  Transformation d'une 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
INTERNET



Event




        ENV




              Bordeaux JUG - Présentation Gradle              4
•  Les besoins d'automatisation ont augmentés
   significativement ces dernières années

•  La nature des besoins d'automatisation a changé
    Un build peut faire beaucoup plus de choses que la
    simple création d'une archive Java




                      Bordeaux JUG - Présentation Gradle   5
1ère génération   2ème génération                       3ème génération
    2000                      2005                             2008

                                                        2008

2001


                                                                           3


                                                2

               1

                   Bordeaux 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')
}
                           Bordeaux JUG - Présentation Gradle           7
•  Système de build complet focalisé sur le build des
   applications d'entreprise 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
Central       java.net
                              Maven


                         JBoss                                 …
                                        Codehaus

                                                           Artifacts +
                                                           maven meta




                        Ivy
                     Repository
                     Artifacts +
                      ivy meta
                                          Other
                                        Repository
                                             Artifacts +
                                            custom meta


Bordeaux JUG - Présentation Gradle                                       9
•  Spécification du 'quoi' et pas du 'comment'
                             iture
                        Fourn le
                              yc
                        d'un c
                           de vie
                                                                               Même
                                                                                   ntion
apply plugin:'java'    > gradle clean build                                  conve en
                                                                                    av
                       :clean                                                 que M
repositories {         :compileJava
                                                                                  src
  mavenCentral()       :processResources
}                      :classes                                      myLib              main
                                                                     .jar
                       :jar
dependencies {                                                                                 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
On ne peut pas anticiper tous les besoins
   Aucun projet n'est pas pareil!




Il est important de fournir au minimum le même niveau de support
pour les anciens projets que les nouveaux projets




                           Bordeaux JUG - Présentation Gradle      11
Écrire un script Gradle consiste à assembler un ensemble d'éléments
  autour d'un objet 'Project'


                                                   configurations
build.gradle
                      repositories
                                                                       dependencies




                                   Project                                    ant



                                                                   Eléments
                       task
                                                                   personnalisés

                                           artifacts




                                                 Public
                                                  API
                              Bordeaux JUG - Présentation Gradle                      12
•  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 d'intégration avec des
      dépendances distinctes
    – ....

•  De nombreux points d'extension 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
compile   jar       test         custom

                                                   build
              war


Un processus Gradle
est un ensemble de tâches

                    Bordeaux JUG - Présentation Gradle     14
Possibilité d'écrire du code Java/Groovy sous forme d'unités de
traitement réutilisables

<!-- build.gradle -->
task(boucleTask).doLast{
  for (int i:[1,2,3]){ print i }                          > gradle boucleTask
}                                                         :boucleTask
                                                          123
void printMessage(String message){
  println "Print " + message                              > gradle distribution
}                                                         :distribution
task(distribution).doLast {                               Print Distribution
    printMessage("Distribution")
                                                          > gradle release
}                                                         :distribution
                                                          Print Distribution
task(release)                                             :release
release.dependsOn(distribution)                           Print Release
release.doLast{
    println "Print Release"
}

                           Bordeaux JUG - Présentation Gradle                     15
ConventionTask                                          Mise à disposition d'un ensemble
                                                         de tâches
                                                         - réutilisables
                                                         - faciles à étendre
 AbstractCopyTask     SourceTask




AbstractArchiveTask     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
• 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)



     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
Java Configuration
java                       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
Mise à
                        disposition




                                                                config-1.0.gradle
 <!– build.gradle -->
 task config {
   ...
 }
                                   Utilisation




<!– build.gradle -->                                                          > gradle config
apply from "http://repomanager/config-1.0.gradle"                             ...
...

                           Bordeaux JUG - Présentation Gradle                                   20
Bordeaux JUG - Présentation Gradle   21
•  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
apply plugin:'java'

processResources.enabled=false
test.onlyIf{
 !project.hasProperty('skipTests')}

task(preJar)                                                 > gradle build –PskipTests
jar.dependsOn preJar                                         :compileJava
                                                             :processResources SKIPPED
//Change the source directory                                :classes
sourceSets{                                                  :preJar
  main{                                                      :jar
                                                             :assemble
    java.srcDirs file('src/java'),                           :compileTestJava
                 file('src/java2')                           :processTestResources
  }                                                          :testClasses
}                                                            :test SKIPPED
                                                             :check
jar {                                                        :build
  configurations.compile.each {
      from zipTree (it) }                                    BUILD SUCCESSFUL
}
                        Bordeaux JUG - Présentation Gradle                           23
apply plugin:'java'                              > gradle clean build
                                                 :clean
sourceSets{                                      :generateTask
                                                 . . .
  myGenSourceSet {                               :compileMyGenSourceSetJava
    java {                                       :processMyGenSourceSetResources
      srcDir 'output/generated'                  :myGenSourceSetClasses
    }                                            . . .
  }
}



  Mise à disposition automatique d'un ensemble de tâches de traitement
                    pour le nouveau besoin fonctionnel




                           Bordeaux JUG - Présentation Gradle                      24
> gradle clean build
sourceSets{                                          :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
CONFIGURATION PHASE

                                t1         t2    t3                        t1             t2   t3




                                                                                                    EXECUTION PHASE
GRADLE
                                      t4                                             t4




                                                              HOOK
SCRIPT


                                       Project                                     Project                            Engine
                                     Convention 1                                Convention 2




gradle   –-properties                            gradle.taskGraph.whenReady { taskGraph ->
gradle   –-tasks                                   if (taskGraph.hasTask(':release')){
gradle   –-dependencies                                  status = 'release'
gradle   –-dry-run build                           }
                                                 }

                                                 // Other hooks
                                                 gradle.taskGraph.beforeTask { task -> .. .
                                                 gradle.beforeProject { project -> .. .
                                                 ...
                                                Bordeaux 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()
    }
}




                            Bordeaux JUG - Présentation Gradle                         27
import org.junit.Assert
                                                                      > gradle myzip
task 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
Bordeaux 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")
     }
   }
}




                      Bordeaux 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
:antTarget
Hello from Ant
Hello from Gradle

                Bordeaux JUG - Présentation Gradle        31
apply plugin:'java'

repositories {
  mavenCental()
  flatDir(dirs:'destrepo',                                   IVY
          name:'ivyrep’)
}

group='com.zenika.gradledemos'                                 > gradle uploadArchives
version='1.0'
status='release'

uploadArchives {
  repositories {
    add(repositories.ivyrep)
  }
}                                                        Repository
                                                            Ivy
                                                          distant Artifacts +
                                                                      meta Ivy



                        Bordeaux JUG - Présentation Gradle                               32
apply plugin:'java'
apply plugin:'maven'                                          Maven
                                                               Ant
group='test'                                                  Tasks
version='1.0-SNAPSHOT'

uploadArchives {
  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
• Gestion avancée d'un multi projet

• Utilisation d'un cache

• Exécution parallèle des tests

• Build daemon


                   Bordeaux JUG - Présentation Gradle   34
// settings.gradle                                                      shared
include 'api',
        'shared',
        'services:webservices'
                                                               webservices       api
// root build.gradle
subprojects {                                   api > gradle buildNeeded
  apply plugin: 'java'                          :shared:jar
}                                               :api:jar
project(':api') {                               :api:test
  dependencies {                                :shared:test
    compile project(':shared')
  }
}                                               api > gradle buildDependents
                                                :shared:jar
                                                :api:jar
// webservices/build.gradle
apply plugin:'war'                              :api:test
                                                :webservices:war
dependencies {
                                                :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
1.  Le script Gradle est compilé uniquement en cas de
    changement


2.  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
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
EXECUTION
                                                          Process 1                                                Process 6
                   TEST    TEST    TEST    TEST    TEST                   TEST          TEST    TEST    TEST    TEST
                  CLASS   CLASS   CLASS   CLASS   CLASS                  CLASS         CLASS   CLASS   CLASS   CLASS
PARALLELISATION




                                                          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
•  Utilisation d'un 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 l'intégration de Gradle avec Gradle UI et les
   IDE (Eclipse, IDEA, ...)


                        Bordeaux JUG - Présentation Gradle       39
IDE                             Maturité
NetBeans
Eclipse                         +
IntelliJ                        ++



           Bordeaux JUG - Présentation Gradle   40
Bordeaux JUG - Présentation Gradle   41
gmock

                                                       security
 spock



                                              integration




                                                            4



         Bordeaux JUG - Présentation Gradle                       42
•  Mailing List très active

•  User guide très riche (300 pages)

•  Nombreuses contributions de plugins

•  Le nombre d'articles et de conférences sur le sujet
   augmentent




                         Bordeaux JUG - Présentation Gradle   43
•  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 d'un 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
Bordeaux JUG - Présentation Gradle   47
• Essayez-le !

• Utilisez-le !

• Faites du buzz!




                  Bordeaux JUG - Présentation Gradle   48
Merci



Bordeaux JUG - Présentation Gradle   49

Más contenido relacionado

La actualidad más candente

Présentation Gradle au LyonJUG par Grégory Boissinot - Zenika
Présentation Gradle au LyonJUG par Grégory Boissinot - ZenikaPrésentation Gradle au LyonJUG par Grégory Boissinot - Zenika
Présentation Gradle au LyonJUG par Grégory Boissinot - ZenikaZenika
 
Presentation of GWT 2.4 (PDF version)
Presentation of GWT 2.4 (PDF version)Presentation of GWT 2.4 (PDF version)
Presentation of GWT 2.4 (PDF version)Celinio Fernandes
 
Presentation of GWT 2.4 (PowerPoint version)
Presentation of GWT 2.4 (PowerPoint version)Presentation of GWT 2.4 (PowerPoint version)
Presentation of GWT 2.4 (PowerPoint version)Celinio Fernandes
 
CDI mis en pratique avec Seam Social et Weld OSGI
CDI mis en pratique avec Seam Social et Weld OSGICDI mis en pratique avec Seam Social et Weld OSGI
CDI mis en pratique avec Seam Social et Weld OSGIAntoine Sabot-Durand
 
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileNouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileIppon
 
JCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratiqueJCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratiqueRossi Oddet
 
GWT Principes & Techniques
GWT Principes & TechniquesGWT Principes & Techniques
GWT Principes & TechniquesRachid NID SAID
 
Quand java prend de la vitesse, apache maven vous garde sur les rails
Quand java prend de la vitesse, apache maven vous garde sur les railsQuand java prend de la vitesse, apache maven vous garde sur les rails
Quand java prend de la vitesse, apache maven vous garde sur les railsArnaud Héritier
 
Support formation vidéo : Construire et administrer vos conteneurs avec Docker
Support formation vidéo : Construire et administrer vos conteneurs avec DockerSupport formation vidéo : Construire et administrer vos conteneurs avec Docker
Support formation vidéo : Construire et administrer vos conteneurs avec DockerSmartnSkilled
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache MavenArnaud Héritier
 
NightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery AvancéNightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery AvancéZenika
 
Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008Guillaume Laforge
 
Gwt jetty et sources de données
Gwt   jetty et sources de donnéesGwt   jetty et sources de données
Gwt jetty et sources de donnéesFranck SIMON
 
Déploiement d'une application Java EE dans Azure
Déploiement d'une application Java EE dans AzureDéploiement d'une application Java EE dans Azure
Déploiement d'une application Java EE dans AzureJosé Paumard
 
20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache MavenArnaud Héritier
 

La actualidad más candente (20)

Présentation Gradle au LyonJUG par Grégory Boissinot - Zenika
Présentation Gradle au LyonJUG par Grégory Boissinot - ZenikaPrésentation Gradle au LyonJUG par Grégory Boissinot - Zenika
Présentation Gradle au LyonJUG par Grégory Boissinot - Zenika
 
Presentation of GWT 2.4 (PDF version)
Presentation of GWT 2.4 (PDF version)Presentation of GWT 2.4 (PDF version)
Presentation of GWT 2.4 (PDF version)
 
Presentation of GWT 2.4 (PowerPoint version)
Presentation of GWT 2.4 (PowerPoint version)Presentation of GWT 2.4 (PowerPoint version)
Presentation of GWT 2.4 (PowerPoint version)
 
Présentation1
Présentation1Présentation1
Présentation1
 
Soiree Maven 2
Soiree Maven 2Soiree Maven 2
Soiree Maven 2
 
Sonar-Hodson-Maven
Sonar-Hodson-MavenSonar-Hodson-Maven
Sonar-Hodson-Maven
 
CDI mis en pratique avec Seam Social et Weld OSGI
CDI mis en pratique avec Seam Social et Weld OSGICDI mis en pratique avec Seam Social et Weld OSGI
CDI mis en pratique avec Seam Social et Weld OSGI
 
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileNouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
 
JCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratiqueJCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratique
 
GWT Principes & Techniques
GWT Principes & TechniquesGWT Principes & Techniques
GWT Principes & Techniques
 
Quand java prend de la vitesse, apache maven vous garde sur les rails
Quand java prend de la vitesse, apache maven vous garde sur les railsQuand java prend de la vitesse, apache maven vous garde sur les rails
Quand java prend de la vitesse, apache maven vous garde sur les rails
 
Support formation vidéo : Construire et administrer vos conteneurs avec Docker
Support formation vidéo : Construire et administrer vos conteneurs avec DockerSupport formation vidéo : Construire et administrer vos conteneurs avec Docker
Support formation vidéo : Construire et administrer vos conteneurs avec Docker
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven
 
NightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery AvancéNightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery Avancé
 
Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008
 
Gwt jetty et sources de données
Gwt   jetty et sources de donnéesGwt   jetty et sources de données
Gwt jetty et sources de données
 
Springioc
SpringiocSpringioc
Springioc
 
Android ORMLite
Android   ORMLiteAndroid   ORMLite
Android ORMLite
 
Déploiement d'une application Java EE dans Azure
Déploiement d'une application Java EE dans AzureDéploiement d'une application Java EE dans Azure
Déploiement d'une application Java EE dans Azure
 
20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven
 

Destacado

Atelier I14 L’Accueil numérique dans les destinations : l’heure de vérité
Atelier I14 L’Accueil numérique dans les destinations : l’heure de véritéAtelier I14 L’Accueil numérique dans les destinations : l’heure de vérité
Atelier I14 L’Accueil numérique dans les destinations : l’heure de véritéSalon e-tourisme #VeM
 
Romanticismo_Níjar
Romanticismo_NíjarRomanticismo_Níjar
Romanticismo_Níjarjomarmo
 
201001 Outillage agile
201001 Outillage agile201001 Outillage agile
201001 Outillage agilelyonjug
 
Resolució obres cobriment riera
Resolució obres cobriment rieraResolució obres cobriment riera
Resolució obres cobriment rieraERCMalgrat
 
Debat d'orientation sur les fp pour 2012 rapport d'information 616 senat, se...
Debat d'orientation sur les fp pour 2012  rapport d'information 616 senat, se...Debat d'orientation sur les fp pour 2012  rapport d'information 616 senat, se...
Debat d'orientation sur les fp pour 2012 rapport d'information 616 senat, se...Ministère de l'Économie et des Finances
 
Etienne Guicherd - L’expérience Mondial Ping 2013
Etienne Guicherd - L’expérience Mondial Ping 2013Etienne Guicherd - L’expérience Mondial Ping 2013
Etienne Guicherd - L’expérience Mondial Ping 2013CREPS de Montpellier
 
Soho Restaurant Buisnes menu
Soho Restaurant Buisnes menuSoho Restaurant Buisnes menu
Soho Restaurant Buisnes menusrul864
 
Présentation pacte (parti 1)
Présentation pacte (parti 1)Présentation pacte (parti 1)
Présentation pacte (parti 1)Richard Bergeron
 
Boletín ordinario nro 6
Boletín ordinario nro 6Boletín ordinario nro 6
Boletín ordinario nro 6Yasmin Cortes
 
Dossier de presse février 2014 Théâtre La Coupole Saint-Louis
Dossier de presse février 2014 Théâtre La Coupole Saint-LouisDossier de presse février 2014 Théâtre La Coupole Saint-Louis
Dossier de presse février 2014 Théâtre La Coupole Saint-LouisBâle Région Mag
 
Atelier J6 Quoi de neuf dans mes outils numériques pour les hôtels ?
Atelier J6 Quoi de neuf dans mes outils numériques pour les hôtels ?Atelier J6 Quoi de neuf dans mes outils numériques pour les hôtels ?
Atelier J6 Quoi de neuf dans mes outils numériques pour les hôtels ?Salon e-tourisme #VeM
 

Destacado (20)

Atelier I14 L’Accueil numérique dans les destinations : l’heure de vérité
Atelier I14 L’Accueil numérique dans les destinations : l’heure de véritéAtelier I14 L’Accueil numérique dans les destinations : l’heure de vérité
Atelier I14 L’Accueil numérique dans les destinations : l’heure de vérité
 
Identidad de marca
Identidad de marcaIdentidad de marca
Identidad de marca
 
Romanticismo_Níjar
Romanticismo_NíjarRomanticismo_Níjar
Romanticismo_Níjar
 
Charte mobilite fonction publique etat dgafp_dec 2010
Charte mobilite fonction publique etat dgafp_dec 2010Charte mobilite fonction publique etat dgafp_dec 2010
Charte mobilite fonction publique etat dgafp_dec 2010
 
201001 Outillage agile
201001 Outillage agile201001 Outillage agile
201001 Outillage agile
 
De la crise financiere a la crise economique
De la crise financiere a la crise economiqueDe la crise financiere a la crise economique
De la crise financiere a la crise economique
 
Resolució obres cobriment riera
Resolució obres cobriment rieraResolució obres cobriment riera
Resolució obres cobriment riera
 
Exemple
ExempleExemple
Exemple
 
Debat d'orientation sur les fp pour 2012 rapport d'information 616 senat, se...
Debat d'orientation sur les fp pour 2012  rapport d'information 616 senat, se...Debat d'orientation sur les fp pour 2012  rapport d'information 616 senat, se...
Debat d'orientation sur les fp pour 2012 rapport d'information 616 senat, se...
 
Etienne Guicherd - L’expérience Mondial Ping 2013
Etienne Guicherd - L’expérience Mondial Ping 2013Etienne Guicherd - L’expérience Mondial Ping 2013
Etienne Guicherd - L’expérience Mondial Ping 2013
 
Aéroport Dole-Jura : saison 2014
Aéroport Dole-Jura : saison 2014Aéroport Dole-Jura : saison 2014
Aéroport Dole-Jura : saison 2014
 
Une seconde avant
Une seconde avantUne seconde avant
Une seconde avant
 
Bottup
Bottup Bottup
Bottup
 
Soho Restaurant Buisnes menu
Soho Restaurant Buisnes menuSoho Restaurant Buisnes menu
Soho Restaurant Buisnes menu
 
Présentation pacte (parti 1)
Présentation pacte (parti 1)Présentation pacte (parti 1)
Présentation pacte (parti 1)
 
Boletín ordinario nro 6
Boletín ordinario nro 6Boletín ordinario nro 6
Boletín ordinario nro 6
 
Dossier de presse février 2014 Théâtre La Coupole Saint-Louis
Dossier de presse février 2014 Théâtre La Coupole Saint-LouisDossier de presse février 2014 Théâtre La Coupole Saint-Louis
Dossier de presse février 2014 Théâtre La Coupole Saint-Louis
 
Rapport donneespubliques2011 ecole des ponts paristech
Rapport donneespubliques2011 ecole des ponts paristechRapport donneespubliques2011 ecole des ponts paristech
Rapport donneespubliques2011 ecole des ponts paristech
 
Atelier J6 Quoi de neuf dans mes outils numériques pour les hôtels ?
Atelier J6 Quoi de neuf dans mes outils numériques pour les hôtels ?Atelier J6 Quoi de neuf dans mes outils numériques pour les hôtels ?
Atelier J6 Quoi de neuf dans mes outils numériques pour les hôtels ?
 
Cómo narrar en web
Cómo narrar en webCómo narrar en web
Cómo narrar en web
 

Similar a Gradle_BordeauxJUG

JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924Gregory Boissinot
 
SLIDES-625.1.1-IDL-4-build tools maven.pdf
SLIDES-625.1.1-IDL-4-build tools maven.pdfSLIDES-625.1.1-IDL-4-build tools maven.pdf
SLIDES-625.1.1-IDL-4-build tools maven.pdfArouNa3
 
Aperçu de RequireJS
Aperçu de RequireJSAperçu de RequireJS
Aperçu de RequireJSVISEO
 
.Net pour le développeur Java - une source d'inspiration?
.Net pour le développeur Java - une source d'inspiration?.Net pour le développeur Java - une source d'inspiration?
.Net pour le développeur Java - une source d'inspiration?Rui Carvalho
 
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)hibnico
 
Comparatif des frameworks js mv
Comparatif des frameworks js mvComparatif des frameworks js mv
Comparatif des frameworks js mvMael Monnier
 
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013Julien Jakubowski
 
Introduction à SBT
Introduction à SBTIntroduction à SBT
Introduction à SBTJean Detoeuf
 
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...XavierPestel
 
Spring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'tsSpring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'tsJulien Wittouck
 
Présentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'OfflinePrésentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'OfflineDNG Consulting
 
0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdfOmbotimbe Salifou
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EEInes Ouaz
 
Play framework - Human Talks Grenoble - 12.02.2013
Play framework - Human Talks Grenoble - 12.02.2013Play framework - Human Talks Grenoble - 12.02.2013
Play framework - Human Talks Grenoble - 12.02.2013Xavier NOPRE
 

Similar a Gradle_BordeauxJUG (20)

Maven
MavenMaven
Maven
 
JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924
 
SLIDES-625.1.1-IDL-4-build tools maven.pdf
SLIDES-625.1.1-IDL-4-build tools maven.pdfSLIDES-625.1.1-IDL-4-build tools maven.pdf
SLIDES-625.1.1-IDL-4-build tools maven.pdf
 
Javavs net
Javavs netJavavs net
Javavs net
 
Aperçu de RequireJS
Aperçu de RequireJSAperçu de RequireJS
Aperçu de RequireJS
 
.Net pour le développeur Java - une source d'inspiration?
.Net pour le développeur Java - une source d'inspiration?.Net pour le développeur Java - une source d'inspiration?
.Net pour le développeur Java - une source d'inspiration?
 
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
 
Comparatif des frameworks js mv
Comparatif des frameworks js mvComparatif des frameworks js mv
Comparatif des frameworks js mv
 
Gradle
GradleGradle
Gradle
 
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
Du JavaScript propre ? Challenge accepted ! @Devoxx France 2013
 
Introduction à SBT
Introduction à SBTIntroduction à SBT
Introduction à SBT
 
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
 
Spring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'tsSpring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'ts
 
Présentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'OfflinePrésentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'Offline
 
0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf
 
Programmation Java
Programmation JavaProgrammation Java
Programmation Java
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EE
 
Maven et industrialisation du logiciel
Maven et industrialisation du logicielMaven et industrialisation du logiciel
Maven et industrialisation du logiciel
 
Introduction JavaEE
Introduction JavaEEIntroduction JavaEE
Introduction JavaEE
 
Play framework - Human Talks Grenoble - 12.02.2013
Play framework - Human Talks Grenoble - 12.02.2013Play framework - Human Talks Grenoble - 12.02.2013
Play framework - Human Talks Grenoble - 12.02.2013
 

Más de Gregory Boissinot

Más de Gregory Boissinot (13)

Practical Software Architecture DDD
Practical Software Architecture DDDPractical Software Architecture DDD
Practical Software Architecture DDD
 
DDD Introduction
DDD IntroductionDDD Introduction
DDD Introduction
 
SOAT Agile Day 2017 DDD
SOAT Agile Day 2017 DDDSOAT Agile Day 2017 DDD
SOAT Agile Day 2017 DDD
 
DevDay2017 ESGI Essential DDD
DevDay2017 ESGI Essential DDDDevDay2017 ESGI Essential DDD
DevDay2017 ESGI Essential DDD
 
Beyond Relational Databases
Beyond Relational DatabasesBeyond Relational Databases
Beyond Relational Databases
 
Paris Redis Meetup Introduction
Paris Redis Meetup IntroductionParis Redis Meetup Introduction
Paris Redis Meetup Introduction
 
Paris Redis Meetup Starting
Paris Redis Meetup StartingParis Redis Meetup Starting
Paris Redis Meetup Starting
 
PZ_Microservices101_20150210
PZ_Microservices101_20150210PZ_Microservices101_20150210
PZ_Microservices101_20150210
 
Spring Integration JUG SummerCamp 2013
Spring Integration JUG SummerCamp 2013Spring Integration JUG SummerCamp 2013
Spring Integration JUG SummerCamp 2013
 
Jenkins-meetup
Jenkins-meetupJenkins-meetup
Jenkins-meetup
 
JENKINS_BreizhJUG_20111003
JENKINS_BreizhJUG_20111003JENKINS_BreizhJUG_20111003
JENKINS_BreizhJUG_20111003
 
Jenkins_UserMeetup_Paris_201105
Jenkins_UserMeetup_Paris_201105Jenkins_UserMeetup_Paris_201105
Jenkins_UserMeetup_Paris_201105
 
Gradle_YaJUG
Gradle_YaJUGGradle_YaJUG
Gradle_YaJUG
 

Gradle_BordeauxJUG

  • 1. GRADLE Grégory BOISSINOT (@gboissinot) 17/03/2011 Bordeaux JUG - Présentation Gradle 1
  • 2. •  Consultant et formateur Zenika – Mes spécialités: le build et l'intégration continue – Responsable technique de la solution d'inté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. •  Transformation d'une 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. INTERNET Event ENV Bordeaux JUG - Présentation Gradle 4
  • 5. •  Les besoins d'automatisation ont augmentés significativement ces dernières années •  La nature des besoins d'automatisation a changé Un build peut faire beaucoup plus de choses que la simple création d'une archive Java Bordeaux JUG - Présentation Gradle 5
  • 6. 1ère génération 2ème génération 3ème génération 2000 2005 2008 2008 2001 3 2 1 Bordeaux JUG - Présentation Gradle 6
  • 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. •  Système de build complet focalisé sur le build des applications d'entreprise 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. Central java.net Maven JBoss … Codehaus Artifacts + maven meta Ivy Repository Artifacts + ivy meta Other Repository Artifacts + custom meta Bordeaux JUG - Présentation Gradle 9
  • 10. •  Spécification du 'quoi' et pas du 'comment' iture Fourn le yc d'un c de vie Même ntion apply plugin:'java' > gradle clean build conve en av :clean que M repositories { :compileJava src mavenCentral() :processResources } :classes myLib main .jar :jar dependencies { 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. On ne peut pas anticiper tous les besoins Aucun projet n'est pas pareil! Il est important de fournir au minimum le même niveau de support pour les anciens projets que les nouveaux projets Bordeaux JUG - Présentation Gradle 11
  • 12. Écrire un script Gradle consiste à assembler un ensemble d'éléments autour d'un objet 'Project' configurations build.gradle repositories dependencies Project ant Eléments task personnalisés artifacts Public API Bordeaux JUG - Présentation Gradle 12
  • 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 d'intégration avec des dépendances distinctes – .... •  De nombreux points d'extension 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. compile jar test custom build war Un processus Gradle est un ensemble de tâches Bordeaux JUG - Présentation Gradle 14
  • 15. Possibilité d'écrire du code Java/Groovy sous forme d'unités de traitement réutilisables <!-- build.gradle --> task(boucleTask).doLast{ for (int i:[1,2,3]){ print i } > gradle boucleTask } :boucleTask 123 void printMessage(String message){ println "Print " + message > gradle distribution } :distribution task(distribution).doLast { Print Distribution printMessage("Distribution") > gradle release } :distribution Print Distribution task(release) :release release.dependsOn(distribution) Print Release release.doLast{ println "Print Release" } Bordeaux JUG - Présentation Gradle 15
  • 16. ConventionTask Mise à disposition d'un ensemble de tâches - réutilisables - faciles à étendre AbstractCopyTask SourceTask AbstractArchiveTask 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. • Les plugins Gradle • Insertion dans un environnement agile Bordeaux JUG - Présentation Gradle 17
  • 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. Java Configuration java 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. Mise à disposition config-1.0.gradle <!– build.gradle --> task config { ... } Utilisation <!– build.gradle --> > gradle config apply from "http://repomanager/config-1.0.gradle" ... ... Bordeaux JUG - Présentation Gradle 20
  • 21. Bordeaux JUG - Présentation Gradle 21
  • 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. apply plugin:'java' processResources.enabled=false test.onlyIf{ !project.hasProperty('skipTests')} task(preJar) > gradle build –PskipTests jar.dependsOn preJar :compileJava :processResources SKIPPED //Change the source directory :classes sourceSets{ :preJar main{ :jar :assemble java.srcDirs file('src/java'), :compileTestJava file('src/java2') :processTestResources } :testClasses } :test SKIPPED :check jar { :build configurations.compile.each { from zipTree (it) } BUILD SUCCESSFUL } Bordeaux JUG - Présentation Gradle 23
  • 24. apply plugin:'java' > gradle clean build :clean sourceSets{ :generateTask . . . myGenSourceSet { :compileMyGenSourceSetJava java { :processMyGenSourceSetResources srcDir 'output/generated' :myGenSourceSetClasses } . . . } } Mise à disposition automatique d'un ensemble de tâches de traitement pour le nouveau besoin fonctionnel Bordeaux JUG - Présentation Gradle 24
  • 25. > gradle clean build sourceSets{ :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. CONFIGURATION PHASE t1 t2 t3 t1 t2 t3 EXECUTION PHASE GRADLE t4 t4 HOOK SCRIPT Project Project Engine Convention 1 Convention 2 gradle –-properties gradle.taskGraph.whenReady { taskGraph -> gradle –-tasks if (taskGraph.hasTask(':release')){ gradle –-dependencies status = 'release' gradle –-dry-run build } } // Other hooks gradle.taskGraph.beforeTask { task -> .. . gradle.beforeProject { project -> .. . ... Bordeaux JUG - Présentation Gradle 26
  • 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. import org.junit.Assert > gradle myzip task 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. Bordeaux JUG - Présentation Gradle 29
  • 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. 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 :antTarget Hello from Ant Hello from Gradle Bordeaux JUG - Présentation Gradle 31
  • 32. apply plugin:'java' repositories { mavenCental() flatDir(dirs:'destrepo', IVY name:'ivyrep’) } group='com.zenika.gradledemos' > gradle uploadArchives version='1.0' status='release' uploadArchives { repositories { add(repositories.ivyrep) } } Repository Ivy distant Artifacts + meta Ivy Bordeaux JUG - Présentation Gradle 32
  • 33. apply plugin:'java' apply plugin:'maven' Maven Ant group='test' Tasks version='1.0-SNAPSHOT' uploadArchives { 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. • Gestion avancée d'un multi projet • Utilisation d'un cache • Exécution parallèle des tests • Build daemon Bordeaux JUG - Présentation Gradle 34
  • 35. // settings.gradle shared include 'api', 'shared', 'services:webservices' webservices api // root build.gradle subprojects { api > gradle buildNeeded apply plugin: 'java' :shared:jar } :api:jar project(':api') { :api:test dependencies { :shared:test compile project(':shared') } } api > gradle buildDependents :shared:jar :api:jar // webservices/build.gradle apply plugin:'war' :api:test :webservices:war dependencies { :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. 1.  Le script Gradle est compilé uniquement en cas de changement 2.  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. 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. EXECUTION Process 1 Process 6 TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST CLASS CLASS CLASS CLASS CLASS CLASS CLASS CLASS CLASS CLASS PARALLELISATION 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. •  Utilisation d'un 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 l'intégration de Gradle avec Gradle UI et les IDE (Eclipse, IDEA, ...) Bordeaux JUG - Présentation Gradle 39
  • 40. IDE Maturité NetBeans Eclipse + IntelliJ ++ Bordeaux JUG - Présentation Gradle 40
  • 41. Bordeaux JUG - Présentation Gradle 41
  • 42. gmock security spock integration 4 Bordeaux JUG - Présentation Gradle 42
  • 43. •  Mailing List très active •  User guide très riche (300 pages) •  Nombreuses contributions de plugins •  Le nombre d'articles et de conférences sur le sujet augmentent Bordeaux JUG - Présentation Gradle 43
  • 44. •  Fourniture de consulting et de formation Bordeaux JUG - Présentation Gradle 44
  • 45. Bordeaux JUG - Présentation Gradle 45
  • 46. •  Bootstrap pour Sonar •  Introduction de modèles de JVM basés sur la nature des applications •  Fourniture d'un 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. Bordeaux JUG - Présentation Gradle 47
  • 48. • Essayez-le ! • Utilisez-le ! • Faites du buzz! Bordeaux JUG - Présentation Gradle 48
  • 49. Merci Bordeaux JUG - Présentation Gradle 49