SlideShare une entreprise Scribd logo
1  sur  29
GRADLE
                             Grégory Boissinot
                                      13/09/2010




Copyright © BreizhJug
A mon propos
       •  Consultant et formateur Zenika
              – Mes spécialités: Build et Intégration continue
              – Build master chez Thales
                        •  Introduction et déploiement de Gradle à grande
                           échelle


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

Copyright © BreizhJug
Pourquoi un outil de plus?
     •  La nature des besoins a changé
             – Augmentation des besoins d'automatisation
             – Un build peut faire beaucoup plus de choses
               que la simple création d'une archive Java




Copyright © BreizhJug
Evolution des outils
                2000                  2005              2008
           1ère génération        2ème génération   3ème génération




                                              2

                                                                      3

                             1




Copyright © BreizhJug
Gradle: première définition
       •  Système de build pour les projets Java,
          Groovy, OSGI, Web et Scala

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

       •  Insertion totale dans une infrastructure Ant
          et Maven existante

Copyright © BreizhJug
Approche déclarative et
                          notion de conventions
  •  Spécification du 'quoi' et pas du 'comment'

  apply plugin:'java'    > gradle clean build
                         :clean
  repositories {         :compileJava
                                                         src
    mavenCentral()       :processResources
  }                      :classes                myLib         main
                                                 .jar
                         :jar
  dependencies {                                                      java
                         :assemble
    compile              :compileTestJava                             resources
     "jdom:jdom:1.0"     :processTestResources
    testCompile          :testClasses
     "junit:junit:4.7"   :test                                 test
  }                      :check
                                                                      java
                         :build

                         BUILD SUCCESSFUL                             resources




Copyright © BreizhJug
On ne peut pas anticiper
                        tous les besoins des projets




Copyright © BreizhJug
Un langage de build

                                            configurations

                          repositories
          build.gradle
                                                      dependencies

                                 Project
                                                         ant
                         task
                                         artifacts

                                     API



Copyright © BreizhJug
Un langage de build
                                 extensible
       •  Conçu pour répondre à tous les scénarios
          possibles
              – Plusieurs répertoires de sources par projet
              – Une version de JDK par répertoire
              – Plusieurs artefacts par projet
              – ....
       •  Nombreux points d'extension
       •  Fourniture de ses propres éléments

Copyright © BreizhJug
Délégation du build à un
                         ensemble de tâches
   // build.gradle                        > gradle distribution
   task(distribution).doFirst{            :distribution
     println "Print Distribution"         Print Distribution
     for (int i:[1,2,3]){ print i }       123
   }
                                          > gradle release
   task(release)                          :distribution
   release.dependsOn(distribution)        Print Distribution
   release.doFirst{                       123
       println "Print Release"            :release                   AbstractCopyTask
   }                                      Print Release
   task mycopy (type:Copy){
     from(file('resources'))                          AbstractArchiveTask     Copy

     into(file('target'))
     include('**/*.txt', '**/*.xml')
   }
                                                       Zip          Tar
   myCopy.exclude('**/.properties')
                            public class Copy   extends AbstractCopyTask {
                             AbstractCopyTask   from(Object... sourcePaths);
                             AbstractCopyTask   into(Object destDir);
                             AbstractCopyTask   includes(String includes);
Copyright © BreizhJug
                             AbstractCopyTask   excludes(String excludes); }
Création de tâches
                                   personnalisées
       // common.gradle
       class HelloTask extends DefaultTask {

           def message="Default Message"

           @TaskAction                               > gradle myhello
           public void print(){                      :myhello
             println message                         Default Message
           }
       }                                             > gradle myhello2
                                                     :myhello2
       // build.gradle                               Task Message
       apply from : 'http://ci.repo/common.gradle'

       task(myhello, type:HelloTask)

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



Copyright © BreizhJug
Regroupement des tâches
                                  sous forme de plugins

                Plugins          maven                       Java Configuration
                                                                   Object

                   eclipse        idea        Jetty Configuration    War Configuration
                                                     Object               Object

           code-quality            war
                                                      …                       …

      projects-reports                 java
                                                       …

               jetty            osgi
                                                         Project
                        scala                          Configuration



Copyright © BreizhJug
Performance
       •  Gestion multi-projet avancée

       •  Utilisation d'un cache

       •  Exécution parallèle des tests




Copyright © BreizhJug
Gestion multi-projet
    // settings.gradle
                                 avancée                  shared


    include 'api',
            'shared',
            'services:webservices'                webservices       api


    // root build.gradle             api > gradle buildNeeded
    subprojects {                    :shared:jar
      apply plugin: 'java'           :api:jar
    }                                :api:test
    project(':api') {                :shared:test
      dependencies {
        compile project(':shared')   api > gradle buildDependents
      }                              :shared:jar
    }                                :api:jar
                                     :api:test
    // webservices/build.gradle      :webservices:war
    apply plugin:'war'               :webservices:test
    dependencies {
      compile
                                     api > gradle –-no-rebuild
        project(':shared'),
        project(':api'),             api:jar
       'commons-io:commons-io:1.2'
    }
Copyright © BreizhJug
Utilisation d'un cache
       •  Le script est compilé uniquement en cas
          de nouveaux changements

       •  Détection des changements des inputs et
          des outputs        >gradle myzip
                              :myzip

                              >gradle myzip
                              :myzip UP-TO-DATE

                              >gradle myzip –-cahce rebuild
                              :myzip




Copyright © BreizhJug
Exécution parallèle des tests
                                                       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
                                                                         }




Copyright © BreizhJug
Haut niveau de contrôle




Copyright © BreizhJug
Introspecter et manipuler
                                                      un build
                 CONFIGURATION PHASE


                                       t1         t2   t3           t1         t2   t3




                                                                                         EXECUTION PHASE
                                             t4                           t4




                                                             HOOK
GRADLE
SCRIPT

                                              Project                      Project                         Engine
                                            Convention 1                 Convention 2




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



Copyright © BreizhJug
Être à l'écoute de son build
      •  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()
      }
  }




Copyright © BreizhJug
Tester vos scripts
      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
                       !zipTree(myzip.archivePath).isEmpty())                 .zip

              txtfiles = fileTree('somedir').include('*.txt')
                                                                   check
              ziptxtfiles=zipTree(myzip.archivePath).matching{
                      include('*.txt')
                    }
              Assert.assertEquals (
                    txtfiles.getFiles().size(),                  BUILD SUCCESSFUL
                    ziptxtfiles.getFiles().size())               >
          }
      }




Copyright © BreizhJug
Une boîte à outils pour une
                         insertion dans l'existant




Copyright © BreizhJug
Réutilisation des tâches Ant
            ant.echo (message:ANT)


            ant {
              def wsdl2java_classpath = path {
                     fileset(dirs:'lib', includes: '*.jar')
              }
              taskdef(
                name: 'axiswsdl2java',
                classname:
                'org.apache.axis.tools.ant.wsdl.Wsdl2javaAntTask',
                classpath: wsdl2java_classpath )

                axiswsdl2java( output:"generated",
                               verbose:"true" ,
                               url:"Exemple.wsdl" )
            }




Copyright © BreizhJug
Réutilisation des scripts ANT
                        build.xml    <project>
                                       <target name="antTask">
                                         <echo message="Hello from Ant"/>
                                       </target>
                                     </project>



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


                                     > gradle antTask
                                     :antTask
                                     Hello from Ant
                                     Hello from Gradle




Copyright © BreizhJug
Déploiement
                               dans un dépôt Ivy
  apply plugin:'java'

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

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

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



Copyright © BreizhJug
Déploiement
                         dans un dépôt Maven
  apply plugin:'java'                                  Maven
  apply plugin:'maven'                                  Ant
                                                       Tasks
  group='test'
  version='1.0-SNAPSHOT'
  uploadArchives {
    repositories {
      mavenDeployer {
                                       > gradle         > gradle
        repository(                      install          uploadArchives
           url: remoteRepo)
      }
    }
  }

                              Repository                Repository
                                Maven                     Maven
                                         Artifacts +
                                Local meta Maven          distant
                                                                 Artifacts +
                                                                 meta Maven




Copyright © BreizhJug
Qui utilise Gradle en 2010?
                  gmock


                        spcok
                                             security




Copyright © BreizhJug
Roadmap
       •  Nouveau DSL de gestion des dépendances
       •  Build Daemon (Amélioration du temps de
          démarrage et d'exécution)
       •  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



Copyright © BreizhJug
dans l'avenir ...




Copyright © BreizhJug
Parlez-en!
       •  Essayez-le!

       •  Utilisez-le!

       •  Faites du buzz!




Copyright © BreizhJug

Contenu connexe

Tendances

Presentation of GWT 2.4 (PDF version)
Presentation of GWT 2.4 (PDF version)Presentation of GWT 2.4 (PDF version)
Presentation of GWT 2.4 (PDF version)Celinio Fernandes
 
Presentation of GWT 2.4 (PowerPoint version)
Presentation of GWT 2.4 (PowerPoint version)Presentation of GWT 2.4 (PowerPoint version)
Presentation of GWT 2.4 (PowerPoint version)Celinio Fernandes
 
GWT Principes & Techniques
GWT Principes & TechniquesGWT Principes & Techniques
GWT Principes & TechniquesRachid NID SAID
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache MavenArnaud Héritier
 
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
 
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
 
JCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratiqueJCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratiqueRossi Oddet
 
Présentation Maven
Présentation MavenPrésentation Maven
Présentation MavenSOAT
 
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
 
Uni.sherbrooke 2015 créez la meilleur application grâce à gwt, gwtp et j...
Uni.sherbrooke 2015   créez la meilleur application grâce à gwt, gwtp et j...Uni.sherbrooke 2015   créez la meilleur application grâce à gwt, gwtp et j...
Uni.sherbrooke 2015 créez la meilleur application grâce à gwt, gwtp et j...Arcbees
 
20080311 - Paris Vi Master STL TA - Initiation Maven
20080311 - Paris Vi Master STL TA - Initiation Maven20080311 - Paris Vi Master STL TA - Initiation Maven
20080311 - Paris Vi Master STL TA - Initiation MavenArnaud Héritier
 
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
 
Présentation Rex GWT 2.0
Présentation Rex GWT 2.0Présentation Rex GWT 2.0
Présentation Rex GWT 2.0Ippon
 
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
 
Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008Guillaume Laforge
 
GWT Approfondissement - GTI780 & MTI780 - ETS - A08
GWT Approfondissement - GTI780 & MTI780 - ETS - A08GWT Approfondissement - GTI780 & MTI780 - ETS - A08
GWT Approfondissement - GTI780 & MTI780 - ETS - A08Claude Coulombe
 

Tendances (20)

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)
 
Gradle_NormandyJUG
Gradle_NormandyJUGGradle_NormandyJUG
Gradle_NormandyJUG
 
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)
 
GWT Principes & Techniques
GWT Principes & TechniquesGWT Principes & Techniques
GWT Principes & Techniques
 
Présentation1
Présentation1Présentation1
Présentation1
 
Soiree Maven 2
Soiree Maven 2Soiree Maven 2
Soiree Maven 2
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven
 
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
 
Sonar-Hodson-Maven
Sonar-Hodson-MavenSonar-Hodson-Maven
Sonar-Hodson-Maven
 
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
 
JCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratiqueJCertif 2012 : Maven par la pratique
JCertif 2012 : Maven par la pratique
 
Présentation Maven
Présentation MavenPrésentation Maven
Présentation Maven
 
20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven
 
Uni.sherbrooke 2015 créez la meilleur application grâce à gwt, gwtp et j...
Uni.sherbrooke 2015   créez la meilleur application grâce à gwt, gwtp et j...Uni.sherbrooke 2015   créez la meilleur application grâce à gwt, gwtp et j...
Uni.sherbrooke 2015 créez la meilleur application grâce à gwt, gwtp et j...
 
20080311 - Paris Vi Master STL TA - Initiation Maven
20080311 - Paris Vi Master STL TA - Initiation Maven20080311 - Paris Vi Master STL TA - Initiation Maven
20080311 - Paris Vi Master STL TA - Initiation Maven
 
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
 
Présentation Rex GWT 2.0
Présentation Rex GWT 2.0Présentation Rex GWT 2.0
Présentation Rex GWT 2.0
 
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
 
Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008
 
GWT Approfondissement - GTI780 & MTI780 - ETS - A08
GWT Approfondissement - GTI780 & MTI780 - ETS - A08GWT Approfondissement - GTI780 & MTI780 - ETS - A08
GWT Approfondissement - GTI780 & MTI780 - ETS - A08
 

En vedette

China Draft Outline of the 13th five year plan, March 2016
China Draft Outline of the 13th five year plan, March 2016China Draft Outline of the 13th five year plan, March 2016
China Draft Outline of the 13th five year plan, March 2016Energy for One World
 
Scientific Article Recommendations with Mahout
Scientific Article Recommendations with MahoutScientific Article Recommendations with Mahout
Scientific Article Recommendations with MahoutData Science London
 
Big Data Expo 2015 - Ureason
Big Data Expo 2015 - UreasonBig Data Expo 2015 - Ureason
Big Data Expo 2015 - UreasonBigDataExpo
 
Transformation in large Telecommunications Providers
Transformation in large Telecommunications ProvidersTransformation in large Telecommunications Providers
Transformation in large Telecommunications Providersbasmeh
 
ENGMauricioGuzmanManzaneraCV
ENGMauricioGuzmanManzaneraCVENGMauricioGuzmanManzaneraCV
ENGMauricioGuzmanManzaneraCVMauricio Guzmán
 

En vedette (10)

Presentación1
Presentación1Presentación1
Presentación1
 
Digital Bangladesh
Digital BangladeshDigital Bangladesh
Digital Bangladesh
 
China Draft Outline of the 13th five year plan, March 2016
China Draft Outline of the 13th five year plan, March 2016China Draft Outline of the 13th five year plan, March 2016
China Draft Outline of the 13th five year plan, March 2016
 
Nowcasting Business Performance
Nowcasting Business PerformanceNowcasting Business Performance
Nowcasting Business Performance
 
Scientific Article Recommendations with Mahout
Scientific Article Recommendations with MahoutScientific Article Recommendations with Mahout
Scientific Article Recommendations with Mahout
 
Big Data Expo 2015 - Ureason
Big Data Expo 2015 - UreasonBig Data Expo 2015 - Ureason
Big Data Expo 2015 - Ureason
 
Transformation in large Telecommunications Providers
Transformation in large Telecommunications ProvidersTransformation in large Telecommunications Providers
Transformation in large Telecommunications Providers
 
Coordenadas
CoordenadasCoordenadas
Coordenadas
 
Bank accounts
Bank accountsBank accounts
Bank accounts
 
ENGMauricioGuzmanManzaneraCV
ENGMauricioGuzmanManzaneraCVENGMauricioGuzmanManzaneraCV
ENGMauricioGuzmanManzaneraCV
 

Similaire à Gradle_BreizJUG

Aperçu de RequireJS
Aperçu de RequireJSAperçu de RequireJS
Aperçu de RequireJSVISEO
 
Introduction à SBT
Introduction à SBTIntroduction à SBT
Introduction à SBTJean Detoeuf
 
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
 
JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924Gregory Boissinot
 
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
 
Scub Foundation, usine logicielle Java libre
Scub Foundation, usine logicielle Java libreScub Foundation, usine logicielle Java libre
Scub Foundation, usine logicielle Java libreStéphane Traumat
 
Play framework - Human Talks Grenoble - 12.02.2013
Play framework - Human Talks Grenoble - 12.02.2013Play framework - Human Talks Grenoble - 12.02.2013
Play framework - Human Talks Grenoble - 12.02.2013Xavier NOPRE
 
Migrer de Jenkins vers Azure DevOps les Builds Java
Migrer de Jenkins vers Azure DevOps les Builds JavaMigrer de Jenkins vers Azure DevOps les Builds Java
Migrer de Jenkins vers Azure DevOps les Builds JavaCédric Leblond
 
Cedric leblond migrer jenkins AWS vers Azure Devops
Cedric leblond migrer jenkins AWS vers Azure DevopsCedric leblond migrer jenkins AWS vers Azure Devops
Cedric leblond migrer jenkins AWS vers Azure DevopsFactoVia
 
Cedric leblond migrer jenkins AWS vers Azure Devops
Cedric leblond migrer jenkins AWS vers Azure DevopsCedric leblond migrer jenkins AWS vers Azure Devops
Cedric leblond migrer jenkins AWS vers Azure DevopsAZUG FR
 
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
 
Dev cloud java : la tête dans les nuages
Dev cloud java : la tête dans les nuagesDev cloud java : la tête dans les nuages
Dev cloud java : la tête dans les nuagesSOAT
 
Être productif avec JHipster - Devoxx France 2017
Être productif avec JHipster - Devoxx France 2017Être productif avec JHipster - Devoxx France 2017
Être productif avec JHipster - Devoxx France 2017Julien Dubois
 
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
 
Comparatif des frameworks js mv
Comparatif des frameworks js mvComparatif des frameworks js mv
Comparatif des frameworks js mvMael Monnier
 

Similaire à Gradle_BreizJUG (20)

Aperçu de RequireJS
Aperçu de RequireJSAperçu de RequireJS
Aperçu de RequireJS
 
Maven et industrialisation du logiciel
Maven et industrialisation du logicielMaven et industrialisation du logiciel
Maven et industrialisation du logiciel
 
Maven
MavenMaven
Maven
 
Introduction à SBT
Introduction à SBTIntroduction à SBT
Introduction à SBT
 
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
 
JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924
 
Gradle
GradleGradle
Gradle
 
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
 
Scub Foundation, usine logicielle Java libre
Scub Foundation, usine logicielle Java libreScub Foundation, usine logicielle Java libre
Scub Foundation, usine logicielle Java libre
 
Play framework - Human Talks Grenoble - 12.02.2013
Play framework - Human Talks Grenoble - 12.02.2013Play framework - Human Talks Grenoble - 12.02.2013
Play framework - Human Talks Grenoble - 12.02.2013
 
Springioc
SpringiocSpringioc
Springioc
 
Migrer de Jenkins vers Azure DevOps les Builds Java
Migrer de Jenkins vers Azure DevOps les Builds JavaMigrer de Jenkins vers Azure DevOps les Builds Java
Migrer de Jenkins vers Azure DevOps les Builds Java
 
Cedric leblond migrer jenkins AWS vers Azure Devops
Cedric leblond migrer jenkins AWS vers Azure DevopsCedric leblond migrer jenkins AWS vers Azure Devops
Cedric leblond migrer jenkins AWS vers Azure Devops
 
Cedric leblond migrer jenkins AWS vers Azure Devops
Cedric leblond migrer jenkins AWS vers Azure DevopsCedric leblond migrer jenkins AWS vers Azure Devops
Cedric leblond migrer jenkins AWS vers Azure Devops
 
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
 
Universitélang scala tools
Universitélang scala toolsUniversitélang scala tools
Universitélang scala tools
 
Dev cloud java : la tête dans les nuages
Dev cloud java : la tête dans les nuagesDev cloud java : la tête dans les nuages
Dev cloud java : la tête dans les nuages
 
Être productif avec JHipster - Devoxx France 2017
Être productif avec JHipster - Devoxx France 2017Être productif avec JHipster - Devoxx France 2017
Être productif avec JHipster - Devoxx France 2017
 
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
 
Comparatif des frameworks js mv
Comparatif des frameworks js mvComparatif des frameworks js mv
Comparatif des frameworks js mv
 

Plus de Gregory Boissinot

Plus 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_BreizJUG

  • 1. GRADLE Grégory Boissinot 13/09/2010 Copyright © BreizhJug
  • 2. A mon propos •  Consultant et formateur Zenika – Mes spécialités: Build et Intégration continue – Build master chez Thales •  Introduction et déploiement de Gradle à grande échelle •  Commiter Hudson – Intégration des châines de build Gradle, C/C++, ADA Copyright © BreizhJug
  • 3. Pourquoi un outil de plus? •  La nature des besoins a changé – Augmentation des besoins d'automatisation – Un build peut faire beaucoup plus de choses que la simple création d'une archive Java Copyright © BreizhJug
  • 4. Evolution des outils 2000 2005 2008 1ère génération 2ème génération 3ème génération 2 3 1 Copyright © BreizhJug
  • 5. Gradle: première définition •  Système de build pour les projets Java, Groovy, OSGI, Web et Scala •  Flexible à la Ant avec les conventions de Maven à la demande •  Insertion totale dans une infrastructure Ant et Maven existante Copyright © BreizhJug
  • 6. Approche déclarative et notion de conventions •  Spécification du 'quoi' et pas du 'comment' apply plugin:'java' > gradle clean build :clean repositories { :compileJava src mavenCentral() :processResources } :classes myLib main .jar :jar dependencies { java :assemble compile :compileTestJava resources "jdom:jdom:1.0" :processTestResources testCompile :testClasses "junit:junit:4.7" :test test } :check java :build BUILD SUCCESSFUL resources Copyright © BreizhJug
  • 7. On ne peut pas anticiper tous les besoins des projets Copyright © BreizhJug
  • 8. Un langage de build configurations repositories build.gradle dependencies Project ant task artifacts API Copyright © BreizhJug
  • 9. Un langage de build extensible •  Conçu pour répondre à tous les scénarios possibles – Plusieurs répertoires de sources par projet – Une version de JDK par répertoire – Plusieurs artefacts par projet – .... •  Nombreux points d'extension •  Fourniture de ses propres éléments Copyright © BreizhJug
  • 10. Délégation du build à un ensemble de tâches // build.gradle > gradle distribution task(distribution).doFirst{ :distribution println "Print Distribution" Print Distribution for (int i:[1,2,3]){ print i } 123 } > gradle release task(release) :distribution release.dependsOn(distribution) Print Distribution release.doFirst{ 123 println "Print Release" :release AbstractCopyTask } Print Release task mycopy (type:Copy){ from(file('resources')) AbstractArchiveTask Copy into(file('target')) include('**/*.txt', '**/*.xml') } Zip Tar myCopy.exclude('**/.properties') public class Copy extends AbstractCopyTask { AbstractCopyTask from(Object... sourcePaths); AbstractCopyTask into(Object destDir); AbstractCopyTask includes(String includes); Copyright © BreizhJug AbstractCopyTask excludes(String excludes); }
  • 11. Création de tâches personnalisées // common.gradle class HelloTask extends DefaultTask { def message="Default Message" @TaskAction > gradle myhello public void print(){ :myhello println message Default Message } } > gradle myhello2 :myhello2 // build.gradle Task Message apply from : 'http://ci.repo/common.gradle' task(myhello, type:HelloTask) task(myhello2, type:HelloTask){ message="Task Message" } Copyright © BreizhJug
  • 12. Regroupement des tâches sous forme de plugins Plugins maven Java Configuration Object eclipse idea Jetty Configuration War Configuration Object Object code-quality war … … projects-reports java … jetty osgi Project scala Configuration Copyright © BreizhJug
  • 13. Performance •  Gestion multi-projet avancée •  Utilisation d'un cache •  Exécution parallèle des tests Copyright © BreizhJug
  • 14. Gestion multi-projet // settings.gradle avancée shared include 'api', 'shared', 'services:webservices' webservices api // root build.gradle api > gradle buildNeeded subprojects { :shared:jar apply plugin: 'java' :api:jar } :api:test project(':api') { :shared:test dependencies { compile project(':shared') api > gradle buildDependents } :shared:jar } :api:jar :api:test // webservices/build.gradle :webservices:war apply plugin:'war' :webservices:test dependencies { compile api > gradle –-no-rebuild project(':shared'), project(':api'), api:jar 'commons-io:commons-io:1.2' } Copyright © BreizhJug
  • 15. Utilisation d'un cache •  Le script est compilé uniquement en cas de nouveaux changements •  Détection des changements des inputs et des outputs >gradle myzip :myzip >gradle myzip :myzip UP-TO-DATE >gradle myzip –-cahce rebuild :myzip Copyright © BreizhJug
  • 16. Exécution parallèle des tests 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 } Copyright © BreizhJug
  • 17. Haut niveau de contrôle Copyright © BreizhJug
  • 18. Introspecter et manipuler un build CONFIGURATION PHASE t1 t2 t3 t1 t2 t3 EXECUTION PHASE t4 t4 HOOK GRADLE SCRIPT Project Project Engine Convention 1 Convention 2 gradle –-properties version = 1.0 gradle –-tasks –-all gradle.taskGraph.whenReady{taskGraph -> gradle –-dependencies if (!taskGraph.hasTask(':release')){ gradle –-dry-run build version+='-SNAPSHOT' } } Copyright © BreizhJug
  • 19. Être à l'écoute de son build •  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() } } Copyright © BreizhJug
  • 20. Tester vos scripts 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 !zipTree(myzip.archivePath).isEmpty()) .zip txtfiles = fileTree('somedir').include('*.txt') check ziptxtfiles=zipTree(myzip.archivePath).matching{ include('*.txt') } Assert.assertEquals ( txtfiles.getFiles().size(), BUILD SUCCESSFUL ziptxtfiles.getFiles().size()) > } } Copyright © BreizhJug
  • 21. Une boîte à outils pour une insertion dans l'existant Copyright © BreizhJug
  • 22. Réutilisation des tâches Ant ant.echo (message:ANT) ant { def wsdl2java_classpath = path { fileset(dirs:'lib', includes: '*.jar') } taskdef( name: 'axiswsdl2java', classname: 'org.apache.axis.tools.ant.wsdl.Wsdl2javaAntTask', classpath: wsdl2java_classpath ) axiswsdl2java( output:"generated", verbose:"true" , url:"Exemple.wsdl" ) } Copyright © BreizhJug
  • 23. Réutilisation des scripts ANT build.xml <project> <target name="antTask"> <echo message="Hello from Ant"/> </target> </project> build.grad ant.importBuild('build.xml') le antTask.doLast { println('Hello from Gradle') } > gradle antTask :antTask Hello from Ant Hello from Gradle Copyright © BreizhJug
  • 24. Déploiement dans un dépôt Ivy apply plugin:'java' repositories { IVY flatDir(dirs:'destrepo', name:'ivyrep’) } group='test' > gradle uploadArchives version='1.0' status='release' uploadArchives { repositories { add(repositories.ivyrep) } Repository } Ivy distant Artifacts + meta Ivy Copyright © BreizhJug
  • 25. Déploiement dans un dépôt Maven apply plugin:'java' Maven apply plugin:'maven' Ant Tasks group='test' version='1.0-SNAPSHOT' uploadArchives { repositories { mavenDeployer { > gradle > gradle repository( install uploadArchives url: remoteRepo) } } } Repository Repository Maven Maven Artifacts + Local meta Maven distant Artifacts + meta Maven Copyright © BreizhJug
  • 26. Qui utilise Gradle en 2010? gmock spcok security Copyright © BreizhJug
  • 27. Roadmap •  Nouveau DSL de gestion des dépendances •  Build Daemon (Amélioration du temps de démarrage et d'exécution) •  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 Copyright © BreizhJug
  • 29. Parlez-en! •  Essayez-le! •  Utilisez-le! •  Faites du buzz! Copyright © BreizhJug