SlideShare uma empresa Scribd logo
1 de 50
GRADLE
                                      Grégory BOISSINOT
                                           (@gboissinot)
                                            16/03/2011




 Toulouse JUG - Présentation Gradle                        1
•  Consultant et formateur Zenika
    – Mes spécialités: le build et 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


                           Toulouse JUG - Présentation Gradle       2
INTERNET


Event




        ENV




              Toulouse 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^
                                                ....
                             Toulouse 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




                       Toulouse 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

                   Toulouse JUG - Présentation Gradle                          6
<!–- ANT -- build.xml -->
<project>
   <target name="retrieceDeps>
                               <!–- MAVEN – pom.xml-->
     ...
                               <?xml version="1.0" encoding="UTF-8"?>
   </target>
                               <project>
   <target name="compile" ...
                                 <modelVersion>4.0.0</modelVersion>
</project>
                                 <groupId>org.lyonjug</groupId>
                                 <artifactId>maven</artifactId>
<!–- GRADLE– build.gradle -->    <version>1.0</version>
apply plugin:'java'              <dependencies>
                                   <dependency>
version=1.0                          <groupId>org.apache.wicket</groupId>
                                     <artifactId>wicket</artifactId>
repositories {                       <version>1.4.7</version>
   mavenCental()                     <scope>compile</scope>
   flatDir(dirs:'lib')             </dependency>
}                                </dependencies>
                               </project>
dependencies {
  compile(
    group:'org.apache.wicket',
    name:'wicket',
    version:'1.4.7')
}
                           Toulouse JUG - Présentation Gradle           7
•  Système de build complet focalisé sur le build des
   applications d'entreprise Java, Web, Groovy, Scala et
   OSGI

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

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

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


                       Toulouse JUG - Présentation Gradle       8
Central       java.net
                              Maven


                         JBoss                                 …
                                        Codehaus

                                                           Artifacts +
                                                           maven meta




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


Toulouse 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




                                Toulouse 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




                           Toulouse JUG - Présentation Gradle      11
Écrire un script Gradle consiste à configurer un objet Project



                                                    configurations
build.gradle
                       repositories
                                                                        dependencies




                                    Project                                    ant



                                                                    Eléments
                        task
                                                                    personnalisés

                                            artifacts




                                                  Public
                                                   API
                               Toulouse JUG - Présentation Gradle                      12
•  Conçu pour répondre à un maximum de scénarios
    – Plusieurs répertoires de sources par projet
    – Des dépendances distinctes par répertoire
    – Plusieurs artefacts par projet
    – ....

•  De nombreux points 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


                       Toulouse JUG - Présentation Gradle    13
compile   jar       test         custom

                                                   build
              war


Un processus Gradle
est un ensemble de tâches

                    Toulouse 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).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"
}
                           Toulouse JUG - Présentation Gradle                     15
task mycopy (type:Copy){
  description ='Copies the resources dir'
  from(file('resources'))                                                     ConventionTask
  into(file('destination'))
  include('**/*.txt', '**/*.xml')
}
                                                             SourceTask               AbstractCopyTask




                                           Javadoc                     Copy           AbstractArchiveTask




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



                                                                                War
                                  Toulouse JUG - Présentation Gradle                                        16
<!– HelloTask.groovy -->
class HelloTask extends DefaultTask {

    def message="Default Message"

    @TaskAction
    public void print(){                                     > gradle myhello
      println message                                        :myhello
    }                                                        Default Message
}                                                            > gradle myhello2
                                                             :myhello2
<!-- build.gradle -->                                        Task Message

task(myhello, type:HelloTask)

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



                        Toulouse JUG - Présentation Gradle                       17
• Les plugins Gradle

• Insertion dans un environnement agile




                  Toulouse JUG - Présentation Gradle   18
Chaque plugin
- est un ensemble de tâches préconfigurées
- expose un objet de configuration (avec des conventions)



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


       jetty         osgi                                              …

        scala
                    ...                                                  Project
                                                                       Configuration

                                Toulouse JUG - Présentation Gradle                                       19
Mise à
                        disposition




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




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

                            Toulouse JUG - Présentation Gradle                                   20
Toulouse JUG - Présentation Gradle   21
•  Flexibilité dans la définition des dépôts
  repositories{
    mavenCentral()
    mavenRepo urls: "http://download.java.net/maven/2/"
    flatDir name: 'localRepository', dirs: 'lib'
  }

•  Possibilité de mettre en place des exclusions globales
•  Possibilité de définir les dépendances transitives dans le
   script Gradle

  dependencies {
      runtime module("org.codehaus.groovy:groovy-all:1.7.5") {
          dependency("commons-cli:commons-cli:1.0") {
              transitive = false
          }
      }
  }
                         Toulouse JUG - Présentation Gradle      22
apply plugin:'java'

processResources.enabled=false

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



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




                           Toulouse JUG - Présentation Gradle                      24
> 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
}
                           Toulouse 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                           version = 1.0
gradle   –-tasks                                gradle.taskGraph.whenReady { taskGraph ->
gradle   –-dependencies                           if (! taskGraph.hasTask(':release')){
gradle   –-dry-run build                           version+='-' + System.currentTimeMillis()}
                                                }

                                                // Other hooks
                                                gradle.taskGraph.beforeTask { task -> .. .
                                                gradle.beforeProject { project -> .. .
                                                ...
                                                Toulouse JUG - Présentation Gradle                                             26
Soyez informé des événements: TestListener,
     BuildListener, TaskActionListener, …

class MyTestListener implements TestListener{
                                                                           beforeTest
    void beforeTest(TestDescriptor test) {




                                                                  GRADLE
      println 'testStarting: '+test.getName()
    }                                                                       Test
                                                                              (junit)
    void afterTest(TestDescriptor test,
                   TestResult result) {
      println 'testFinished: '+test.getName()                              afterTest
           +', result: '+result.getResultType()
    }
}




                             Toulouse JUG - Présentation Gradle                         27
import org.junit.Assert
                                                                      > gradle 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())                          >
    }
}




                                 Toulouse JUG - Présentation Gradle                          28
Toulouse JUG - Présentation Gradle   29
task generateTask(dependsOn:preSchemaGen) << {
  ant.echo (message:"Generating ...")
  ant {
     def schemagenTaskPath = path {
       fileset(dirs:'lib', includes: '*.jar')
     }
     taskdef (
       name: "xjc", classname: "com.sun.tools.xjc.XJCTask",
       classpath: schemagenTaskPath
     )
     xjc(destdir:generatedSources,
         package:"com.zenika.lib.model"){
           schema(dir:"src/main/resources", includes:"**/*.xsd")
     }
   }
}




                       Toulouse JUG - Présentation Gradle      30
build.xml
                   <project>
                     <target name="antTarget">
                       <echo message="Hello from Ant"/>
                     </target>
                   </project>



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



> gradle antTarget
:antTarget
Hello from Ant
Hello from Gradle

                Toulouse 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



                        Toulouse 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


                         Toulouse JUG - Présentation Gradle                            33
• Gestion avancée d'un multi projet

• Utilisation d'un cache

• Exécution parallèle des tests

• Build daemon


                   Toulouse 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
}
                          Toulouse 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



                      Toulouse JUG - Présentation Gradle   36
class GenerateSchemaType extends DefaultTask {

    String depsPath

    @InputFiles
    SourceDirectorySet inputXsdDirs

    @OutputDirectory
    File outputFile
                                       > gradle build
                                       :generateTask UP-TO-DATE
    @TaskAction                        :compileGeneratedJava UP-TO-DATE
    void generate() {                  :processGeneratedResources UP-TO-DATE
      ant { ...}                       :generatedClasses UP-TO-DATE
    }                                  :compileJava UP-TO-DATE
}                                      ...

task generateTask(type:GenerateSchemaType) {
  inputXsdDirs = sourceSets.main.resources
  outputFile = generatedSources
  depsPath = configurations.jaxb.asPath
}
                         Toulouse JUG - Présentation Gradle                37
EXECUTION
                                                          Process 1                                                Process 6
                   TEST    TEST    TEST    TEST    TEST                   TEST          TEST    TEST    TEST    TEST
                  CLASS   CLASS   CLASS   CLASS   CLASS                  CLASS         CLASS   CLASS   CLASS   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
                                                                            }




                                                  Toulouse 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, ...)


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



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

                                                       security
 spock



                                              integration




                                                            4



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

•  User guide très riche (300 pages)

•  Nombreuses contributions de plugins

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




                          Toulouse JUG - Présentation Gradle   43
•  Fourniture de consulting et de formation




                       Toulouse JUG - Présentation Gradle   44
Toulouse JUG - Présentation Gradle   45
•  Bootstrap pour Sonar

•  Nouveau DSL de gestion des dépendances

•  Introduction de modèles de JVM basés sur la nature des
   applications

•  Fourniture 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
                          Toulouse JUG - Présentation Gradle   46
Toulouse JUG - Présentation Gradle   47
• Essayez-le !

• Utilisez-le !

• Faites du buzz!




                  Toulouse JUG - Présentation Gradle   48
Merci



Toulouse JUG - Présentation Gradle   49
•  Les meilleurs spécialistes, reconnus internationalement

•  Des thématiques utilisées au jour le jour :
   Java Avancé, NoSQL, Clojure, HTML5, RabbitMQ, Scala,
   performance, Eclipse Orion, Spring, Jenkins (Hudson),
   services decoupling, etc.

•  Vous pourrez poser toutes vos questions aux grands
   acteurs de la sphère Java

•  Eligible aux DIF ou prise en charge par le budget de
   formation (FAFIEC, OPCALIA, …)

         http://www.whatsnextparis.com


                       Toulouse JUG - Présentation Gradle    50

Mais conteúdo relacionado

Mais procurados

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
 
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
 
Une (simple) présentation de Apache Maven 2
Une (simple) présentation de Apache Maven 2Une (simple) présentation de Apache Maven 2
Une (simple) présentation de Apache Maven 2teejug
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache MavenArnaud Héritier
 
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
 
JCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratiqueJCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratiqueRossi Oddet
 
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
 
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
 
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
 
Devoxx 2018 Après Java 8, Java 9 et 10
Devoxx 2018 Après Java 8, Java 9 et 10Devoxx 2018 Après Java 8, Java 9 et 10
Devoxx 2018 Après Java 8, Java 9 et 10Jean-Michel Doudoux
 
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
 
Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Jean-Michel Doudoux
 
Voxxeddays lux 2018 apres java 8, java 9 et 10
Voxxeddays lux 2018 apres java 8, java 9 et 10Voxxeddays lux 2018 apres java 8, java 9 et 10
Voxxeddays lux 2018 apres java 8, java 9 et 10Jean-Michel Doudoux
 
GWT Principes & Techniques
GWT Principes & TechniquesGWT Principes & Techniques
GWT Principes & TechniquesRachid NID SAID
 
Présentation Maven
Présentation MavenPrésentation Maven
Présentation MavenSOAT
 

Mais procurados (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
 
Présentation1
Présentation1Présentation1
Présentation1
 
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)
 
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
 
Sonar-Hodson-Maven
Sonar-Hodson-MavenSonar-Hodson-Maven
Sonar-Hodson-Maven
 
Soiree Maven 2
Soiree Maven 2Soiree Maven 2
Soiree Maven 2
 
Une (simple) présentation de Apache Maven 2
Une (simple) présentation de Apache Maven 2Une (simple) présentation de Apache Maven 2
Une (simple) présentation de Apache Maven 2
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven
 
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)
 
JCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratiqueJCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratique
 
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
 
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
 
Android ORMLite
Android   ORMLiteAndroid   ORMLite
Android ORMLite
 
NightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery AvancéNightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery Avancé
 
Devoxx 2018 Après Java 8, Java 9 et 10
Devoxx 2018 Après Java 8, Java 9 et 10Devoxx 2018 Après Java 8, Java 9 et 10
Devoxx 2018 Après Java 8, Java 9 et 10
 
20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven
 
Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017
 
Voxxeddays lux 2018 apres java 8, java 9 et 10
Voxxeddays lux 2018 apres java 8, java 9 et 10Voxxeddays lux 2018 apres java 8, java 9 et 10
Voxxeddays lux 2018 apres java 8, java 9 et 10
 
GWT Principes & Techniques
GWT Principes & TechniquesGWT Principes & Techniques
GWT Principes & Techniques
 
Présentation Maven
Présentation MavenPrésentation Maven
Présentation Maven
 

Destaque

CMD 2012 - Veille informationnelle : diffuser et organiser avec des outils gr...
CMD 2012 - Veille informationnelle : diffuser et organiser avec des outils gr...CMD 2012 - Veille informationnelle : diffuser et organiser avec des outils gr...
CMD 2012 - Veille informationnelle : diffuser et organiser avec des outils gr...Elsa Drevon
 
Fabrication numérique en Livradois-Forez ?
Fabrication numérique en Livradois-Forez ?Fabrication numérique en Livradois-Forez ?
Fabrication numérique en Livradois-Forez ?Meidosem
 
Prévoir le referencement - WMM by NeoterizeA / Buzzeff
Prévoir le referencement - WMM by NeoterizeA / BuzzeffPrévoir le referencement - WMM by NeoterizeA / Buzzeff
Prévoir le referencement - WMM by NeoterizeA / BuzzeffBUZZEFF MEA
 
Atelier T13 - Gérer sa e-réputation et en faire un atout commercial - Salon e...
Atelier T13 - Gérer sa e-réputation et en faire un atout commercial - Salon e...Atelier T13 - Gérer sa e-réputation et en faire un atout commercial - Salon e...
Atelier T13 - Gérer sa e-réputation et en faire un atout commercial - Salon e...Salon e-tourisme #VeM
 
Baromètre Hopscotch de l'e-réputation des laboratoires pharmaceutiques
Baromètre Hopscotch de l'e-réputation des laboratoires pharmaceutiquesBaromètre Hopscotch de l'e-réputation des laboratoires pharmaceutiques
Baromètre Hopscotch de l'e-réputation des laboratoires pharmaceutiquesAgence Hopscotch
 
Les séniors et le crédit à la consommation
Les séniors et le crédit à la consommationLes séniors et le crédit à la consommation
Les séniors et le crédit à la consommationCA Consumer Finance
 
Memoire sur l'enjeu de l'ouverture des donnees publiques 2011
Memoire sur l'enjeu de l'ouverture des donnees publiques 2011Memoire sur l'enjeu de l'ouverture des donnees publiques 2011
Memoire sur l'enjeu de l'ouverture des donnees publiques 2011Olivier Laurent
 
Investissements au myanmar formation de la société au myanmar, vietnam, l'i...
Investissements au myanmar   formation de la société au myanmar, vietnam, l'i...Investissements au myanmar   formation de la société au myanmar, vietnam, l'i...
Investissements au myanmar formation de la société au myanmar, vietnam, l'i...AnyaS19
 
Exercicescorrigesdivers
ExercicescorrigesdiversExercicescorrigesdivers
ExercicescorrigesdiversKarim Amane
 
Presentation are sofer bis RHT 15.10.12
Presentation are sofer bis RHT 15.10.12Presentation are sofer bis RHT 15.10.12
Presentation are sofer bis RHT 15.10.12alain jeannot
 
Nouvelles du myanmar droit des investissements étrangers au myanmar
Nouvelles du myanmar   droit des investissements étrangers au myanmarNouvelles du myanmar   droit des investissements étrangers au myanmar
Nouvelles du myanmar droit des investissements étrangers au myanmarAnyaS19
 
Résultat de l'étude sur le statut unique (Securex)
Résultat de l'étude sur le statut unique (Securex)Résultat de l'étude sur le statut unique (Securex)
Résultat de l'étude sur le statut unique (Securex)Securex
 
Luxinnovation - Aides pour R&D et Inovation - présentation ATEL/LSC
Luxinnovation - Aides pour R&D et Inovation - présentation ATEL/LSCLuxinnovation - Aides pour R&D et Inovation - présentation ATEL/LSC
Luxinnovation - Aides pour R&D et Inovation - présentation ATEL/LSCLuxembourg for Finance
 
Prédictions TMT 2014 de Deloitte
Prédictions TMT 2014 de DeloittePrédictions TMT 2014 de Deloitte
Prédictions TMT 2014 de DeloitteDeloitte Canada
 
Dibujosdenavidad Velas Y Campanas
Dibujosdenavidad Velas Y CampanasDibujosdenavidad Velas Y Campanas
Dibujosdenavidad Velas Y Campanaseducarconjesus
 
E-branding-Jurga_Sarkovaite-Creasur 2014_Puno
E-branding-Jurga_Sarkovaite-Creasur 2014_PunoE-branding-Jurga_Sarkovaite-Creasur 2014_Puno
E-branding-Jurga_Sarkovaite-Creasur 2014_PunoNeo Consulting
 

Destaque (20)

CMD 2012 - Veille informationnelle : diffuser et organiser avec des outils gr...
CMD 2012 - Veille informationnelle : diffuser et organiser avec des outils gr...CMD 2012 - Veille informationnelle : diffuser et organiser avec des outils gr...
CMD 2012 - Veille informationnelle : diffuser et organiser avec des outils gr...
 
Jesus101 dec11
Jesus101 dec11Jesus101 dec11
Jesus101 dec11
 
Catecismo civil
Catecismo civilCatecismo civil
Catecismo civil
 
Musée Grévin
Musée GrévinMusée Grévin
Musée Grévin
 
Fabrication numérique en Livradois-Forez ?
Fabrication numérique en Livradois-Forez ?Fabrication numérique en Livradois-Forez ?
Fabrication numérique en Livradois-Forez ?
 
Prévoir le referencement - WMM by NeoterizeA / Buzzeff
Prévoir le referencement - WMM by NeoterizeA / BuzzeffPrévoir le referencement - WMM by NeoterizeA / Buzzeff
Prévoir le referencement - WMM by NeoterizeA / Buzzeff
 
Atelier T13 - Gérer sa e-réputation et en faire un atout commercial - Salon e...
Atelier T13 - Gérer sa e-réputation et en faire un atout commercial - Salon e...Atelier T13 - Gérer sa e-réputation et en faire un atout commercial - Salon e...
Atelier T13 - Gérer sa e-réputation et en faire un atout commercial - Salon e...
 
Baromètre Hopscotch de l'e-réputation des laboratoires pharmaceutiques
Baromètre Hopscotch de l'e-réputation des laboratoires pharmaceutiquesBaromètre Hopscotch de l'e-réputation des laboratoires pharmaceutiques
Baromètre Hopscotch de l'e-réputation des laboratoires pharmaceutiques
 
Les séniors et le crédit à la consommation
Les séniors et le crédit à la consommationLes séniors et le crédit à la consommation
Les séniors et le crédit à la consommation
 
Memoire sur l'enjeu de l'ouverture des donnees publiques 2011
Memoire sur l'enjeu de l'ouverture des donnees publiques 2011Memoire sur l'enjeu de l'ouverture des donnees publiques 2011
Memoire sur l'enjeu de l'ouverture des donnees publiques 2011
 
Investissements au myanmar formation de la société au myanmar, vietnam, l'i...
Investissements au myanmar   formation de la société au myanmar, vietnam, l'i...Investissements au myanmar   formation de la société au myanmar, vietnam, l'i...
Investissements au myanmar formation de la société au myanmar, vietnam, l'i...
 
Exercicescorrigesdivers
ExercicescorrigesdiversExercicescorrigesdivers
Exercicescorrigesdivers
 
Presentation are sofer bis RHT 15.10.12
Presentation are sofer bis RHT 15.10.12Presentation are sofer bis RHT 15.10.12
Presentation are sofer bis RHT 15.10.12
 
FAQ autoliquidation travaux - 2014 09
FAQ autoliquidation travaux - 2014 09FAQ autoliquidation travaux - 2014 09
FAQ autoliquidation travaux - 2014 09
 
Nouvelles du myanmar droit des investissements étrangers au myanmar
Nouvelles du myanmar   droit des investissements étrangers au myanmarNouvelles du myanmar   droit des investissements étrangers au myanmar
Nouvelles du myanmar droit des investissements étrangers au myanmar
 
Résultat de l'étude sur le statut unique (Securex)
Résultat de l'étude sur le statut unique (Securex)Résultat de l'étude sur le statut unique (Securex)
Résultat de l'étude sur le statut unique (Securex)
 
Luxinnovation - Aides pour R&D et Inovation - présentation ATEL/LSC
Luxinnovation - Aides pour R&D et Inovation - présentation ATEL/LSCLuxinnovation - Aides pour R&D et Inovation - présentation ATEL/LSC
Luxinnovation - Aides pour R&D et Inovation - présentation ATEL/LSC
 
Prédictions TMT 2014 de Deloitte
Prédictions TMT 2014 de DeloittePrédictions TMT 2014 de Deloitte
Prédictions TMT 2014 de Deloitte
 
Dibujosdenavidad Velas Y Campanas
Dibujosdenavidad Velas Y CampanasDibujosdenavidad Velas Y Campanas
Dibujosdenavidad Velas Y Campanas
 
E-branding-Jurga_Sarkovaite-Creasur 2014_Puno
E-branding-Jurga_Sarkovaite-Creasur 2014_PunoE-branding-Jurga_Sarkovaite-Creasur 2014_Puno
E-branding-Jurga_Sarkovaite-Creasur 2014_Puno
 

Semelhante a Gradle_ToulouseJUG

JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924Gregory Boissinot
 
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
 
Aperçu de RequireJS
Aperçu de RequireJSAperçu de RequireJS
Aperçu de RequireJSVISEO
 
0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdfOmbotimbe Salifou
 
Apres java 8, java 9 et 10 - BreizhCamp 2018
Apres java 8, java 9 et 10 - BreizhCamp 2018Apres java 8, java 9 et 10 - BreizhCamp 2018
Apres java 8, java 9 et 10 - BreizhCamp 2018Jean-Michel Doudoux
 
.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
 
Soirée OSGi au Paris Jug (14/10/2008)
Soirée OSGi au Paris Jug (14/10/2008)Soirée OSGi au Paris Jug (14/10/2008)
Soirée OSGi au Paris Jug (14/10/2008)Cyrille Le Clerc
 
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
 
MarsJUG - Le classpath n'est pas mort, mais presque
MarsJUG - Le classpath n'est pas mort, mais presqueMarsJUG - Le classpath n'est pas mort, mais presque
MarsJUG - Le classpath n'est pas mort, mais presqueAlexis Hassler
 
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
 
Ops@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier KrantzOps@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier KrantzOlivier DASINI
 

Semelhante a Gradle_ToulouseJUG (20)

JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924
 
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)
 
Maven
MavenMaven
Maven
 
Javavs net
Javavs netJavavs net
Javavs net
 
Aperçu de RequireJS
Aperçu de RequireJSAperçu de RequireJS
Aperçu de RequireJS
 
Programmation Java
Programmation JavaProgrammation Java
Programmation Java
 
Nouveautés Java 9-10-11
Nouveautés Java 9-10-11Nouveautés Java 9-10-11
Nouveautés Java 9-10-11
 
0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf
 
Apres java 8, java 9 et 10 - BreizhCamp 2018
Apres java 8, java 9 et 10 - BreizhCamp 2018Apres java 8, java 9 et 10 - BreizhCamp 2018
Apres java 8, java 9 et 10 - BreizhCamp 2018
 
.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?
 
tp-spring.pdf
tp-spring.pdftp-spring.pdf
tp-spring.pdf
 
tp-spring.pdf
tp-spring.pdftp-spring.pdf
tp-spring.pdf
 
Soirée OSGi au Paris Jug (14/10/2008)
Soirée OSGi au Paris Jug (14/10/2008)Soirée OSGi au Paris Jug (14/10/2008)
Soirée OSGi au Paris Jug (14/10/2008)
 
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
 
MarsJUG - Le classpath n'est pas mort, mais presque
MarsJUG - Le classpath n'est pas mort, mais presqueMarsJUG - Le classpath n'est pas mort, mais presque
MarsJUG - Le classpath n'est pas mort, mais presque
 
Maven et industrialisation du logiciel
Maven et industrialisation du logicielMaven et industrialisation du logiciel
Maven et industrialisation du logiciel
 
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
 
Ops@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier KrantzOps@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
 
Gwt intro-101
Gwt intro-101Gwt intro-101
Gwt intro-101
 
Introduction Kotlin
Introduction KotlinIntroduction Kotlin
Introduction Kotlin
 

Mais de Gregory Boissinot

Mais 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_ToulouseJUG

  • 1. GRADLE Grégory BOISSINOT (@gboissinot) 16/03/2011 Toulouse 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 Toulouse JUG - Présentation Gradle 2
  • 3. INTERNET Event ENV Toulouse 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^ .... Toulouse 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 Toulouse 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 Toulouse 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') } Toulouse 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 •  Modèle de description du build très riche à travers une API Java et une DSL Groovy •  Support et insertion totale dans des infrastructures Maven et Ant/Ivy existantes Toulouse JUG - Présentation Gradle 8
  • 9. Central java.net Maven JBoss … Codehaus Artifacts + maven meta Ivy Repository Artifacts + ivy meta Other Repository Artifacts + custom meta Toulouse 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 Toulouse 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 Toulouse JUG - Présentation Gradle 11
  • 12. Écrire un script Gradle consiste à configurer un objet Project configurations build.gradle repositories dependencies Project ant Eléments task personnalisés artifacts Public API Toulouse JUG - Présentation Gradle 12
  • 13. •  Conçu pour répondre à un maximum de scénarios – Plusieurs répertoires de sources par projet – Des dépendances distinctes par répertoire – Plusieurs artefacts par projet – .... •  De nombreux points 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 Toulouse JUG - Présentation Gradle 13
  • 14. compile jar test custom build war Un processus Gradle est un ensemble de tâches Toulouse 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).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" } Toulouse JUG - Présentation Gradle 15
  • 16. task mycopy (type:Copy){ description ='Copies the resources dir' from(file('resources')) ConventionTask into(file('destination')) include('**/*.txt', '**/*.xml') } SourceTask AbstractCopyTask Javadoc Copy AbstractArchiveTask Zip Tar public class Copy extends AbstractCopyTask { public AbstractCopyTask from(Object... sourcePaths); public AbstractCopyTask into(Object destDir); public AbstractCopyTask include(String... includes); . . . Jar } War Toulouse JUG - Présentation Gradle 16
  • 17. <!– 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" } Toulouse JUG - Présentation Gradle 17
  • 18. • Les plugins Gradle • Insertion dans un environnement agile Toulouse JUG - Présentation Gradle 18
  • 19. Chaque plugin - est un ensemble de tâches préconfigurées - expose un objet de configuration (avec des conventions) Plugins maven Java Configuration Object eclipse idea Jetty Configuration War Configuration Object Object code-quality war projects-reports java … … jetty osgi … scala ... Project Configuration Toulouse JUG - Présentation Gradle 19
  • 20. Mise à disposition config-1.0.gradle <!– build.gradle --> task config { ... } Utilisation <!– build.gradle --> > gradle config apply from "http://repomanager/config-1.0.gradle" ... ... Toulouse JUG - Présentation Gradle 20
  • 21. Toulouse JUG - Présentation Gradle 21
  • 22. •  Flexibilité dans la définition des dépôts repositories{ mavenCentral() mavenRepo urls: "http://download.java.net/maven/2/" flatDir name: 'localRepository', dirs: 'lib' } •  Possibilité de mettre en place des exclusions globales •  Possibilité de définir les dépendances transitives dans le script Gradle dependencies { runtime module("org.codehaus.groovy:groovy-all:1.7.5") { dependency("commons-cli:commons-cli:1.0") { transitive = false } } } Toulouse JUG - Présentation Gradle 22
  • 23. apply plugin:'java' processResources.enabled=false test.onlyIf{ !project.hasProperty('skipTests')} > gradle build –PskipTests //Add behavior in the lifecycle :compileJava task(preJar) :processResources SKIPPED jar.dependsOn preJar :classes :preJar //Change the output directory :jar :war buildDirName='target' :assemble :compileTestJava //Change the source directory :processTestResources sourceSets{ :testClasses main{ :test SKIPPED java.srcDirs file('src/java'), :check file('src/java2') :build } BUILD SUCCESSFUL } Toulouse JUG - Présentation Gradle 23
  • 24. apply plugin:'java' > gradle clean build :clean sourceSets{ :generateTask . . . myGenSourceSet { :compileMyGenSourceSetJava java { :processMyGenSourceSetResources srcDir 'build/generated' :myGenSourceSetClasses } . . . } } Mise à disposition automatique d'un ensemble de tâches de traitement pour le nouveau besoin fonctionnel Toulouse JUG - Présentation Gradle 24
  • 25. > 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 } Toulouse 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 version = 1.0 gradle –-tasks gradle.taskGraph.whenReady { taskGraph -> gradle –-dependencies if (! taskGraph.hasTask(':release')){ gradle –-dry-run build version+='-' + System.currentTimeMillis()} } // Other hooks gradle.taskGraph.beforeTask { task -> .. . gradle.beforeProject { project -> .. . ... Toulouse JUG - Présentation Gradle 26
  • 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() } } Toulouse 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()) > } } Toulouse JUG - Présentation Gradle 28
  • 29. Toulouse 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") } } } Toulouse 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 Toulouse 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 Toulouse 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 Toulouse 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 Toulouse 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 } Toulouse 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 Toulouse 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 } Toulouse 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 } Toulouse 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, ...) Toulouse JUG - Présentation Gradle 39
  • 40. IDE Maturité NetBeans Eclipse + IntelliJ ++ Toulouse JUG - Présentation Gradle 40
  • 41. Toulouse JUG - Présentation Gradle 41
  • 42. gmock security spock integration 4 Toulouse 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 Toulouse JUG - Présentation Gradle 43
  • 44. •  Fourniture de consulting et de formation Toulouse JUG - Présentation Gradle 44
  • 45. Toulouse JUG - Présentation Gradle 45
  • 46. •  Bootstrap pour Sonar •  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 Toulouse JUG - Présentation Gradle 46
  • 47. Toulouse JUG - Présentation Gradle 47
  • 48. • Essayez-le ! • Utilisez-le ! • Faites du buzz! Toulouse JUG - Présentation Gradle 48
  • 49. Merci Toulouse JUG - Présentation Gradle 49
  • 50. •  Les meilleurs spécialistes, reconnus internationalement •  Des thématiques utilisées au jour le jour : Java Avancé, NoSQL, Clojure, HTML5, RabbitMQ, Scala, performance, Eclipse Orion, Spring, Jenkins (Hudson), services decoupling, etc. •  Vous pourrez poser toutes vos questions aux grands acteurs de la sphère Java •  Eligible aux DIF ou prise en charge par le budget de formation (FAFIEC, OPCALIA, …) http://www.whatsnextparis.com Toulouse JUG - Présentation Gradle 50