1. NormandyJUG
20 octobre 2009
Builders Battle
Maven / Ivy / Ant / Gradle / EasyAnt ...
2. Grégory Boissinot
• Committer Hudson depuis 2008
• Consultant Zenika
– Spécialiste sur les outils de build et
l'intégration continue
– Formateur sur l'usine logicielle
– A mis en place Gradle chez un grand
acteur de l'industrie
3. Gradle en quelque mots
• Système de build complet et flexible à la Ant
• Utilisation des conventions de Maven à la demande
• Une gestion multi projet avancée
• Utilisation de Apache Ivy comme gestionnaire de
dépendances
– Utilisation par API
• Support et Insertion totale dans une infrastructure
Maven et Ivy existante
• Chaîne de build en Groovy
• Modèle de description du build très riche
4. Architecture
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
build tools
checkstyle codeNarc webdav other dependencies
librairies tierces
5. Notion de tâche
Un script de build Gradle est défini par un
ensemble de tâches sur lesquelle est ajouté des
actions qui sont des closures Groovy
<!-- build.gradle --> Tâche
<!-- build.gradle --> simple
task distribution <<{
task distribution <<{
println "Distribution"
println "Distribution"
}} Accès à l'API
Java
task release (dependsOn: 'distribution')<<{
task release (dependsOn: 'distribution')<<{
println "Release"
println "Release"
}}
>> gradle distribution >> gradle release
gradle release
gradle distribution Distribution
Distribution
Distribution Distribution
Release
Release
7. Une API très riche
task source(type:Jar){
task source(type:Jar){ CustomTask
baseName='source'
baseName='source'
from sourceSets.main.java
from sourceSets.main.java
}}
Abstract
SourceTask ArchiveTask
task distrib(type:Zip){
task distrib(type:Zip){
dependsOn(jar)
dependsOn(jar)
baseName='dist'
baseName='dist'
from sourceSets.main.java Javadoc Zip
from sourceSets.main.java
from jar.archivePath
from jar.archivePath
}}
Jar Tar
task javadoc(type: Javadoc) {{
task javadoc(type: Javadoc)
source sourceSets.main.allJava
}}
source sourceSets.main.allJava War
9. Exécution unique et ordonnée
compile dist
compileTest
test
>> ant test dist
ant test dist >> gradle test dist
gradle test dist
compile
compile :compile
:compile
compileTest
compileTest :compileTest
:compileTest
test
test :test
:test
compile
compile :dist
:dist
compileTest
compileTest
test
test
dist
dist
10. Pour un projet Java/JEE
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
build tools
checkstyle codeNarc webdav other dependencies
librairies tierces
11. Build d'une librairie
<!-- build.gradle --> Configuration
<!-- build.gradle -->
usePlugin 'java' accessible
usePlugin 'java' sous forme
de propriétés
archivesBaseName == 'core'
archivesBaseName 'core' Gradle
version == '3.5'
version '3.5'
manifest.mainAttributes(
manifest.mainAttributes(
'Implementation-Version': version
'Implementation-Version': version
))
repositories {{
repositories
mavenCentral()
mavenCentral()
}} core-3.5.jar
dependencies {{
dependencies
compile group: 'commons-collections',
compile group: 'commons-collections',
name: 'commons-collections',
name: 'commons-collections',
version: '3.2'
version: '3.2'
testCompile group: 'junit',
testCompile group: 'junit',
name: 'junit',
name: 'junit',
version: '4.+'
version: '4.+'
}} >> gradle compileJava
gradle compileJava
>> gradle jar
gradle jar
13. Phases de build
Gradle fournit 3 phases distinctes de build
• Initialisation
– Détermine l'ensemble des projets à builder
– Création d'un objet Projet pour chaque module
• Configuration
– Configuration des objets Project
• Exécution
– Exécution des tâches crées et configurés précédemment
gradle.taskGraph.whenReady {taskGraph ->
gradle.taskGraph.whenReady {taskGraph ->
if (taskGraph.hasTask(':release')) {{
if (taskGraph.hasTask(':release')) Nombreux
version == '1.0'
version '1.0'
}} else {{ hooks
else disponibles
version == '1.0-SNAPSHOT'
version '1.0-SNAPSHOT'
}}
}}
14. Gradle fournit des cycles de vies (1/2)
Ensemble de tâches prédéfinies
Exemple
du plugin 'java'
22. Gradle et Ant: dans les deux sens (1/2)
<!-- build.xml -->
<!-- build.xml -->
<property name="src.dir" value="src">
<property name="src.dir" value="src">
<target name="compile">
<target name="compile">
<echo message="Compile,from Ant"/>
<echo message="Compile,from Ant"/>
</target>
</target>
<!-- build.gradle -->
<!-- build.gradle -->
ant.importBuild 'build.xml'
ant.importBuild 'build.xml'
//Complément de la tâche compile
//Complément de la tâche compile
compile << {{
compile <<
println "Added compiling from Gradle"
println "Added compiling from Gradle"
println "SourceDir: ${ant.properties['src.dir']}"
println "SourceDir: ${ant.properties['src.dir']}"
}}
>> gradle compile
gradle compile
:compile
:compile
[ant:echo] Compile, from Ant
[ant:echo] Compile, from Ant
Added compiling from Gradle
Added compiling from Gradle
SourceDir: src
SourceDir: src
23. Gradle et Ant: dans les deux sens (2/2)
<!-- build.gradle -->
<!-- build.gradle -->
task assemble (dependsOn: 'compile') << {{
task assemble (dependsOn: 'compile') <<
println 'Assemble, from Gradle'
println 'Assemble, from Gradle'
}}
<!-- build.xml -->
<!-- build.xml -->
<target name="deploy" depends="assemble">
<target name="deploy" depends="assemble">
<echo message="Deploy, from Ant"/>
<echo message="Deploy, from Ant"/>
</target>
</target>
>> gradle deploy
gradle deploy
:compile
:compile
[ant:echo] Compile, from Ant
[ant:echo] Compile, from Ant
Added compiling from Gradle
Added compiling from Gradle
:assemble
:assemble
Assemble, from Gradle
Assemble, from Gradle
:deploy
:deploy
[ant:echo] Deploy, from Ant
[ant:echo] Deploy, from Ant
24. Gestion multi projet très avancée
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
build tools
checkstyle codeNarc webdav other dependencies
librairies tierces
25. Gestion multi projet (1/3)
• Les descripteurs dans les sous
common jar
modules sont optionnels
• Injection de configuration depends depends
• Possibilité de mettre toute la biz-auth pz
war war
logique de build dans le parent
<!-- Structure de répertoires -->
<!-- Structure de répertoires --> <!-- settings.gradle -->
<!-- settings.gradle -->
+build.gradle
+build.gradle include
include
+settings.gradle
+settings.gradle "common",
"common",
+common/
+common/ "pz",
"pz",
+pz/
+pz/ "biz:auth"
"biz:auth"
+build.gradle
+build.gradle
-biz/
-biz/
-- biz-auth/
biz-auth/
27. Gestion multi projet (3/3)
/web> gradle compileJava
/web> gradle compileJava
:common:compileJava
:common:compileJava
:common:processResources
:common:processResources
:common:classes
:common:classes
:common:jar
:common:jar
:common:uploadDefaultInternal
:common:uploadDefaultInternal
:pz:compileJava
:pz:compileJava
:biz:biz-auth:compileJava
:biz:biz-auth:compileJava
/web/biz/biz-auth> gradle compileJava
/web/biz/biz-auth> gradle compileJava
:common:compileJava
:common:compileJava
:common:processResources Compilation
:common:processResources des projets
:common:classes
:common:classes
:common:jar dépendants
:common:jar
:common:uploadDefaultInternal
:common:uploadDefaultInternal
:biz:biz-auth:compileJava
:biz:biz-auth:compileJava
/web/biz/biz-auth> gradle compileJava -a
/web/biz/biz-auth> gradle compileJava -a Utilisation
:biz:biz-auth:compileJava
:biz:biz-auth:compileJava des jars
dans le cache
28. Gradle GUI
• Lancé par
> gradle –gui
• Exécution de
tâches
• Paramétrage du
niveau de log
29. Publie dans une infra Maven et Ivy
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
build tools
checkstyle codeNarc webdav other dependencies
librairies tierces
30. Publication dans des repo Ivy
Gradle IVY API Repository
Ivy
Artifacts +
meta Ivy
usePlugin 'java'
usePlugin 'java'
version='1.0'
version='1.0'
uploadArchives{
uploadArchives{
repositories{
repositories{
flatDir(dirs:'destRepo')
flatDir(dirs:'destRepo')
}}
}}
>> gradle uploadArchives
gradle uploadArchives
31. Publication dans des repo Maven
Maven Repository
Gradle Ant Maven distant
Tasks Repository Artifacts +
Maven local Artifacts +
meta Maven
meta Maven
usePlugin 'java'
usePlugin 'java'
usePlugin 'maven'
usePlugin 'maven'
group='org.jug.normandyjug'
group='org.jug.normandyjug'
archivesBaseName='artefact-ex'
archivesBaseName='artefact-ex'
version='1.0-SNAPSHOT'
version='1.0-SNAPSHOT'
uploadArchives {{
uploadArchives
repositories.mavenDeployer {{
repositories.mavenDeployer
snapshotRepository(url:
snapshotRepository(url:
"http://serveur/archiva/repository/snapshots")
"http://serveur/archiva/repository/snapshots")
}}
>> gradle install
gradle install
>> gradle uploadArchives
gradle uploadArchives
34. Agir simplement sur le cycle de vie
• Un cycle de vie Gradle est composé d'un ensemble
de tâches
– Chaque tâche est une propriété du projet
– Chaque tâche possède une propriété « enabled »
compileTestJava.enabled=false
compileTestJava.enabled=false
processTestResources.enabled=false
processTestResources.enabled=false
testClasses.enabled=false
testClasses.enabled=false
test.enabled=false
test.enabled=false
38. Gradle, un choix pertinent en
Entreprise
• Utiliser Gradle en lieu et place de vos scripts Ant
– Réutilisation (Import) de scripts Ant existant
– Utilisation de toute tâche native
• Utiliser Gradle avec votre infrastructure Ivy
– Intégration plus profonde et plus riche
• Utiliser Gradle avec votre infrastructure Maven
existante
– Les même conventions que Maven
– Simplicité de gestion des dépendances Maven
– Flexibilité au besoin
40. Les problèmes
• Ce qui manque
– Gestion d'un ear pour JEE
– Génération de la configuration IDEA et NetBeans
– Intégration avec les outils de couvertures de code ou
d'autres outils de métriques (Findbugs, …)
• Délégation à des tâches Ant aujourd'hui
• Un manque de maturité
– Changement de la DSL entre chaque release
42. Quelques liens
• Le site web :
– http://www.gradle.org/
• Un user guide
– http://www.gradle.org/0.8/docs/userguide/userguide.html
– http://www.gradle.org/0.8/docs/userguide/userguide.pdf
• Un cookbook
– http://docs.codehaus.org/display/GRADLE/Cookbook
• Le wiki projet :
– http://docs.codehaus.org/display/GRADLE/Home