SlideShare ist ein Scribd-Unternehmen logo
1 von 59
GRADLE
                                   Grégory BOISSINOT
                                        (@gboissinot)
                                         23/06/2011




 NantesJUG - Présentation Gradle                        1
•  Consultant et formateur Zenika
    – En charge du comité technique Intégration continue

•  Contributeur et Committer pour Hudson/Jenkins
    – Intégration des chaînes de build Java (Gradle), C/C++, ADA
    – Maintenance corrective et évolutive des plugins réalisés
    – Développement de solutions transverses




                          NantesJUG - Présentation Gradle          2
•  Transformation d'une production humaine (le code
   source) en une représentation machine (le binaire)




       Fichier
                                                               JAR
       Source
                                                                 Fichier
                                                                 Binaire

                                                                              JVM


     println "Hello World"                     A;^A^@^Am^A^@^T()Ljava/lang/Object;^C^
     for (int i:[1,2,3]){                      @^@^@^@^A^@^KHello World^H^@2^A^@-
       print i                                 org/codehaus/groovy/runtime/callsite/
     }                                         CallSite^G^@4^A^@^KcallCurrent^A^@@
                                               (Lgroovy/lang/GroovyObject;
                                               Ljava/lang/Object;)Ljava/lang/Object;
                                               ^L^@6^@7^K^@5^@8^C^@^@^@^A^L^@^H^
                                               ....
                             NantesJUG - Présentation Gradle                            3
INTERNET
 Event




                          Polling
Environment


              ClearCase


                SVN

                GIT


                 ...




                              NantesJUG - Présentation Gradle              4
•  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




•  Les besoins d'automatisation ont augmentés
   significativement ces dernières années

                       NantesJUG - Présentation Gradle   5
1ère génération   2ème génération                    3ème génération
    2000                    2004                            2008

                                                     2008

2001


                                                                        3


                                               2

               1

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

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

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

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


                        NantesJUG - Présentation Gradle         8
Central       java.net
                            Maven


                       JBoss                                 …
                                      Codehaus

                                                         Artifacts +
                                                         maven meta




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


NantesJUG - 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




                                 NantesJUG - Présentation Gradle                                         10
On ne peut pas anticiper tous les besoins
    Aucun projet n'est réellement pareil!
    Le projet évolue et donc son processus d'intégration évolue aussi




Il est important de fournir un niveau de support équivalent entre les
anciens projets que les nouveaux projets




                             NantesJUG - Présentation Gradle             11
Écrire un script Gradle consiste à configurer un élément 'Project'



                                                  configurations
build.gradle
                          repositories
                                                                     dependencies




                                  Project                                   ant



                                                                 Eléments
                        task                                     personnalisés


                                          artifacts




                                                Public
                                                 API
                               NantesJUG - Présentation Gradle                      12
•  Conçu pour répondre à un maximum de scénarios
    – Plusieurs répertoires de sources par projet
    – Plusieurs artefacts générés par projet
    – Gestion de classpath distinct pour les tests
      d'intégration
    – ....

•  De nombreux points d'extension pour enrichir les
   éléments existants
      Possibilité de former un modèle de build (un
      ensemble de conventions), le tout dans une
      approche déclarative


                       NantesJUG - Présentation Gradle   13
La mise en œuvre de l'API à
                                        travers des tâches de
                                        traitement




    compile   jar      test        custom

                                                 build
              war


Un processus Gradle
est un ensemble de tâches

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

<!-- build.gradle -->                             API
                                                 Gradle
task(boucleTask).doLast{
  for (int i:[1,2,3]){ print i }
}                                                AAPI
                                              Java/Groovy

void printMessage(String message){
                                                       > gradle boucleTask
  println "Print " + message                           :boucleTask
}                                                      123
task(distribution).doLast {
    printMessage("Distribution")                       > gradle distribution
}                                                      :distribution
                                                       Print Distribution
task(release)
release.dependsOn(distribution)                        > gradle release
                                                       :distribution
release.doLast{                                        Print Distribution
    println "Print Release"                            :release
}                                                      Print Release

                           NantesJUG - Présentation Gradle                     15
ConventionTask                                         Mise à disposition d'un ensemble
                                                        de tâches prédéfinies


 AbstractCopyTask     SourceTask                              Facile à   Facile à
                                                              utiliser   étendre



AbstractArchiveTask     Copy                Javadoc



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

   Jar
                                   task mycopy (type:Copy){
                                     description ='Copies the resources dir'
                                     from(file('resources'))
                                     into(file('destination'))
  War
                                     include('**/*.txt', '**/*.xml')
                                   }

                                    NantesJUG - 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"
}



                           NantesJUG - Présentation Gradle                       17
NantesJUG - 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

                                  NantesJUG - Présentation Gradle                                        19
Java Configuration
    java                        Object




public class JavaPluginConvention {
   public SouceSetContainer sourceSets();
   public void setSourceCompatibility(Object value);
   public void setTargetCompatibility(Object value);
   public Manifest manifest()

    . . .
}

           <!-- build.gradle -->
                                                               Facile à
           apply plugin:'java'                                 mettre en
                                                                           Simple à
                                                               place et
                                                                           apprendre
                                                                facile à
           sourceCompatibility = 1.6                           maintenir
           targetCompatibility = 1.6


                             NantesJUG - Présentation Gradle                           20
Mise à
                          disposition




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




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

                              NantesJUG - Présentation Gradle                                      21
NantesJUG - Présentation Gradle   22
•  Possibilité de mettre en place des exclusions globales
•  Flexibilité dans la définition des dépôts
 repositories{
   mavenCentral()
   mavenRepo urls:"http://download.java.net/maven/2/"
   flatDir name:'localRepository', dirs: 'lib'
 }

•  Possibilité de définir les dépendances et les déepdances
   transitives directement dans le script Gradle

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

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

task(preJar)                                              > gradle build –PskipTests
jar.dependsOn preJar                                      :compileJava
                                                          :processResources SKIPPED
//Change the source directory                             :classes
sourceSets{                                               :preJar
  main{                                                   :jar
                                                          :assemble
    java.srcDirs file('src/java'),                        :compileTestJava
                 file('src/java2')                        :processTestResources
  }                                                       :testClasses
}                                                         :test SKIPPED
                                                          :check
//Création d'un uberjar                                   :build
jar {
  configurations.compile.each {                           BUILD SUCCESSFUL
      from zipTree (it) }
}
                        NantesJUG - Présentation Gradle                           24
src                                     apply plugin:'java'
           main
                                             sourceSets{
                  ...
                                               myGenSourceSet {
           test                                  java {
                  ...                              srcDir 'output/generated'
                                                 }
            output
                                               }
                  generated                  }



Mise à disposition automatique               > gradle clean build
  d'un ensemble de tâches de                 :clean
traitement pour le build de cet              :generateTask
      ensemble de fichiers                   . . .
                                             :compileMyGenSourceSetJava
                                             :processMyGenSourceSetResources
                                             :myGenSourceSetClasses
                                             . . .


                              NantesJUG - Présentation Gradle                  25
> gradle clean build
sourceSets{                                         :clean
 myGenSourceSet {                                   :generateTask
 java {                                             :compileMyGenSourceSetJava
    srcDir 'output/generated'                       :processMyGenSourceSetResources
  }                                                 :myGenSourceSetClasses
                                                    :compileJava
    main {                                          :processResources
     compileClasspath =                             :classes
      configurations.compile                        . . .
       + sourceSets.myGenSourceSet.classes

     runtimeClasspath =
      classes
        + configurations.runtime
        + sourceSets.myGenSourceSet.classes
    }
}

jar {
  from sourceSets.myGenSourceSet.classes
}
                            NantesJUG - Présentation Gradle                           26
CONFIGURATION PHASE

                                t1         t2   t3                           t1             t2   t3




                                                                                                      EXECUTION PHASE
GRADLE
                                      t4                                               t4




                                                                HOOK
SCRIPT


                                       Project                                          Project                         Engine
                                     Convention 1                                     Convention 2




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

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




                             NantesJUG - Présentation Gradle                         28
Les scripts d'initialisation permettent d'invoquer différents
 listeners au chargement du script

//Script d'initialisation

addListener(new ApplyEclipsePlugin())

class ApplyEclipsePlugin extends BuildAdapter {                   Invoquer
                                                                par défaut
    public void projectsEvaluated(Gradle gradle){                  si placé
                                                                   dans le
      gradle.rootProject.allprojects {                            home de
          apply plugin:'eclipse'                                l'utilisateur
      }
    }
}


gradle eclipse –I init.gradle



                              NantesJUG - Présentation Gradle                   29
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())                       >
    }
}




                                 NantesJUG - Présentation Gradle                          30
NantesJUG - Présentation Gradle   31
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")
     }
   }
}




                       NantesJUG - Présentation Gradle         32
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

                NantesJUG - Présentation Gradle          33
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



                         NantesJUG - Présentation Gradle                                   34
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


                         NantesJUG - Présentation Gradle                            35
• Gestion avancée d'un multi projet

• Utilisation d'un cache

• Exécution parallèle des tests

• Build daemon


                   NantesJUG - Présentation Gradle   36
// 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
}
                           NantesJUG - Présentation Gradle                           37
1.  Le script Gradle est compilé uniquement en cas de
    changement


2.  Détection 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



                       NantesJUG - Présentation Gradle     38
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
}
                          NantesJUG - Présentation Gradle                  39
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
                                                                          }




                                                  NantesJUG - Présentation Gradle                                      40
•  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, ...)


                         NantesJUG - Présentation Gradle         41
NantesJUG - Présentation Gradle   42
1. Utilisation du plugin 'code-quality' pour les outils de
 métriques Checkstyle et CodeNarc

 apply plugin:'code-quality'


2 . Intégration complète via l'utilisation des tâches Ant des
 outils de métriques




                          NantesJUG - Présentation Gradle       43
configurations {
       pmdConf
}
dependencies {
       pmdConf 'pmd:pmd:4.2.5'
}
task pmd << {
       ant {
                taskdef(name:'pmd',
                         classname:'net.sourceforge.pmd.ant.PMDTask',
                         classpath: configurations.pmdConf.asPath)

                pmd(shortFilenames:'true',
                 failonruleviolation:'true',
                 rulesetfiles:'conf/pmd-rules.xml') {
                       formatter(type:'text', toConsole:'true')
                       fileset(dir: "src/main/java") {
                           include(name: '**/*.java')
                       }
                 }
       }
}                                                                       44
                            NantesJUG - Présentation Gradle
IDE                              Maturité
NetBeans
Eclipse                          +
Eclipse STS                      ++
IntelliJ                         ++

              NantesJUG - Présentation Gradle   45
HUDSON                         JENKINS


Fonctionnalités:
- Installation automatique de Gradle (via URL, Run Script)
- Wizard de configuration
- Utilisation possible du Gradle wrapper

                         NantesJUG - Présentation Gradle     46
NantesJUG - Présentation Gradle   47
gmock

                                                    security
 spock



                                           integration




                                                         4



         NantesJUG - Présentation Gradle                       48
•  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




                          NantesJUG - Présentation Gradle   49
•  Conseil et Formation autour du produit




                       NantesJUG - Présentation Gradle   50
NantesJUG - Présentation Gradle   51
Points forts                                             Faiblesses

•  Mature                                         •  Pas de conventions par
                                                  défaut
•  Fiable
                                                  •  erbeux (syntaxe XML
                                                   V
•  Flexible et extensible
                                                  lourde)
•  ecture et écriture dans un
 L                                                •  ntégration de Ivy à Ant
                                                   I
repository Maven                                  souvent trop manuelle
•  ontruction automatique
 C
des classpath entre vos                                        Menaces
sous-projets
                                                   •  Nécessiter de se
                                                   former à l'utilisation du
                                                   couple Ant/Ivy dans le
                                                   cadre de la mise en
                                                   place de fonctionnalités
                                                   avancées




                            NantesJUG - Présentation Gradle                    52
Points forts                                             Faiblesses

•  onvention over
 C                                                  •  aible gestion des
                                                     F
configuration                                       dépendances
•  ycle de vie
 C                                                  •  Non distinction entre la
•  ystème de plugins
 S                                                  version technique et la
                                                    version commerciale du
•  Son écosystème                                   produit
d'utilisateurs
                                                    •  rocessus rigide (exemple
                                                     P
                                                    d'une ossature de build
         Menaces                                    figée)

•  ifficulté dans la
 D
reproductibilité du build
•  ncompatibilité dans la
 I
gestion de versions avec
un système extérieur



                            NantesJUG - Présentation Gradle                       53
Points forts                                              Faiblesses

. Convention over                                   Système de build très
configuration à la                                  récent
demande
. Cycle de vie fournit et
                                                                Menaces
facilement modifiable
. Système de plugins
                                                    . Incertitude sur la
. Intégration avec                                  pérennité
toutes les
infrastructures Ant/Ivy                             . DSL Groovy peu être
et Maven existantes                                 modifié
. Possibilité de mise en
place d'un build
incrémental sur de
nombreuses étapes de
son build



                            NantesJUG - Présentation Gradle                 54
Environment




                                                        Instancie




                      Processus identifié (traçabilité) et répétable




                                  DEPLOY                      TEST
              BUILD                                                     RELEASE
                                  INSTALL                  VALIDATION




                                      NantesJUG - Présentation Gradle             55
NantesJUG - Présentation Gradle   56
•  Introduction de modèles de JVM basés sur la nature des
   applications

•  Amélioration du DSL du graphe des tâches

•  Amélioration de la gestion de dépendances

•  Réutilisation possible des plugins Maven

•  Plusieurs livres sur les cas d'utilisations en cours
   d'éditions (OReilly)

•  Une communauté plus large

                          NantesJUG - Présentation Gradle   57
NantesJUG - Présentation Gradle   58
• Essayez-le !

• Utilisez-le !

• Faites du buzz!




                  NantesJUG - Présentation Gradle   59

Weitere ähnliche Inhalte

Was ist angesagt?

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
 
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 (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
 
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
 
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
 
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
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache MavenArnaud Héritier
 
JCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratiqueJCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratiqueRossi Oddet
 
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
 
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
 
GWT Principes & Techniques
GWT Principes & TechniquesGWT Principes & Techniques
GWT Principes & TechniquesRachid NID SAID
 
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
 
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
 
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
 

Was ist angesagt? (20)

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)
 
Soiree Maven 2
Soiree Maven 2Soiree Maven 2
Soiree Maven 2
 
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
 
Sonar-Hodson-Maven
Sonar-Hodson-MavenSonar-Hodson-Maven
Sonar-Hodson-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)
 
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
 
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
 
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
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven
 
JCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratiqueJCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratique
 
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
 
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
 
GWT Principes & Techniques
GWT Principes & TechniquesGWT Principes & Techniques
GWT Principes & Techniques
 
Android ORMLite
Android   ORMLiteAndroid   ORMLite
Android ORMLite
 
Maven
MavenMaven
Maven
 
Java 11 to 17 : What's new !?
Java 11 to 17 : What's new !?Java 11 to 17 : What's new !?
Java 11 to 17 : What's new !?
 
20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven
 
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
 
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
 

Andere mochten auch

2011 RAPPORT ANNUEL RECTICEL - CORP.
2011 RAPPORT ANNUEL RECTICEL - CORP.2011 RAPPORT ANNUEL RECTICEL - CORP.
2011 RAPPORT ANNUEL RECTICEL - CORP.Recticel NV/SA
 
Internet-Responsable_Collège
Internet-Responsable_CollègeInternet-Responsable_Collège
Internet-Responsable_Collègecddp46
 
Comscore 2013 France Digital Future in focus
Comscore 2013 France Digital Future in focusComscore 2013 France Digital Future in focus
Comscore 2013 France Digital Future in focusValerie Gagliano
 
Presentacion primavera
Presentacion primaveraPresentacion primavera
Presentacion primaverajuanjoreverte
 
Actividad video presentación
Actividad video presentaciónActividad video presentación
Actividad video presentaciónmantce
 
Bottup ucab-caracas-julio-2011
Bottup ucab-caracas-julio-2011Bottup ucab-caracas-julio-2011
Bottup ucab-caracas-julio-2011Espacio Público
 
Ctrl de gestion et management
Ctrl de gestion et managementCtrl de gestion et management
Ctrl de gestion et managementantilaman
 
Ferran i Iker
Ferran i IkerFerran i Iker
Ferran i Ikerggracia2
 
La Vírgula Prueba Dummy
La Vírgula Prueba DummyLa Vírgula Prueba Dummy
La Vírgula Prueba DummyLa Adelita
 
Objetos de aprendizaje multimedia en asignaturas de grado en ingeniería: Vide...
Objetos de aprendizaje multimedia en asignaturas de grado en ingeniería: Vide...Objetos de aprendizaje multimedia en asignaturas de grado en ingeniería: Vide...
Objetos de aprendizaje multimedia en asignaturas de grado en ingeniería: Vide...JUAN AGUILAR
 
Webinar: No enviar y rezar. Genere Pruebas.
Webinar: No enviar y rezar. Genere Pruebas.Webinar: No enviar y rezar. Genere Pruebas.
Webinar: No enviar y rezar. Genere Pruebas.MasterBase®
 
Acceso al bloque de personas
Acceso al bloque de personasAcceso al bloque de personas
Acceso al bloque de personasjuanjoreverte
 
Falete. huésped de honor ciudad de buenos aires
Falete. huésped de honor ciudad de buenos airesFalete. huésped de honor ciudad de buenos aires
Falete. huésped de honor ciudad de buenos airescosasdeandalucia
 
Futuro Labs: Tendencias Digitales en Perú - Setiembre 2011
Futuro Labs: Tendencias Digitales en Perú - Setiembre 2011Futuro Labs: Tendencias Digitales en Perú - Setiembre 2011
Futuro Labs: Tendencias Digitales en Perú - Setiembre 2011Neo Consulting
 

Andere mochten auch (20)

2011 RAPPORT ANNUEL RECTICEL - CORP.
2011 RAPPORT ANNUEL RECTICEL - CORP.2011 RAPPORT ANNUEL RECTICEL - CORP.
2011 RAPPORT ANNUEL RECTICEL - CORP.
 
Carrière
CarrièreCarrière
Carrière
 
Internet-Responsable_Collège
Internet-Responsable_CollègeInternet-Responsable_Collège
Internet-Responsable_Collège
 
Comscore 2013 France Digital Future in focus
Comscore 2013 France Digital Future in focusComscore 2013 France Digital Future in focus
Comscore 2013 France Digital Future in focus
 
Photos 3e reich_revueli_
Photos 3e reich_revueli_Photos 3e reich_revueli_
Photos 3e reich_revueli_
 
Presentacion primavera
Presentacion primaveraPresentacion primavera
Presentacion primavera
 
Actividad video presentación
Actividad video presentaciónActividad video presentación
Actividad video presentación
 
Bottup ucab-caracas-julio-2011
Bottup ucab-caracas-julio-2011Bottup ucab-caracas-julio-2011
Bottup ucab-caracas-julio-2011
 
Ctrl de gestion et management
Ctrl de gestion et managementCtrl de gestion et management
Ctrl de gestion et management
 
Ferran i Iker
Ferran i IkerFerran i Iker
Ferran i Iker
 
Tarea1 francisco biedma
Tarea1 francisco biedmaTarea1 francisco biedma
Tarea1 francisco biedma
 
Pvnova
PvnovaPvnova
Pvnova
 
La Vírgula Prueba Dummy
La Vírgula Prueba DummyLa Vírgula Prueba Dummy
La Vírgula Prueba Dummy
 
Objetos de aprendizaje multimedia en asignaturas de grado en ingeniería: Vide...
Objetos de aprendizaje multimedia en asignaturas de grado en ingeniería: Vide...Objetos de aprendizaje multimedia en asignaturas de grado en ingeniería: Vide...
Objetos de aprendizaje multimedia en asignaturas de grado en ingeniería: Vide...
 
Las relaciones
Las relacionesLas relaciones
Las relaciones
 
POLA On-site Tour
POLA On-site TourPOLA On-site Tour
POLA On-site Tour
 
Webinar: No enviar y rezar. Genere Pruebas.
Webinar: No enviar y rezar. Genere Pruebas.Webinar: No enviar y rezar. Genere Pruebas.
Webinar: No enviar y rezar. Genere Pruebas.
 
Acceso al bloque de personas
Acceso al bloque de personasAcceso al bloque de personas
Acceso al bloque de personas
 
Falete. huésped de honor ciudad de buenos aires
Falete. huésped de honor ciudad de buenos airesFalete. huésped de honor ciudad de buenos aires
Falete. huésped de honor ciudad de buenos aires
 
Futuro Labs: Tendencias Digitales en Perú - Setiembre 2011
Futuro Labs: Tendencias Digitales en Perú - Setiembre 2011Futuro Labs: Tendencias Digitales en Perú - Setiembre 2011
Futuro Labs: Tendencias Digitales en Perú - Setiembre 2011
 

Ähnlich wie gradle_nantesjug

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
 
.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
 
0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdfOmbotimbe Salifou
 
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
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EEInes Ouaz
 
GWT Approfondissement - GTI780 & MTI780 - ETS - A08
GWT Approfondissement - GTI780 & MTI780 - ETS - A08GWT Approfondissement - GTI780 & MTI780 - ETS - A08
GWT Approfondissement - GTI780 & MTI780 - ETS - A08Claude Coulombe
 
Aperçu de RequireJS
Aperçu de RequireJSAperçu de RequireJS
Aperçu de RequireJSVISEO
 
Présentation de JEE et de son écosysteme
Présentation de JEE et de son écosystemePrésentation de JEE et de son écosysteme
Présentation de JEE et de son écosystemeStéphane Traumat
 
JavaScript dans l'usine logicielle
JavaScript dans l'usine logicielleJavaScript dans l'usine logicielle
JavaScript dans l'usine logiciellejollivetc
 
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
 
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
 
JavaEE - Test & Deploy
JavaEE - Test & DeployJavaEE - Test & Deploy
JavaEE - Test & DeployAlexis Hassler
 

Ähnlich wie gradle_nantesjug (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)
 
.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?
 
Programmation Java
Programmation JavaProgrammation Java
Programmation Java
 
Maven et industrialisation du logiciel
Maven et industrialisation du logicielMaven et industrialisation du logiciel
Maven et industrialisation du logiciel
 
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
 
Javavs net
Javavs netJavavs net
Javavs net
 
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
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EE
 
GWT Approfondissement - GTI780 & MTI780 - ETS - A08
GWT Approfondissement - GTI780 & MTI780 - ETS - A08GWT Approfondissement - GTI780 & MTI780 - ETS - A08
GWT Approfondissement - GTI780 & MTI780 - ETS - A08
 
Aperçu de RequireJS
Aperçu de RequireJSAperçu de RequireJS
Aperçu de RequireJS
 
Présentation de JEE et de son écosysteme
Présentation de JEE et de son écosystemePrésentation de JEE et de son écosysteme
Présentation de JEE et de son écosysteme
 
JavaScript dans l'usine logicielle
JavaScript dans l'usine logicielleJavaScript dans l'usine logicielle
JavaScript dans l'usine logicielle
 
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
 
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
 
JavaEE - Test & Deploy
JavaEE - Test & DeployJavaEE - Test & Deploy
JavaEE - Test & Deploy
 
tp-spring.pdf
tp-spring.pdftp-spring.pdf
tp-spring.pdf
 
tp-spring.pdf
tp-spring.pdftp-spring.pdf
tp-spring.pdf
 
Gwt intro-101
Gwt intro-101Gwt intro-101
Gwt intro-101
 

Mehr von Gregory Boissinot

Mehr von 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_nantesjug

  • 1. GRADLE Grégory BOISSINOT (@gboissinot) 23/06/2011 NantesJUG - Présentation Gradle 1
  • 2. •  Consultant et formateur Zenika – En charge du comité technique Intégration continue •  Contributeur et Committer pour Hudson/Jenkins – Intégration des chaînes de build Java (Gradle), C/C++, ADA – Maintenance corrective et évolutive des plugins réalisés – Développement de solutions transverses NantesJUG - Présentation Gradle 2
  • 3. •  Transformation d'une production humaine (le code source) en une représentation machine (le binaire) Fichier JAR Source Fichier Binaire JVM println "Hello World" A;^A^@^Am^A^@^T()Ljava/lang/Object;^C^ for (int i:[1,2,3]){ @^@^@^@^A^@^KHello World^H^@2^A^@- print i org/codehaus/groovy/runtime/callsite/ } CallSite^G^@4^A^@^KcallCurrent^A^@@ (Lgroovy/lang/GroovyObject; Ljava/lang/Object;)Ljava/lang/Object; ^L^@6^@7^K^@5^@8^C^@^@^@^A^L^@^H^ .... NantesJUG - Présentation Gradle 3
  • 4. INTERNET Event Polling Environment ClearCase SVN GIT ... NantesJUG - Présentation Gradle 4
  • 5. •  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 •  Les besoins d'automatisation ont augmentés significativement ces dernières années NantesJUG - Présentation Gradle 5
  • 6. 1ère génération 2ème génération 3ème génération 2000 2004 2008 2008 2001 3 2 1 NantesJUG - 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') } NantesJUG - Présentation Gradle 7
  • 8. •  Système de build complet focalisé sur le build des applications d'entreprise Java, Web, Groovy, Scala et OSGI •  Flexible à la Ant avec les conventions de Maven à la demande •  Support et insertion totale dans des infrastructures Maven et Ant/Ivy existantes •  Modèle de description du build très riche à travers une API Java et une DSL Groovy NantesJUG - Présentation Gradle 8
  • 9. Central java.net Maven JBoss … Codehaus Artifacts + maven meta Ivy Repository Artifacts + ivy meta Other Repository Artifacts + custom meta NantesJUG - 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 NantesJUG - Présentation Gradle 10
  • 11. On ne peut pas anticiper tous les besoins  Aucun projet n'est réellement pareil!  Le projet évolue et donc son processus d'intégration évolue aussi Il est important de fournir un niveau de support équivalent entre les anciens projets que les nouveaux projets NantesJUG - Présentation Gradle 11
  • 12. Écrire un script Gradle consiste à configurer un élément 'Project' configurations build.gradle repositories dependencies Project ant Eléments task personnalisés artifacts Public API NantesJUG - Présentation Gradle 12
  • 13. •  Conçu pour répondre à un maximum de scénarios – Plusieurs répertoires de sources par projet – Plusieurs artefacts générés par projet – Gestion de classpath distinct pour les tests d'intégration – .... •  De nombreux points d'extension pour enrichir les éléments existants Possibilité de former un modèle de build (un ensemble de conventions), le tout dans une approche déclarative NantesJUG - Présentation Gradle 13
  • 14. La mise en œuvre de l'API à travers des tâches de traitement compile jar test custom build war Un processus Gradle est un ensemble de tâches NantesJUG - Présentation Gradle 14
  • 15. Possibilité d'écrire du code Java/Groovy sous forme d'unités de traitement réutilisables <!-- build.gradle --> API Gradle task(boucleTask).doLast{ for (int i:[1,2,3]){ print i } } AAPI Java/Groovy void printMessage(String message){ > gradle boucleTask println "Print " + message :boucleTask } 123 task(distribution).doLast { printMessage("Distribution") > gradle distribution } :distribution Print Distribution task(release) release.dependsOn(distribution) > gradle release :distribution release.doLast{ Print Distribution println "Print Release" :release } Print Release NantesJUG - Présentation Gradle 15
  • 16. ConventionTask Mise à disposition d'un ensemble de tâches prédéfinies AbstractCopyTask SourceTask Facile à Facile à utiliser étendre AbstractArchiveTask Copy Javadoc public class Copy extends AbstractCopyTask { public AbstractCopyTask from(Object... sourcePaths); Zip Tar public AbstractCopyTask into(Object destDir); public AbstractCopyTask include(String... includes); . . . } Jar task mycopy (type:Copy){ description ='Copies the resources dir' from(file('resources')) into(file('destination')) War include('**/*.txt', '**/*.xml') } NantesJUG - 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" } NantesJUG - Présentation Gradle 17
  • 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 NantesJUG - Présentation Gradle 19
  • 20. Java Configuration java Object public class JavaPluginConvention { public SouceSetContainer sourceSets(); public void setSourceCompatibility(Object value); public void setTargetCompatibility(Object value); public Manifest manifest() . . . } <!-- build.gradle --> Facile à apply plugin:'java' mettre en Simple à place et apprendre facile à sourceCompatibility = 1.6 maintenir targetCompatibility = 1.6 NantesJUG - Présentation Gradle 20
  • 21. Mise à disposition globalConfig-1.0.gradle <!– build.gradle --> task globalConfig { ... } Utilisation <!– build.gradle --> > gradle config apply from "http://repomanager/globalConfig-1.0.gradle" ... ... NantesJUG - Présentation Gradle 21
  • 23. •  Possibilité de mettre en place des exclusions globales •  Flexibilité dans la définition des dépôts repositories{ mavenCentral() mavenRepo urls:"http://download.java.net/maven/2/" flatDir name:'localRepository', dirs: 'lib' } •  Possibilité de définir les dépendances et les déepdances transitives directement dans le script Gradle dependencies { runtime module("org.codehaus.groovy:groovy-all:1.7.5") { dependency("commons-cli:commons-cli:1.0") { transitive = false } } } NantesJUG - Présentation Gradle 23
  • 24. apply plugin:'java' processResources.enabled=false test.onlyIf{ !project.hasProperty('skipTests')} task(preJar) > gradle build –PskipTests jar.dependsOn preJar :compileJava :processResources SKIPPED //Change the source directory :classes sourceSets{ :preJar main{ :jar :assemble java.srcDirs file('src/java'), :compileTestJava file('src/java2') :processTestResources } :testClasses } :test SKIPPED :check //Création d'un uberjar :build jar { configurations.compile.each { BUILD SUCCESSFUL from zipTree (it) } } NantesJUG - Présentation Gradle 24
  • 25. src apply plugin:'java' main sourceSets{ ... myGenSourceSet { test java { ... srcDir 'output/generated' } output } generated } Mise à disposition automatique > gradle clean build d'un ensemble de tâches de :clean traitement pour le build de cet :generateTask ensemble de fichiers . . . :compileMyGenSourceSetJava :processMyGenSourceSetResources :myGenSourceSetClasses . . . NantesJUG - Présentation Gradle 25
  • 26. > gradle clean build sourceSets{ :clean myGenSourceSet { :generateTask java { :compileMyGenSourceSetJava srcDir 'output/generated' :processMyGenSourceSetResources } :myGenSourceSetClasses :compileJava main { :processResources compileClasspath = :classes configurations.compile . . . + sourceSets.myGenSourceSet.classes runtimeClasspath = classes + configurations.runtime + sourceSets.myGenSourceSet.classes } } jar { from sourceSets.myGenSourceSet.classes } NantesJUG - Présentation Gradle 26
  • 27. CONFIGURATION PHASE t1 t2 t3 t1 t2 t3 EXECUTION PHASE GRADLE t4 t4 HOOK SCRIPT Project Project Engine Convention 1 Convention 2 gradle properties gradle.taskGraph.whenReady { taskGraph -> gradle tasks if (taskGraph.hasTask(':release')){ gradle dependencies status = 'release' gradle –-dry-run build } } // Other hooks gradle.taskGraph.beforeTask { task -> .. . gradle.beforeProject { project -> .. . ... NantesJUG - Présentation Gradle 27
  • 28. 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() } } NantesJUG - Présentation Gradle 28
  • 29. Les scripts d'initialisation permettent d'invoquer différents listeners au chargement du script //Script d'initialisation addListener(new ApplyEclipsePlugin()) class ApplyEclipsePlugin extends BuildAdapter { Invoquer par défaut public void projectsEvaluated(Gradle gradle){ si placé dans le gradle.rootProject.allprojects { home de apply plugin:'eclipse' l'utilisateur } } } gradle eclipse –I init.gradle NantesJUG - Présentation Gradle 29
  • 30. 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()) > } } NantesJUG - Présentation Gradle 30
  • 32. 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") } } } NantesJUG - Présentation Gradle 32
  • 33. 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 NantesJUG - Présentation Gradle 33
  • 34. 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 NantesJUG - Présentation Gradle 34
  • 35. 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 NantesJUG - Présentation Gradle 35
  • 36. • Gestion avancée d'un multi projet • Utilisation d'un cache • Exécution parallèle des tests • Build daemon NantesJUG - Présentation Gradle 36
  • 37. // 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 } NantesJUG - Présentation Gradle 37
  • 38. 1.  Le script Gradle est compilé uniquement en cas de changement 2.  Détection 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 NantesJUG - Présentation Gradle 38
  • 39. 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 } NantesJUG - Présentation Gradle 39
  • 40. 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 } NantesJUG - Présentation Gradle 40
  • 41. •  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, ...) NantesJUG - Présentation Gradle 41
  • 43. 1. Utilisation du plugin 'code-quality' pour les outils de métriques Checkstyle et CodeNarc apply plugin:'code-quality' 2 . Intégration complète via l'utilisation des tâches Ant des outils de métriques NantesJUG - Présentation Gradle 43
  • 44. configurations { pmdConf } dependencies { pmdConf 'pmd:pmd:4.2.5' } task pmd << { ant { taskdef(name:'pmd', classname:'net.sourceforge.pmd.ant.PMDTask', classpath: configurations.pmdConf.asPath) pmd(shortFilenames:'true', failonruleviolation:'true', rulesetfiles:'conf/pmd-rules.xml') { formatter(type:'text', toConsole:'true') fileset(dir: "src/main/java") { include(name: '**/*.java') } } } } 44 NantesJUG - Présentation Gradle
  • 45. IDE Maturité NetBeans Eclipse + Eclipse STS ++ IntelliJ ++ NantesJUG - Présentation Gradle 45
  • 46. HUDSON JENKINS Fonctionnalités: - Installation automatique de Gradle (via URL, Run Script) - Wizard de configuration - Utilisation possible du Gradle wrapper NantesJUG - Présentation Gradle 46
  • 48. gmock security spock integration 4 NantesJUG - Présentation Gradle 48
  • 49. •  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 NantesJUG - Présentation Gradle 49
  • 50. •  Conseil et Formation autour du produit NantesJUG - Présentation Gradle 50
  • 52. Points forts Faiblesses •  Mature •  Pas de conventions par défaut •  Fiable •  erbeux (syntaxe XML V •  Flexible et extensible lourde) •  ecture et écriture dans un L •  ntégration de Ivy à Ant I repository Maven souvent trop manuelle •  ontruction automatique C des classpath entre vos Menaces sous-projets •  Nécessiter de se former à l'utilisation du couple Ant/Ivy dans le cadre de la mise en place de fonctionnalités avancées NantesJUG - Présentation Gradle 52
  • 53. Points forts Faiblesses •  onvention over C •  aible gestion des F configuration dépendances •  ycle de vie C •  Non distinction entre la •  ystème de plugins S version technique et la version commerciale du •  Son écosystème produit d'utilisateurs •  rocessus rigide (exemple P d'une ossature de build Menaces figée) •  ifficulté dans la D reproductibilité du build •  ncompatibilité dans la I gestion de versions avec un système extérieur NantesJUG - Présentation Gradle 53
  • 54. Points forts Faiblesses . Convention over Système de build très configuration à la récent demande . Cycle de vie fournit et Menaces facilement modifiable . Système de plugins . Incertitude sur la . Intégration avec pérennité toutes les infrastructures Ant/Ivy . DSL Groovy peu être et Maven existantes modifié . Possibilité de mise en place d'un build incrémental sur de nombreuses étapes de son build NantesJUG - Présentation Gradle 54
  • 55. Environment Instancie Processus identifié (traçabilité) et répétable DEPLOY TEST BUILD RELEASE INSTALL VALIDATION NantesJUG - Présentation Gradle 55
  • 57. •  Introduction de modèles de JVM basés sur la nature des applications •  Amélioration du DSL du graphe des tâches •  Amélioration de la gestion de dépendances •  Réutilisation possible des plugins Maven •  Plusieurs livres sur les cas d'utilisations en cours d'éditions (OReilly) •  Une communauté plus large NantesJUG - Présentation Gradle 57
  • 59. • Essayez-le ! • Utilisez-le ! • Faites du buzz! NantesJUG - Présentation Gradle 59