SlideShare une entreprise Scribd logo
1  sur  23
GRADLE

                        Grégory Boissinot
                          10/05/2010


  Présentation Gradle                       1
•  Consultant et formateur chez Zenika

•  Mes spécialités
    – Ant/Ivy
    – Maven
    – Gradle
    – Hudson

•  Contributeur Hudson

•  Introduction et mis en place de Gradle chez un très grand compte
   industriel


                             Présentation Gradle                      2
•  Système de build pour la JVM Java, focalisé sur le build
   des applications d'entreprise

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

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

•  Une gestion avancée d'un projet multi-modules

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

                           Présentation Gradle                  3
1ère génération    2ème génération              3ème génération

2000                2005                         2008



                                             2


                                                                    3
            1




                       Présentation Gradle                              4
<!–- ANT -- build.xml -->
<project>
  <property name="version"
                                <!–- MAVEN – pom.xml-->
            value="1.0"/>
                                <?xml version="1.0" encoding="UTF-8"?>
  <target name="antTask>
                                <project>
    <echo message="Hello"/>
                                  <modelVersion>4.0.0</modelVersion>
  </target>
                                  <groupId>com.zenika</groupId>
</project>
                                  <artifactId>zenikac-core</artifactId>
                                  <version>1.0</version>
<!–- GRADLE– build.gradle -->     <dependencies>
apply plugin:'java'                 <dependency>
                                      <groupId>org.apache.wicket</groupId>
repositories {                        <artifactId>wicket</artifactId>
   mavenCental()                      <version>1.4.7</version>
   flatDir(dirs:'lib')                <scope>compile</scope>
}                                   </dependency>
                                  </dependencies>
dependencies {                  </project>
  compile
    "org.apache.wicket:wicket:1.4.7"
}


                               Présentation Gradle                       5
Distribution Gradle


  CORE               UI         WRAPPER                OPEN-API          DOCS

                                                                                api


 java        groovy       maven               osgi        code-quality

 war         jetty         scala            eclipse       project-reports
                                                                            plugins



  Ant           Ivy            Maven Ant Tasks                 Groovy

                                                                              outils


checkstyle     codeNarc       webdav                Autres dépendances

                                                                  Librairies tierces


                              Présentation Gradle                                      6
Écrire un script Gradle consiste à configurer un objet Gradle Project




                                                     configurations

                        repositories
                                                                      dependencies
  build.gradle




                                         Project
                                                                            ant


                            task                          artifacts


                                                API

                               Présentation Gradle                                   7
Un script de build Gradle est défini par un ensemble de tâches sur
  lesquelles sont ajoutées des actions qui sont des closures Groovy

<!-- build.gradle -->
task(hello)
hello.doFirst{                                      > gradle hello
  println "Hello World"                             :hello
                                                    Hello World
  for (int i:[1,2,3]){                              123
    print i
  }                                                 > gradle distribution
}                                                   :distribution
                                                    Print Distribution
task(distribution).doFirst {
    println "Print Distribution"                    > gradle release
}                                                   :distribution
                                                    Print Distribution
                                                    :release
task(release)                                       Print Release
release.dependsOn(distribution)
release.doFirst{
    println "Print Release"
}
                              Présentation Gradle                           8
task mycopy (type:Copy){
  from(file('resources'))
  into(file('target'))                                                    ConventionTask
  include('**/*.txt', '**/*.xml')
}

myCopy.include('**/*.properties')                            SourceTask           AbstractCopyTask




                                         Javadoc                   Copy           AbstractArchiveTask




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




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

    def message="Default Message"

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

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



                           Présentation Gradle                       10
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" )
}

ant.echo (message:ANT)




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



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



> gradle antTask
:antTask
Hello from Ant
Hello from Gradle
                  Présentation Gradle                   12
import org.junit.Assert

task myzip (type:Zip) {
  from 'somedir'
  include '*.txt'
  baseName='zipname'
  doLast {
   Assert.assertEquals('zipname.zip', myzip.archiveName)
   Assert.assertEquals(file('build/distributions'),
                        myzip.destinationDir)

        Assert.assertTrue( ! zipTree(myzip.archivePath).isEmpty())
        ziptxtfiles=zipTree(myzip.archivePath).matching{
          include('*.txt')
        }
        txtfiles=fileTree('somedir').include('*.txt')
        Assert.assertEquals (
                txtfiles.getFiles().size(),
                ziptxtfiles.getFiles().size())

    }
}
                                Présentation Gradle                  13
Chaque plugin déclaré apporte un ensemble de tâches et de propriétés



  CORE               UI        WRAPPER              OPEN-API         DOCS

                                                                            api


 java       groovy        maven              osgi     code-quality

 war         jetty        scala           eclipse     project-reports
                                                                        plugins



   Ant          Ivy           Maven Ant Tasks             Groovy

                                                                         outils




                             Présentation Gradle                                  14
> gradle clean build
                                  :clean
apply plugin:'java'               :compileJava
                                  :processResources
repositories {                    :classes
  mavenCentral()                  :jar
  flatDir(dirs:'destrepo',        :assemble
          name:'ivyrep’)          :compileTestJava         myLib
}                                 :processTestResources    .jar
                                  :testClasses
dependencies {                    :test
  compile                         :check
    "jdom:jdom:1.0",              :build
    ":qtjambi:4.5.2_01"
  testCompile                     BUILD SUCCESSFUL
    "junit:junit:4.7"
}                                 Total time: 2.937 secs




                             Présentation Gradle                   15
apply plugin:'war'
                                                 > gradle build -PskipTest
processResources.enabled=false                   :compileJava
                                                 :processResources SKIPPED
//Add behavior in the lifecycle                  :classes
task(preJar)                                     :preJar
jar.dependsOn preJar                             :jar
                                                 :war
//Predicate                                      :assemble
                                                 :compileTestJava
test.onlyIf{
                                                 :processTestResources
  !project.hasProperty('skipTests')              :testClasses
}                                                :test SKIPPED
                                                 :check
//Change the output directory                    :build
buildDirName='target'
                                                 BUILD SUCCESSFUL
//Change the source directory
                                                 Total time: 2.937 secs
sourceSets{
  main{
    java.srcDir file('src/main')
  }
}                          Présentation Gradle                               16
Soyez informé de tous les événements de votre chaîne de build
     class MyTestListener implements TestListener{

         void beforeSuite(TestDescriptor suite) {
           println('suiteStarting: '+suite.getName())
         }

         void afterSuite(TestDescriptor suite,
                      TestResult result) {
           println 'suiteFinished: '+suite.getName()
         }

         void beforeTest(TestDescriptor test) {
           println 'testStarting: '+test.getName()
         }

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

                          Présentation Gradle                   17
<!-- settings.gradle -->                                   shared
include 'api',
        'shared',
        'services:webservices'

 <!–- build.gradle -->                             webservices      api
 version='1.0'
 subprojects {
   apply plugin: 'java'                   api > gradle buildNeeded
 }                                        :shared:jar
 project(':api') {                        :api:jar
   dependencies {                         :api:test
     compile project(':shared')           :shared:test
   }
 }
<!–- webservices/build.gradle -->         api > gradle buildDependents
apply plugin:'war'                        :shared:jar
dependencies {                            :api:jar
  compile                                 :api:test
    project(':shared'),                   :webservices:war
    project(':api'),                      :webservices:test
   'commons-io:commons-io:1.2'
}
                             Présentation Gradle                          18
apply plugin:'java'

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

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

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



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

uploadArchives {
  repositories {
    mavenDeployer {
      repository(                      > gradle      > gradle
         url: remoteRepo)                install       uploadArchives
    }
  }
}



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


                             Présentation Gradle                              20
•  Amélioration constante de la DSL pour encore plus de richesse et
   de simplicité

•  Support amélioré dans les IDE

•  Une abstraction de Ivy pour encore un gestionnaire de
   dépendance plus avancé

•  Parallélisation/Distribution des builds

•  Réutilisation des plugins Maven et import de projets Maven

•  Simplification dans la phase de publication des artefacts

                                Présentation Gradle                   21
gmock


   spcok




           Présentation Gradle   22
•  Gradle vous offre toute la richesse pour exprimer vos chaines de
   build au plus près de vos besoins

•  Gradle fournit une approche déclarative de premier plan

•  Gradle est un système de build complet et alternatif pour builder
   vos applications

•  Gradle s'insère nativement en lecture et en écriture dans votre
   existant pour l'enrichir




                              Présentation Gradle                      23

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
 
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
 
Gwt jetty et sources de données
Gwt   jetty et sources de donnéesGwt   jetty et sources de données
Gwt jetty et sources de donnéesFranck SIMON
 
Déploiement d'une application Java EE dans Azure
Déploiement d'une application Java EE dans AzureDéploiement d'une application Java EE dans Azure
Déploiement d'une application Java EE dans AzureJosé Paumard
 
Présentation Maven
Présentation MavenPrésentation Maven
Présentation MavenSOAT
 
Présentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'OfflinePrésentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'OfflineDNG Consulting
 
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
 
Concevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootDNG Consulting
 
NightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery AvancéNightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery AvancéZenika
 
Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008Guillaume Laforge
 
Une (simple) présentation de Apache Maven 2
Une (simple) présentation de Apache Maven 2Une (simple) présentation de Apache Maven 2
Une (simple) présentation de Apache Maven 2teejug
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache MavenArnaud Héritier
 

Tendances (20)

Gradle_ToursJUG
Gradle_ToursJUGGradle_ToursJUG
Gradle_ToursJUG
 
Presentation of GWT 2.4 (PDF version)
Presentation of GWT 2.4 (PDF version)Presentation of GWT 2.4 (PDF version)
Presentation of GWT 2.4 (PDF version)
 
Presentation of GWT 2.4 (PowerPoint version)
Presentation of GWT 2.4 (PowerPoint version)Presentation of GWT 2.4 (PowerPoint version)
Presentation of GWT 2.4 (PowerPoint version)
 
Présentation1
Présentation1Présentation1
Présentation1
 
GWT Principes & Techniques
GWT Principes & TechniquesGWT Principes & Techniques
GWT Principes & Techniques
 
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
 
Gwt jetty et sources de données
Gwt   jetty et sources de donnéesGwt   jetty et sources de données
Gwt jetty et sources de données
 
Springioc
SpringiocSpringioc
Springioc
 
Android ORMLite
Android   ORMLiteAndroid   ORMLite
Android ORMLite
 
Déploiement d'une application Java EE dans Azure
Déploiement d'une application Java EE dans AzureDéploiement d'une application Java EE dans Azure
Déploiement d'une application Java EE dans Azure
 
Présentation Maven
Présentation MavenPrésentation Maven
Présentation Maven
 
Présentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'OfflinePrésentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'Offline
 
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
 
Concevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring Boot
 
NightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery AvancéNightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery Avancé
 
Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008
 
Une (simple) présentation de Apache Maven 2
Une (simple) présentation de Apache Maven 2Une (simple) présentation de Apache Maven 2
Une (simple) présentation de Apache Maven 2
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven
 
Présentation OSGI
Présentation OSGIPrésentation OSGI
Présentation OSGI
 
Maven et industrialisation du logiciel
Maven et industrialisation du logicielMaven et industrialisation du logiciel
Maven et industrialisation du logiciel
 

En vedette

En vedette (7)

Paris Redis Meetup Starting
Paris Redis Meetup StartingParis Redis Meetup Starting
Paris Redis Meetup Starting
 
Spring Integration JUG SummerCamp 2013
Spring Integration JUG SummerCamp 2013Spring Integration JUG SummerCamp 2013
Spring Integration JUG SummerCamp 2013
 
Gradle
GradleGradle
Gradle
 
Gradle
GradleGradle
Gradle
 
PZ_Microservices101_20150210
PZ_Microservices101_20150210PZ_Microservices101_20150210
PZ_Microservices101_20150210
 
Gradle Introduction
Gradle IntroductionGradle Introduction
Gradle Introduction
 
Paris Redis Meetup Introduction
Paris Redis Meetup IntroductionParis Redis Meetup Introduction
Paris Redis Meetup Introduction
 

Similaire à Gradle_Paris2010

Introduction à SBT
Introduction à SBTIntroduction à SBT
Introduction à SBTJean Detoeuf
 
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
 
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
 
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
 
MarsJUG - Le classpath n'est pas mort, mais presque
MarsJUG - Le classpath n'est pas mort, mais presqueMarsJUG - Le classpath n'est pas mort, mais presque
MarsJUG - Le classpath n'est pas mort, mais presqueAlexis Hassler
 
Ops@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier KrantzOps@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier KrantzOlivier DASINI
 
Aperçu de RequireJS
Aperçu de RequireJSAperçu de RequireJS
Aperçu de RequireJSVISEO
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hoodsvuillet
 
Apache flink - prise en main rapide
Apache flink - prise en main rapideApache flink - prise en main rapide
Apache flink - prise en main rapideBilal Baltagi
 
Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Aurélien Maury
 
Du développement à la livraison avec JavaFX et le JDK9
Du développement à la livraison avec JavaFX et le JDK9Du développement à la livraison avec JavaFX et le JDK9
Du développement à la livraison avec JavaFX et le JDK9Thierry Wasylczenko
 
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...XavierPestel
 
Docker en Production (Docker Paris)
Docker en Production (Docker Paris)Docker en Production (Docker Paris)
Docker en Production (Docker Paris)Jérôme Petazzoni
 
optimadata.nl-Comment exécuter Postgres sur Docker partie 1.pdf
optimadata.nl-Comment exécuter Postgres sur Docker partie 1.pdfoptimadata.nl-Comment exécuter Postgres sur Docker partie 1.pdf
optimadata.nl-Comment exécuter Postgres sur Docker partie 1.pdfPascal Ponzoni
 
L’environnement de programmation fonctionnelle DrRacket
L’environnement de programmation fonctionnelle DrRacketL’environnement de programmation fonctionnelle DrRacket
L’environnement de programmation fonctionnelle DrRacketStéphane Legrand
 
Framework Hibernate
Framework HibernateFramework Hibernate
Framework HibernateInes Ouaz
 
Python application packaging @ MeilleursAgents
Python application packaging @ MeilleursAgentsPython application packaging @ MeilleursAgents
Python application packaging @ MeilleursAgentsNicolas Mussat
 

Similaire à Gradle_Paris2010 (20)

Introduction à SBT
Introduction à SBTIntroduction à SBT
Introduction à SBT
 
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
 
Maven
MavenMaven
Maven
 
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
 
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
 
MarsJUG - Le classpath n'est pas mort, mais presque
MarsJUG - Le classpath n'est pas mort, mais presqueMarsJUG - Le classpath n'est pas mort, mais presque
MarsJUG - Le classpath n'est pas mort, mais presque
 
Ops@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier KrantzOps@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
Ops@viadeo : Puppet & Co... 6 mois après par Xavier Krantz
 
Aperçu de RequireJS
Aperçu de RequireJSAperçu de RequireJS
Aperçu de RequireJS
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hood
 
Soiree Maven 2
Soiree Maven 2Soiree Maven 2
Soiree Maven 2
 
Apache flink - prise en main rapide
Apache flink - prise en main rapideApache flink - prise en main rapide
Apache flink - prise en main rapide
 
Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011
 
Du développement à la livraison avec JavaFX et le JDK9
Du développement à la livraison avec JavaFX et le JDK9Du développement à la livraison avec JavaFX et le JDK9
Du développement à la livraison avec JavaFX et le JDK9
 
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
 
Docker en Production (Docker Paris)
Docker en Production (Docker Paris)Docker en Production (Docker Paris)
Docker en Production (Docker Paris)
 
optimadata.nl-Comment exécuter Postgres sur Docker partie 1.pdf
optimadata.nl-Comment exécuter Postgres sur Docker partie 1.pdfoptimadata.nl-Comment exécuter Postgres sur Docker partie 1.pdf
optimadata.nl-Comment exécuter Postgres sur Docker partie 1.pdf
 
L’environnement de programmation fonctionnelle DrRacket
L’environnement de programmation fonctionnelle DrRacketL’environnement de programmation fonctionnelle DrRacket
L’environnement de programmation fonctionnelle DrRacket
 
Apache ANT
Apache ANTApache ANT
Apache ANT
 
Framework Hibernate
Framework HibernateFramework Hibernate
Framework Hibernate
 
Python application packaging @ MeilleursAgents
Python application packaging @ MeilleursAgentsPython application packaging @ MeilleursAgents
Python application packaging @ MeilleursAgents
 

Plus de Gregory Boissinot

Plus de Gregory Boissinot (10)

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
 
Jenkins-meetup
Jenkins-meetupJenkins-meetup
Jenkins-meetup
 
JENKINS_BreizhJUG_20111003
JENKINS_BreizhJUG_20111003JENKINS_BreizhJUG_20111003
JENKINS_BreizhJUG_20111003
 
JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924JENKINS_OWF11_OSDC_PARIS20110924
JENKINS_OWF11_OSDC_PARIS20110924
 
Jenkins_UserMeetup_Paris_201105
Jenkins_UserMeetup_Paris_201105Jenkins_UserMeetup_Paris_201105
Jenkins_UserMeetup_Paris_201105
 
Gradle_YaJUG
Gradle_YaJUGGradle_YaJUG
Gradle_YaJUG
 

Gradle_Paris2010

  • 1. GRADLE Grégory Boissinot 10/05/2010 Présentation Gradle 1
  • 2. •  Consultant et formateur chez Zenika •  Mes spécialités – Ant/Ivy – Maven – Gradle – Hudson •  Contributeur Hudson •  Introduction et mis en place de Gradle chez un très grand compte industriel Présentation Gradle 2
  • 3. •  Système de build pour la JVM Java, focalisé sur le build des applications d'entreprise •  Modèle de description du build très riche à travers une API •  Flexible à la Ant avec les conventions de Maven à la demande •  Une gestion avancée d'un projet multi-modules •  Support et insertion totale dans des infrastructures Maven et Ant/Ivy existantes Présentation Gradle 3
  • 4. 1ère génération 2ème génération 3ème génération 2000 2005 2008 2 3 1 Présentation Gradle 4
  • 5. <!–- ANT -- build.xml --> <project> <property name="version" <!–- MAVEN – pom.xml--> value="1.0"/> <?xml version="1.0" encoding="UTF-8"?> <target name="antTask> <project> <echo message="Hello"/> <modelVersion>4.0.0</modelVersion> </target> <groupId>com.zenika</groupId> </project> <artifactId>zenikac-core</artifactId> <version>1.0</version> <!–- GRADLE– build.gradle --> <dependencies> apply plugin:'java' <dependency> <groupId>org.apache.wicket</groupId> repositories { <artifactId>wicket</artifactId> mavenCental() <version>1.4.7</version> flatDir(dirs:'lib') <scope>compile</scope> } </dependency> </dependencies> dependencies { </project> compile "org.apache.wicket:wicket:1.4.7" } Présentation Gradle 5
  • 6. Distribution Gradle CORE UI WRAPPER OPEN-API DOCS api java groovy maven osgi code-quality war jetty scala eclipse project-reports plugins Ant Ivy Maven Ant Tasks Groovy outils checkstyle codeNarc webdav Autres dépendances Librairies tierces Présentation Gradle 6
  • 7. Écrire un script Gradle consiste à configurer un objet Gradle Project configurations repositories dependencies build.gradle Project ant task artifacts API Présentation Gradle 7
  • 8. Un script de build Gradle est défini par un ensemble de tâches sur lesquelles sont ajoutées des actions qui sont des closures Groovy <!-- build.gradle --> task(hello) hello.doFirst{ > gradle hello println "Hello World" :hello Hello World for (int i:[1,2,3]){ 123 print i } > gradle distribution } :distribution Print Distribution task(distribution).doFirst { println "Print Distribution" > gradle release } :distribution Print Distribution :release task(release) Print Release release.dependsOn(distribution) release.doFirst{ println "Print Release" } Présentation Gradle 8
  • 9. task mycopy (type:Copy){ from(file('resources')) into(file('target')) ConventionTask include('**/*.txt', '**/*.xml') } myCopy.include('**/*.properties') SourceTask AbstractCopyTask Javadoc Copy AbstractArchiveTask Zip Tar public class Copy extends AbstractCopyTask { public AbstractCopyTask from(Object... sourcePaths); public AbstractCopyTask into(Object destDir); } Jar War Présentation Gradle 9
  • 10. <!– HelloTask.groovy --> class HelloTask extends DefaultTask { def message="Default Message" @TaskAction public void print(){ > gradle myhello println message :myhello } Default Message } > gradle myhello2 <!-- build.gradle --> :myhello2 Task Message task(myhello, type:HelloTask) task(myhello2, type:HelloTask){ message="Task Message" } Présentation Gradle 10
  • 11. 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" ) } ant.echo (message:ANT) Présentation Gradle 11
  • 12. build.xml <project> <target name="antTask"> <echo message="Hello from Ant"/> </target> </project> build.gradle ant.importBuild('build.xml') antTask.doLast { println('Hello from Gradle') } > gradle antTask :antTask Hello from Ant Hello from Gradle Présentation Gradle 12
  • 13. import org.junit.Assert task myzip (type:Zip) { from 'somedir' include '*.txt' baseName='zipname' doLast { Assert.assertEquals('zipname.zip', myzip.archiveName) Assert.assertEquals(file('build/distributions'), myzip.destinationDir) Assert.assertTrue( ! zipTree(myzip.archivePath).isEmpty()) ziptxtfiles=zipTree(myzip.archivePath).matching{ include('*.txt') } txtfiles=fileTree('somedir').include('*.txt') Assert.assertEquals ( txtfiles.getFiles().size(), ziptxtfiles.getFiles().size()) } } Présentation Gradle 13
  • 14. Chaque plugin déclaré apporte un ensemble de tâches et de propriétés CORE UI WRAPPER OPEN-API DOCS api java groovy maven osgi code-quality war jetty scala eclipse project-reports plugins Ant Ivy Maven Ant Tasks Groovy outils Présentation Gradle 14
  • 15. > gradle clean build :clean apply plugin:'java' :compileJava :processResources repositories { :classes mavenCentral() :jar flatDir(dirs:'destrepo', :assemble name:'ivyrep’) :compileTestJava myLib } :processTestResources .jar :testClasses dependencies { :test compile :check "jdom:jdom:1.0", :build ":qtjambi:4.5.2_01" testCompile BUILD SUCCESSFUL "junit:junit:4.7" } Total time: 2.937 secs Présentation Gradle 15
  • 16. apply plugin:'war' > gradle build -PskipTest processResources.enabled=false :compileJava :processResources SKIPPED //Add behavior in the lifecycle :classes task(preJar) :preJar jar.dependsOn preJar :jar :war //Predicate :assemble :compileTestJava test.onlyIf{ :processTestResources !project.hasProperty('skipTests') :testClasses } :test SKIPPED :check //Change the output directory :build buildDirName='target' BUILD SUCCESSFUL //Change the source directory Total time: 2.937 secs sourceSets{ main{ java.srcDir file('src/main') } } Présentation Gradle 16
  • 17. Soyez informé de tous les événements de votre chaîne de build class MyTestListener implements TestListener{ void beforeSuite(TestDescriptor suite) { println('suiteStarting: '+suite.getName()) } void afterSuite(TestDescriptor suite, TestResult result) { println 'suiteFinished: '+suite.getName() } void beforeTest(TestDescriptor test) { println 'testStarting: '+test.getName() } void afterTest(TestDescriptor test, TestResult result) { println 'testFinished: '+test.getName() +', result: '+result.getResultType() } } Présentation Gradle 17
  • 18. <!-- settings.gradle --> shared include 'api', 'shared', 'services:webservices' <!–- build.gradle --> webservices api version='1.0' subprojects { apply plugin: 'java' api > gradle buildNeeded } :shared:jar project(':api') { :api:jar dependencies { :api:test compile project(':shared') :shared:test } } <!–- webservices/build.gradle --> api > gradle buildDependents apply plugin:'war' :shared:jar dependencies { :api:jar compile :api:test project(':shared'), :webservices:war project(':api'), :webservices:test 'commons-io:commons-io:1.2' } Présentation Gradle 18
  • 19. apply plugin:'java' repositories { mavenCental() flatDir(dirs:'destrepo', IVY name:'ivyrep’) } group='test' version='1.0' status='release' > gradle uploadArchives uploadArchives { repositories { add(repositories.ivyrep) } } Repository Ivy distant Artifacts + meta Ivy Présentation Gradle 19
  • 20. apply plugin:'java' apply plugin:'maven' Maven Ant group='test' Tasks version='1.0-SNAPSHOT' uploadArchives { repositories { mavenDeployer { repository( > gradle > gradle url: remoteRepo) install uploadArchives } } } Repository Repository Maven Maven Artifacts + Local meta Maven distant Artifacts + meta Maven Présentation Gradle 20
  • 21. •  Amélioration constante de la DSL pour encore plus de richesse et de simplicité •  Support amélioré dans les IDE •  Une abstraction de Ivy pour encore un gestionnaire de dépendance plus avancé •  Parallélisation/Distribution des builds •  Réutilisation des plugins Maven et import de projets Maven •  Simplification dans la phase de publication des artefacts Présentation Gradle 21
  • 22. gmock spcok Présentation Gradle 22
  • 23. •  Gradle vous offre toute la richesse pour exprimer vos chaines de build au plus près de vos besoins •  Gradle fournit une approche déclarative de premier plan •  Gradle est un système de build complet et alternatif pour builder vos applications •  Gradle s'insère nativement en lecture et en écriture dans votre existant pour l'enrichir Présentation Gradle 23