SlideShare una empresa de Scribd logo
1 de 45
GRADLE
                                  Gregory BOISSINOT
                                      23/11/2010




 Lyon 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 à grande échelle
        I

•  Commiter Hudson
    – Intégration des châines de build Java (Gradle), C/C++, ADA




                            Lyon JUG - Présentation Gradle          2
INTERNET




Lyon JUG - Présentation Gradle              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^
                                              ....
                             Lyon 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




                       Lyon 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

                   Lyon 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')
}
                            Lyon JUG - Présentation Gradle              7
•  Système de build complet focalisé sur le build des
   applications d'entreprise Java, Web, Groovy, Scala et
   OSGI

•  Modèle de description du build très riche à travers une
   API et une DSL Groovy

•  Flexible à la Ant avec les conventions de Maven à la
   demande

•  Support et insertion totale dans des infrastructures Maven
   et Ant/Ivy existantes


                        Lyon JUG - Présentation Gradle          8
•  Spécification du 'quoi' et pas du 'comment'


                                                                         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




                              Lyon JUG - Présentation Gradle                                       9
On ne peut pas anticiper tous les besoins




Il est nécessaire de fournir le même niveau de support entre les
anciens projets et les nouveaux projets




                            Lyon JUG - Présentation Gradle         10
Écrire un script Gradle consiste à configurer un objet Project



                                                   configurations
build.gradle
                       repositories
                                                                     dependencies




                                   Project                                  ant



                                                                 Eléments
                        task
                                                                 personnalisés

                                           artifacts




                                                    API
                                Lyon JUG - Présentation Gradle                      11
•  Conçu pour répondre à tous les scénarios possibles
    – Plusieurs répertoires de sources par projet
    – Une version de JDK par répertoire
    – Plusieurs artefacts par projet
    – ....

•  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



                        Lyon JUG - Présentation Gradle       12
Possibilité d'écrire du code Java/Groovy sous forme d'unités réutilisables


<!-- build.gradle -->
task(boucleTask).doFirst{
  for (int i:[1,2,3]){ print i }                         > gradle boucleTask
}                                                        :boucleTask
                                                         123
void printMessage(String message){
  println "Print " + message                             > gradle distribution
}                                                        :distribution
                                                         Print Distribution
task(distribution).doFirst {
                                                         > gradle release
    printMessage("Distribution")                         :distribution
}                                                        Print Distribution
                                                         :release
task(release)                                            Print Release
release.dependsOn(distribution)
release.doFirst{
    println "Print Release"
}
                            Lyon JUG - Présentation Gradle                       13
task mycopy (type:Copy){
  description ='Copies the resources dir'
  from(file('resources'))                                                  ConventionTask
  into(file('target'))
  include('**/*.txt', '**/*.xml')
}
                                                            SourceTask             AbstractCopyTask




                                          Javadoc                   Copy           AbstractArchiveTask




                                                                             Zip                 Tar
public class Copy extends AbstractCopyTask {
   public AbstractCopyTask from(Object... sourcePaths);
   public AbstractCopyTask into(Object destDir);
   public AbstractCopyTask include(String... includes);
   . . .                                                                     Jar
}



                                                                             War
                                   Lyon JUG - Présentation Gradle                                        14
<!– 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 Message

task(myhello, type:HelloTask)

task(myhello2, type:HelloTask){
   message="Task Message"
}



                           Lyon JUG - Présentation Gradle                       15
• Les plugins Gradle

• Insertion dans un environnement agile




                   Lyon JUG - Présentation Gradle   16
Chaque plugin
- est un ensemble de tâches
- expose un objet Java convention



      Plugins           maven
                                                                                Java Configuration
                                                                                      Object
         eclipse         idea
                                                                 Jetty Configuration    War Configuration
                                                                        Object               Object
    code-quality          war
                                                                         …                       …
  projects-reports            java
                                                                          …
       jetty           osgi

               scala
                                                                            Project
                                                                          Configuration

                                     Lyon JUG - Présentation Gradle                                         17
Mise à
                        disposition




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




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

                             Lyon JUG - Présentation Gradle                                   18
Lyon JUG - Présentation Gradle   19
•  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
         }
     }
 }
                          Lyon JUG - Présentation Gradle        20
apply plugin:'java'
                                                          > gradle build –PskipTests
processResources.enabled=false                            :compileJava
                                                          :processResources SKIPPED
                                                          :classes
test.onlyIf{                                              :preJar
 !project.hasProperty('skipTests')}                       :jar
                                                          :war
//Add behavior in the lifecycle                           :assemble
task(preJar)                                              :compileTestJava
jar.dependsOn preJar                                      :processTestResources
                                                          :testClasses
//Change the output directory                             :test SKIPPED
                                                          :check
buildDirName='target'                                     :build
//Change the source directory                             BUILD SUCCESSFUL
sourceSets{
  main{
    java.srcDirs file('src/java'),
                 file('src/java2')
  }
}
                         Lyon JUG - Présentation Gradle                            21
apply plugin:'java'                            > gradle clean build
                                               :clean
sourceSets{                                    :generateTask
                                               . . .
    myGenSourceSet {                           :compileMyGenSourceSetJava
     java {                                    :processMyGenSourceSetResources
       srcDir 'build/generated'                :myGenSourceSetClasses
     }                                         . . .
  }
}




                           Lyon JUG - Présentation Gradle                        22
> gradle clean build
sourceSets{                                         :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
}
                            Lyon JUG - Présentation Gradle                            23
CONFIGURATION PHASE

                                t1         t2   t3                           t1            t2   t3




                                                                                                     EXECUTION PHASE
GRADLE
                                      t4                                              t4




                                                                HOOK
SCRIPT


                                       Project                                         Project                         Engine
                                     Convention 1                                    Convention 2




gradle   –-properties                           version = 1.0
gradle   –-tasks                                gradle.taskGraph.whenReady { taskGraph ->
gradle   –-dependencies                            if (! taskGraph.hasTask(':release')){
gradle   –-dry-run build                             version+='-SNAPSHOT'   }
                                                }

                                                // Other hooks
                                                gradle.taskGraph.beforeTask { task -> .. .
                                                gradle.beforeProject { project -> .. .
                                                ...
                                                    Lyon JUG - Présentation Gradle                                              24
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()
    }
}




                              Lyon JUG - Présentation Gradle                         25
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())                       >
    }
}




                                  Lyon JUG - Présentation Gradle                          26
Lyon JUG - Présentation Gradle   27
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")
     }
   }
}




                        Lyon JUG - Présentation Gradle         28
build.xml
                 <project>
                   <target name="antTask">
                     <echo message="Hello from Ant"/>
                   </target>
                 </project>



 build.gradle
                 ant.importBuild('build.xml')
                 antTask.doLast {
                    println('Hello from Gradle')
                 }



> gradle antTask
:antTask
Hello from Ant
Hello from Gradle

                Lyon JUG - Présentation Gradle          29
apply plugin:'java'

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

group='test'                                                    > gradle uploadArchives
version='1.0'
status='release'

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



                         Lyon JUG - Présentation Gradle                                   30
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


                         Lyon JUG - Présentation Gradle                            31
• Gestion avancée d'un multi projet

• Utilisation d'un cache

• Exécution parallèle des tests

• Build daemon


                    Lyon JUG - Présentation Gradle   32
// 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
}
                           Lyon JUG - Présentation Gradle                           33
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



                       Lyon JUG - Présentation Gradle     34
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
}
                          Lyon JUG - Présentation Gradle                  35
EXECUTION
                                                          Process 1                                                Process 6
                  TEST    TEST    TEST    TEST    TEST                  TEST       TEST    TEST    TEST    TEST
                  SUITE   SUITE   SUITE   SUITE   SUITE                 SUITE      SUITE   SUITE   SUITE   SUITE
PARALLELISATION




                                                          Process 2                                                Process 7
                  TEST    TEST    TEST    TEST    TEST                  TEST       TEST
                  SUITE   SUITE   SUITE   SUITE   SUITE                 SUITE      SUITE

                                                          Process 3
                  TEST    TEST    TEST    TTEST   TEST
                  SUITE   SUITE   SUITE   SUITE   SUITE
                                                                          apply plugin:'java'
                                                          Process 4
                  TEST    TEST    TTEST   TEST    TEST
                  SUITE   SUITE   SUITE   SUITE   SUITE                   test {
                                                                            forkEvery = 5
                                                                            maxParallelForks = 4
                                                                          }




                                                  Lyon JUG - Présentation Gradle                                          36
•  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, ...)


                         Lyon JUG - Présentation Gradle          37
Lyon JUG - Présentation Gradle   38
gmock


  spock
                                           security




                                                      4



          Lyon JUG - Présentation Gradle                  39
•  Mailing List très active

•  User guide très riche (+280 pages)

•  Nombreuses contributions de plugins

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




                              Lyon JUG - Présentation Gradle   40
Lyon JUG - Présentation Gradle   41
•  Nouveau DSL de gestion des dépendances

•  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


                         Lyon JUG - Présentation Gradle     42
Lyon JUG - Présentation Gradle   43
• Essayez-le !

• Utilisez-le !

• Faites du buzz!




                  Lyon JUG - Présentation Gradle   44
Merci



Lyon JUG - Présentation Gradle   45

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
 
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
 
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
 
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
 
NightClazz Build Tools & Continuous Delivery
NightClazz Build Tools & Continuous DeliveryNightClazz Build Tools & Continuous Delivery
NightClazz Build Tools & Continuous DeliveryZenika
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache MavenArnaud Héritier
 
Presentation du socle technique Java open source Scub Foundation
Presentation du socle technique Java open source Scub FoundationPresentation du socle technique Java open source Scub Foundation
Presentation du socle technique Java open source Scub FoundationStéphane Traumat
 
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
 
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
 
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
 
Présentation Rex GWT 2.0
Présentation Rex GWT 2.0Présentation Rex GWT 2.0
Présentation Rex GWT 2.0Ippon
 
Présentation Maven
Présentation MavenPrésentation Maven
Présentation MavenSOAT
 
20080311 - Paris Vi Master STL TA - Initiation Maven
20080311 - Paris Vi Master STL TA - Initiation Maven20080311 - Paris Vi Master STL TA - Initiation Maven
20080311 - Paris Vi Master STL TA - Initiation 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)
 
Soiree Maven 2
Soiree Maven 2Soiree Maven 2
Soiree Maven 2
 
Sonar-Hodson-Maven
Sonar-Hodson-MavenSonar-Hodson-Maven
Sonar-Hodson-Maven
 
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
 
NightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery AvancéNightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery Avancé
 
Présentation1
Présentation1Présentation1
Présentation1
 
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
 
NightClazz Build Tools & Continuous Delivery
NightClazz Build Tools & Continuous DeliveryNightClazz Build Tools & Continuous Delivery
NightClazz Build Tools & Continuous Delivery
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven
 
Presentation du socle technique Java open source Scub Foundation
Presentation du socle technique Java open source Scub FoundationPresentation du socle technique Java open source Scub Foundation
Presentation du socle technique Java open source Scub Foundation
 
20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven
 
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
 
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
 
Présentation Rex GWT 2.0
Présentation Rex GWT 2.0Présentation Rex GWT 2.0
Présentation Rex GWT 2.0
 
Présentation Maven
Présentation MavenPrésentation Maven
Présentation Maven
 
20080311 - Paris Vi Master STL TA - Initiation Maven
20080311 - Paris Vi Master STL TA - Initiation Maven20080311 - Paris Vi Master STL TA - Initiation Maven
20080311 - Paris Vi Master STL TA - Initiation Maven
 

Destacado

Le plus beau_mus-e_du_monde
Le plus beau_mus-e_du_mondeLe plus beau_mus-e_du_monde
Le plus beau_mus-e_du_mondeAurelijus
 
Boletín ordinario nro 13
Boletín ordinario nro 13Boletín ordinario nro 13
Boletín ordinario nro 13Yasmin Cortes
 
Diapo gestion
Diapo gestionDiapo gestion
Diapo gestionloladiard
 
2011 04 06_rapport_eco_industries_pdc http://www.cgiet.org/documents/2011_04_...
2011 04 06_rapport_eco_industries_pdc http://www.cgiet.org/documents/2011_04_...2011 04 06_rapport_eco_industries_pdc http://www.cgiet.org/documents/2011_04_...
2011 04 06_rapport_eco_industries_pdc http://www.cgiet.org/documents/2011_04_...Ministère de l'Économie et des Finances
 
Eee 2011 - 05 - louis armand - villefranche
Eee   2011 - 05 - louis armand - villefrancheEee   2011 - 05 - louis armand - villefranche
Eee 2011 - 05 - louis armand - villefrancheCédric Frayssinet
 
La grue flottante
La grue flottante La grue flottante
La grue flottante AliSou0154
 
Aspectos legales del acceso abierto
Aspectos legales del acceso abiertoAspectos legales del acceso abierto
Aspectos legales del acceso abiertoErnest Abadal
 
Ce que vous allez bientôt voir
Ce que vous allez bientôt voirCe que vous allez bientôt voir
Ce que vous allez bientôt voirrotarino
 
Projet final de ia
Projet final de iaProjet final de ia
Projet final de ialilwaynefan
 
Email Marketing: Centro Comunicacion Digital
Email Marketing: Centro Comunicacion DigitalEmail Marketing: Centro Comunicacion Digital
Email Marketing: Centro Comunicacion DigitalMasterBase®
 
Collectivités locales en chiffres 2011 dgcl / http://manage.dgcl.interieur.go...
Collectivités locales en chiffres 2011 dgcl / http://manage.dgcl.interieur.go...Collectivités locales en chiffres 2011 dgcl / http://manage.dgcl.interieur.go...
Collectivités locales en chiffres 2011 dgcl / http://manage.dgcl.interieur.go...Ministère de l'Économie et des Finances
 
Atelier i5 - ETRE VISIBLE SUR FACEBOOK AUJOURD’HUI : DU GRATUIT AU PAYANT
Atelier i5 - ETRE VISIBLE SUR FACEBOOK AUJOURD’HUI : DU GRATUIT AU PAYANTAtelier i5 - ETRE VISIBLE SUR FACEBOOK AUJOURD’HUI : DU GRATUIT AU PAYANT
Atelier i5 - ETRE VISIBLE SUR FACEBOOK AUJOURD’HUI : DU GRATUIT AU PAYANTSalon e-tourisme #VeM
 
J2 JOURNEE MANAGER HÔTELLERIE DE PLEIN AIR (HPA)
J2  JOURNEE MANAGER HÔTELLERIE DE PLEIN AIR (HPA)J2  JOURNEE MANAGER HÔTELLERIE DE PLEIN AIR (HPA)
J2 JOURNEE MANAGER HÔTELLERIE DE PLEIN AIR (HPA)Salon e-tourisme #VeM
 
Plan basico de emergencia
Plan basico de emergenciaPlan basico de emergencia
Plan basico de emergenciaGloria Daza
 

Destacado (20)

Le plus beau_mus-e_du_monde
Le plus beau_mus-e_du_mondeLe plus beau_mus-e_du_monde
Le plus beau_mus-e_du_monde
 
Tiendas virtuales
Tiendas virtualesTiendas virtuales
Tiendas virtuales
 
Boletín ordinario nro 13
Boletín ordinario nro 13Boletín ordinario nro 13
Boletín ordinario nro 13
 
Diapo gestion
Diapo gestionDiapo gestion
Diapo gestion
 
2011 04 06_rapport_eco_industries_pdc http://www.cgiet.org/documents/2011_04_...
2011 04 06_rapport_eco_industries_pdc http://www.cgiet.org/documents/2011_04_...2011 04 06_rapport_eco_industries_pdc http://www.cgiet.org/documents/2011_04_...
2011 04 06_rapport_eco_industries_pdc http://www.cgiet.org/documents/2011_04_...
 
Eee 2011 - 05 - louis armand - villefranche
Eee   2011 - 05 - louis armand - villefrancheEee   2011 - 05 - louis armand - villefranche
Eee 2011 - 05 - louis armand - villefranche
 
La grue flottante
La grue flottante La grue flottante
La grue flottante
 
Carriere informatique
Carriere informatiqueCarriere informatique
Carriere informatique
 
Aspectos legales del acceso abierto
Aspectos legales del acceso abiertoAspectos legales del acceso abierto
Aspectos legales del acceso abierto
 
Ce que vous allez bientôt voir
Ce que vous allez bientôt voirCe que vous allez bientôt voir
Ce que vous allez bientôt voir
 
Projet final de ia
Projet final de iaProjet final de ia
Projet final de ia
 
Email Marketing: Centro Comunicacion Digital
Email Marketing: Centro Comunicacion DigitalEmail Marketing: Centro Comunicacion Digital
Email Marketing: Centro Comunicacion Digital
 
Collectivités locales en chiffres 2011 dgcl / http://manage.dgcl.interieur.go...
Collectivités locales en chiffres 2011 dgcl / http://manage.dgcl.interieur.go...Collectivités locales en chiffres 2011 dgcl / http://manage.dgcl.interieur.go...
Collectivités locales en chiffres 2011 dgcl / http://manage.dgcl.interieur.go...
 
08 dinámica de la geosfera
08 dinámica de la geosfera08 dinámica de la geosfera
08 dinámica de la geosfera
 
Atelier i5 - ETRE VISIBLE SUR FACEBOOK AUJOURD’HUI : DU GRATUIT AU PAYANT
Atelier i5 - ETRE VISIBLE SUR FACEBOOK AUJOURD’HUI : DU GRATUIT AU PAYANTAtelier i5 - ETRE VISIBLE SUR FACEBOOK AUJOURD’HUI : DU GRATUIT AU PAYANT
Atelier i5 - ETRE VISIBLE SUR FACEBOOK AUJOURD’HUI : DU GRATUIT AU PAYANT
 
J2 JOURNEE MANAGER HÔTELLERIE DE PLEIN AIR (HPA)
J2  JOURNEE MANAGER HÔTELLERIE DE PLEIN AIR (HPA)J2  JOURNEE MANAGER HÔTELLERIE DE PLEIN AIR (HPA)
J2 JOURNEE MANAGER HÔTELLERIE DE PLEIN AIR (HPA)
 
Plan basico de emergencia
Plan basico de emergenciaPlan basico de emergencia
Plan basico de emergencia
 
Paysages
PaysagesPaysages
Paysages
 
Livret fiscal du créateur entreprise généralités février 2010
Livret fiscal du créateur entreprise généralités février 2010Livret fiscal du créateur entreprise généralités février 2010
Livret fiscal du créateur entreprise généralités février 2010
 
Guide pratique du_createur_2011_apce
Guide pratique du_createur_2011_apceGuide pratique du_createur_2011_apce
Guide pratique du_createur_2011_apce
 

Similar a Gradle_LyonJUG

JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924Gregory Boissinot
 
Aperçu de RequireJS
Aperçu de RequireJSAperçu de RequireJS
Aperçu de RequireJSVISEO
 
Scub Foundation, usine logicielle Java libre
Scub Foundation, usine logicielle Java libreScub Foundation, usine logicielle Java libre
Scub Foundation, usine logicielle Java libreStéphane Traumat
 
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
 
0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdfOmbotimbe Salifou
 
.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
 
Ingénieur étude et développement JAVA JEE.pdf
Ingénieur étude et développement JAVA JEE.pdfIngénieur étude et développement JAVA JEE.pdf
Ingénieur étude et développement JAVA JEE.pdfJEANCLAUDECAMARA
 
Comparatif des frameworks js mv
Comparatif des frameworks js mvComparatif des frameworks js mv
Comparatif des frameworks js mvMael Monnier
 
20091020 - Normandy Jug - Builders Battle
20091020 - Normandy Jug - Builders Battle20091020 - Normandy Jug - Builders Battle
20091020 - Normandy Jug - Builders BattleArnaud Héritier
 
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
 
Être productif avec JHipster - Devoxx France 2017
Être productif avec JHipster - Devoxx France 2017Être productif avec JHipster - Devoxx France 2017
Être productif avec JHipster - Devoxx France 2017Julien Dubois
 
JavaScript dans l'usine logicielle
JavaScript dans l'usine logicielleJavaScript dans l'usine logicielle
JavaScript dans l'usine logiciellejollivetc
 
Play Framework
Play FrameworkPlay Framework
Play FrameworkArmaklan
 
Chaine de production pipeline
Chaine de production   pipelineChaine de production   pipeline
Chaine de production pipelineNicolas wallerand
 
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
 

Similar a Gradle_LyonJUG (20)

Maven
MavenMaven
Maven
 
Javavs net
Javavs netJavavs net
Javavs net
 
JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924
 
Aperçu de RequireJS
Aperçu de RequireJSAperçu de RequireJS
Aperçu de RequireJS
 
Scub Foundation, usine logicielle Java libre
Scub Foundation, usine logicielle Java libreScub Foundation, usine logicielle Java libre
Scub Foundation, usine logicielle Java libre
 
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
 
Introduction JavaEE
Introduction JavaEEIntroduction JavaEE
Introduction JavaEE
 
0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf
 
.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?
 
Ingénieur étude et développement JAVA JEE.pdf
Ingénieur étude et développement JAVA JEE.pdfIngénieur étude et développement JAVA JEE.pdf
Ingénieur étude et développement JAVA JEE.pdf
 
Comparatif des frameworks js mv
Comparatif des frameworks js mvComparatif des frameworks js mv
Comparatif des frameworks js mv
 
20091020 - Normandy Jug - Builders Battle
20091020 - Normandy Jug - Builders Battle20091020 - Normandy Jug - Builders Battle
20091020 - Normandy Jug - Builders Battle
 
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
 
Gradle
GradleGradle
Gradle
 
Être productif avec JHipster - Devoxx France 2017
Être productif avec JHipster - Devoxx France 2017Être productif avec JHipster - Devoxx France 2017
Être productif avec JHipster - Devoxx France 2017
 
Angular.pdf
Angular.pdfAngular.pdf
Angular.pdf
 
JavaScript dans l'usine logicielle
JavaScript dans l'usine logicielleJavaScript dans l'usine logicielle
JavaScript dans l'usine logicielle
 
Play Framework
Play FrameworkPlay Framework
Play Framework
 
Chaine de production pipeline
Chaine de production   pipelineChaine de production   pipeline
Chaine de production pipeline
 
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)
 

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_LyonJUG

  • 1. GRADLE Gregory BOISSINOT 23/11/2010 Lyon 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 à grande échelle I •  Commiter Hudson – Intégration des châines de build Java (Gradle), C/C++, ADA Lyon JUG - Présentation Gradle 2
  • 3. INTERNET Lyon JUG - Présentation Gradle 3
  • 4. •  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^ .... Lyon 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 Lyon 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 Lyon 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') } Lyon 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 •  Modèle de description du build très riche à travers une API et une DSL Groovy •  Flexible à la Ant avec les conventions de Maven à la demande •  Support et insertion totale dans des infrastructures Maven et Ant/Ivy existantes Lyon JUG - Présentation Gradle 8
  • 9. •  Spécification du 'quoi' et pas du 'comment' 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 Lyon JUG - Présentation Gradle 9
  • 10. On ne peut pas anticiper tous les besoins Il est nécessaire de fournir le même niveau de support entre les anciens projets et les nouveaux projets Lyon JUG - Présentation Gradle 10
  • 11. Écrire un script Gradle consiste à configurer un objet Project configurations build.gradle repositories dependencies Project ant Eléments task personnalisés artifacts API Lyon JUG - Présentation Gradle 11
  • 12. •  Conçu pour répondre à tous les scénarios possibles – Plusieurs répertoires de sources par projet – Une version de JDK par répertoire – Plusieurs artefacts par projet – .... •  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 Lyon JUG - Présentation Gradle 12
  • 13. Possibilité d'écrire du code Java/Groovy sous forme d'unités réutilisables <!-- build.gradle --> task(boucleTask).doFirst{ for (int i:[1,2,3]){ print i } > gradle boucleTask } :boucleTask 123 void printMessage(String message){ println "Print " + message > gradle distribution } :distribution Print Distribution task(distribution).doFirst { > gradle release printMessage("Distribution") :distribution } Print Distribution :release task(release) Print Release release.dependsOn(distribution) release.doFirst{ println "Print Release" } Lyon JUG - Présentation Gradle 13
  • 14. task mycopy (type:Copy){ description ='Copies the resources dir' from(file('resources')) ConventionTask into(file('target')) include('**/*.txt', '**/*.xml') } SourceTask AbstractCopyTask Javadoc Copy AbstractArchiveTask Zip Tar public class Copy extends AbstractCopyTask { public AbstractCopyTask from(Object... sourcePaths); public AbstractCopyTask into(Object destDir); public AbstractCopyTask include(String... includes); . . . Jar } War Lyon JUG - Présentation Gradle 14
  • 15. <!– 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 Message task(myhello, type:HelloTask) task(myhello2, type:HelloTask){ message="Task Message" } Lyon JUG - Présentation Gradle 15
  • 16. • Les plugins Gradle • Insertion dans un environnement agile Lyon JUG - Présentation Gradle 16
  • 17. Chaque plugin - est un ensemble de tâches - expose un objet Java convention Plugins maven Java Configuration Object eclipse idea Jetty Configuration War Configuration Object Object code-quality war … … projects-reports java … jetty osgi scala Project Configuration Lyon JUG - Présentation Gradle 17
  • 18. Mise à disposition config-1.0.gradle <!– build.gradle --> task config { ... } Utilisation <!– build.gradle --> > gradle config apply from "http://repomanager/config-1.0.gradle" ... ... Lyon JUG - Présentation Gradle 18
  • 19. Lyon JUG - Présentation Gradle 19
  • 20. •  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 } } } Lyon JUG - Présentation Gradle 20
  • 21. apply plugin:'java' > gradle build –PskipTests processResources.enabled=false :compileJava :processResources SKIPPED :classes test.onlyIf{ :preJar !project.hasProperty('skipTests')} :jar :war //Add behavior in the lifecycle :assemble task(preJar) :compileTestJava jar.dependsOn preJar :processTestResources :testClasses //Change the output directory :test SKIPPED :check buildDirName='target' :build //Change the source directory BUILD SUCCESSFUL sourceSets{ main{ java.srcDirs file('src/java'), file('src/java2') } } Lyon JUG - Présentation Gradle 21
  • 22. apply plugin:'java' > gradle clean build :clean sourceSets{ :generateTask . . . myGenSourceSet { :compileMyGenSourceSetJava java { :processMyGenSourceSetResources srcDir 'build/generated' :myGenSourceSetClasses } . . . } } Lyon JUG - Présentation Gradle 22
  • 23. > gradle clean build sourceSets{ :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 } Lyon JUG - Présentation Gradle 23
  • 24. CONFIGURATION PHASE t1 t2 t3 t1 t2 t3 EXECUTION PHASE GRADLE t4 t4 HOOK SCRIPT Project Project Engine Convention 1 Convention 2 gradle –-properties version = 1.0 gradle –-tasks gradle.taskGraph.whenReady { taskGraph -> gradle –-dependencies if (! taskGraph.hasTask(':release')){ gradle –-dry-run build version+='-SNAPSHOT' } } // Other hooks gradle.taskGraph.beforeTask { task -> .. . gradle.beforeProject { project -> .. . ... Lyon JUG - Présentation Gradle 24
  • 25. Soyez informé des événements: TestListener, BuildListener, TaskActionListener, … class MyTestListener implements TestListener{ beforeTest void beforeTest(TestDescriptor test) { GRADLE println 'testStarting: '+test.getName() } Test (junit) void afterTest(TestDescriptor test, TestResult result) { println 'testFinished: '+test.getName() afterTest +', result: '+result.getResultType() } } Lyon JUG - Présentation Gradle 25
  • 26. 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()) > } } Lyon JUG - Présentation Gradle 26
  • 27. Lyon JUG - Présentation Gradle 27
  • 28. 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") } } } Lyon JUG - Présentation Gradle 28
  • 29. build.xml <project> <target name="antTask"> <echo message="Hello from Ant"/> </target> </project> build.gradle ant.importBuild('build.xml') antTask.doLast { println('Hello from Gradle') } > gradle antTask :antTask Hello from Ant Hello from Gradle Lyon JUG - Présentation Gradle 29
  • 30. apply plugin:'java' repositories { mavenCental() flatDir(dirs:'destrepo', IVY name:'ivyrep’) } group='test' > gradle uploadArchives version='1.0' status='release' uploadArchives { repositories { add(repositories.ivyrep) } } Repository Ivy distant Artifacts + meta Ivy Lyon JUG - Présentation Gradle 30
  • 31. 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 Lyon JUG - Présentation Gradle 31
  • 32. • Gestion avancée d'un multi projet • Utilisation d'un cache • Exécution parallèle des tests • Build daemon Lyon JUG - Présentation Gradle 32
  • 33. // 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 } Lyon JUG - Présentation Gradle 33
  • 34. 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 Lyon JUG - Présentation Gradle 34
  • 35. 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 } Lyon JUG - Présentation Gradle 35
  • 36. EXECUTION Process 1 Process 6 TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST SUITE SUITE SUITE SUITE SUITE SUITE SUITE SUITE SUITE SUITE PARALLELISATION Process 2 Process 7 TEST TEST TEST TEST TEST TEST TEST SUITE SUITE SUITE SUITE SUITE SUITE SUITE Process 3 TEST TEST TEST TTEST TEST SUITE SUITE SUITE SUITE SUITE apply plugin:'java' Process 4 TEST TEST TTEST TEST TEST SUITE SUITE SUITE SUITE SUITE test { forkEvery = 5 maxParallelForks = 4 } Lyon JUG - Présentation Gradle 36
  • 37. •  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, ...) Lyon JUG - Présentation Gradle 37
  • 38. Lyon JUG - Présentation Gradle 38
  • 39. gmock spock security 4 Lyon JUG - Présentation Gradle 39
  • 40. •  Mailing List très active •  User guide très riche (+280 pages) •  Nombreuses contributions de plugins •  Le nombre d'articles et de conférences sur le sujet augmentent Lyon JUG - Présentation Gradle 40
  • 41. Lyon JUG - Présentation Gradle 41
  • 42. •  Nouveau DSL de gestion des dépendances •  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 Lyon JUG - Présentation Gradle 42
  • 43. Lyon JUG - Présentation Gradle 43
  • 44. • Essayez-le ! • Utilisez-le ! • Faites du buzz! Lyon JUG - Présentation Gradle 44
  • 45. Merci Lyon JUG - Présentation Gradle 45