2. • Consultant et formateur Zenika
– Mes spécialités: le build et l'intégration continue
– Responsable technique de la solution d'intégration continue
chez Thales
• ntroduction et déploiement de Gradle à grande échelle
I
• Commiter Hudson
– Intégration des châines de build Java (Gradle), C/C++, ADA
Lyon JUG - Présentation Gradle 2
4. • Transformation d'une production humaine (le code
source) en une représentation machine (le binaire)
Fichier
JAR
Source
Fichier
Binaire
JVM
println "Hello World" A;^A^@^Am^A^@^T()Ljava/lang/Object;^C^
for (int i:[1,2,3]){ @^@^@^@^A^@^KHello World^H^@2^A^@-
print i org/codehaus/groovy/runtime/callsite/
} CallSite^G^@4^A^@^KcallCurrent^A^@@
(Lgroovy/lang/GroovyObject;
Ljava/lang/Object;)Ljava/lang/Object;
^L^@6^@7^K^@5^@8^C^@^@^@^A^L^@^H^
....
Lyon JUG - Présentation Gradle 4
5. • Les besoins d'automatisation ont augmentés
significativement ces dernières années
• La nature des besoins d'automatisation a changé
Un build peut faire beaucoup plus de choses que la
simple création d'une archive Java
Lyon JUG - Présentation Gradle 5
8. • Système de build complet focalisé sur le build des
applications d'entreprise Java, Web, Groovy, Scala et
OSGI
• Modèle de description du build très riche à travers une
API et une DSL Groovy
• Flexible à la Ant avec les conventions de Maven à la
demande
• Support et insertion totale dans des infrastructures Maven
et Ant/Ivy existantes
Lyon JUG - Présentation Gradle 8
9. • Spécification du 'quoi' et pas du 'comment'
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
Lyon JUG - Présentation Gradle 9
10. On ne peut pas anticiper tous les besoins
Il est nécessaire de fournir le même niveau de support entre les
anciens projets et les nouveaux projets
Lyon JUG - Présentation Gradle 10
11. Écrire un script Gradle consiste à configurer un objet Project
configurations
build.gradle
repositories
dependencies
Project ant
Eléments
task
personnalisés
artifacts
API
Lyon JUG - Présentation Gradle 11
12. • 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
– ....
• De nombreux points d'extension pour enrichir les
éléments existant
• La possibilité de fournir ses propres éléments qui vont
former un modèle de build
Lyon JUG - Présentation Gradle 12
13. Possibilité d'écrire du code Java/Groovy sous forme d'unités réutilisables
<!-- build.gradle -->
task(boucleTask).doFirst{
for (int i:[1,2,3]){ print i } > gradle boucleTask
} :boucleTask
123
void printMessage(String message){
println "Print " + message > gradle distribution
} :distribution
Print Distribution
task(distribution).doFirst {
> gradle release
printMessage("Distribution") :distribution
} Print Distribution
:release
task(release) Print Release
release.dependsOn(distribution)
release.doFirst{
println "Print Release"
}
Lyon JUG - Présentation Gradle 13
14. task mycopy (type:Copy){
description ='Copies the resources dir'
from(file('resources')) ConventionTask
into(file('target'))
include('**/*.txt', '**/*.xml')
}
SourceTask AbstractCopyTask
Javadoc Copy AbstractArchiveTask
Zip Tar
public class Copy extends AbstractCopyTask {
public AbstractCopyTask from(Object... sourcePaths);
public AbstractCopyTask into(Object destDir);
public AbstractCopyTask include(String... includes);
. . . Jar
}
War
Lyon JUG - Présentation Gradle 14
20. • Flexibilité dans la définition des dépôts
repositories{
mavenCentral()
mavenRepo urls: "http://download.java.net/maven/2/"
flatDir name: 'localRepository', dirs: 'lib'
}
• Possibilité de mettre en place des exclusions globales
• Possibilité de définir les dépendances transitives dans le
script Gradle
dependencies {
runtime module("org.codehaus.groovy:groovy-all:1.7.5") {
dependency("commons-cli:commons-cli:1.0") {
transitive = false
}
}
}
Lyon JUG - Présentation Gradle 20
31. 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
Lyon JUG - Présentation Gradle 31
32. • Gestion avancée d'un multi projet
• Utilisation d'un cache
• Exécution parallèle des tests
• Build daemon
Lyon JUG - Présentation Gradle 32
33. // 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
}
Lyon JUG - Présentation Gradle 33
34. 1. Le script Gradle est compilé uniquement en cas de
changement
2. Détéction des changements pour chaque entrée et
chaque sortie pour la plupart des tâches fournies
> gradle myzip
:myzip
> gradle myzip
:myzip UP-TO-DATE
> gradle myzip –-cache rebuild
:myzip
Lyon JUG - Présentation Gradle 34
36. EXECUTION
Process 1 Process 6
TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST
SUITE SUITE SUITE SUITE SUITE SUITE SUITE SUITE SUITE SUITE
PARALLELISATION
Process 2 Process 7
TEST TEST TEST TEST TEST TEST TEST
SUITE SUITE SUITE SUITE SUITE SUITE SUITE
Process 3
TEST TEST TEST TTEST TEST
SUITE SUITE SUITE SUITE SUITE
apply plugin:'java'
Process 4
TEST TEST TTEST TEST TEST
SUITE SUITE SUITE SUITE SUITE test {
forkEvery = 5
maxParallelForks = 4
}
Lyon JUG - Présentation Gradle 36
37. • 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, ...)
Lyon JUG - Présentation Gradle 37
40. • Mailing List très active
• User guide très riche (+280 pages)
• Nombreuses contributions de plugins
• Le nombre d'articles et de conférences sur le sujet
augmentent
Lyon JUG - Présentation Gradle 40
42. • Nouveau DSL de gestion des dépendances
• Introduction de modèles de JVM basés sur la nature des
applications
• Fourniture d'un DSL de composition du build
• Amélioration du DSL du graphe des tâches
• Réutilisation possible des plugins Maven
• Un livre en préparation
Lyon JUG - Présentation Gradle 42