2. • Consultant et formateur Zenika
– En charge du comité technique Intégration continue
• Contributeur et Committer pour Hudson/Jenkins
– Intégration des chaînes de build Java (Gradle), C/C++, ADA
– Maintenance corrective et évolutive des plugins réalisés
– Développement de solutions transverses
NantesJUG - Présentation Gradle 2
3. • Transformation d'une production humaine (le code
source) en une représentation machine (le binaire)
Fichier
JAR
Source
Fichier
Binaire
JVM
println "Hello World" A;^A^@^Am^A^@^T()Ljava/lang/Object;^C^
for (int i:[1,2,3]){ @^@^@^@^A^@^KHello World^H^@2^A^@-
print i org/codehaus/groovy/runtime/callsite/
} CallSite^G^@4^A^@^KcallCurrent^A^@@
(Lgroovy/lang/GroovyObject;
Ljava/lang/Object;)Ljava/lang/Object;
^L^@6^@7^K^@5^@8^C^@^@^@^A^L^@^H^
....
NantesJUG - Présentation Gradle 3
5. • La nature des besoins d'automatisation a changé
Un build peut faire beaucoup plus de choses que la
simple création d'une archive Java
• Les besoins d'automatisation ont augmentés
significativement ces dernières années
NantesJUG - Présentation Gradle 5
8. • Système de build complet focalisé sur le build des
applications d'entreprise Java, Web, Groovy, Scala et
OSGI
• Flexible à la Ant avec les conventions de Maven à la
demande
• Support et insertion totale dans des infrastructures Maven
et Ant/Ivy existantes
• Modèle de description du build très riche à travers une
API Java et une DSL Groovy
NantesJUG - Présentation Gradle 8
9. Central java.net
Maven
JBoss …
Codehaus
Artifacts +
maven meta
Ivy
Repository
Artifacts +
ivy meta
Other
Repository
Artifacts +
custom meta
NantesJUG - Présentation Gradle 9
10. • Spécification du 'quoi' et pas du 'comment'
iture
Fourn le
yc
d'un c
de vie
Même
ntion
apply plugin:'java' > gradle clean build conve en
av
:clean que M
repositories { :compileJava
src
mavenCentral() :processResources
} :classes myLib main
.jar
:jar
dependencies { java
:assemble
compile :compileTestJava resources
"jdom:jdom:1.1" :processTestResources
testCompile :testClasses
"junit:junit:4.8" :test test
} :check
java
:build
BUILD SUCCESSFUL resources
NantesJUG - Présentation Gradle 10
11. On ne peut pas anticiper tous les besoins
Aucun projet n'est réellement pareil!
Le projet évolue et donc son processus d'intégration évolue aussi
Il est important de fournir un niveau de support équivalent entre les
anciens projets que les nouveaux projets
NantesJUG - Présentation Gradle 11
12. Écrire un script Gradle consiste à configurer un élément 'Project'
configurations
build.gradle
repositories
dependencies
Project ant
Eléments
task personnalisés
artifacts
Public
API
NantesJUG - Présentation Gradle 12
13. • Conçu pour répondre à un maximum de scénarios
– Plusieurs répertoires de sources par projet
– Plusieurs artefacts générés par projet
– Gestion de classpath distinct pour les tests
d'intégration
– ....
• De nombreux points d'extension pour enrichir les
éléments existants
Possibilité de former un modèle de build (un
ensemble de conventions), le tout dans une
approche déclarative
NantesJUG - Présentation Gradle 13
14. La mise en œuvre de l'API à
travers des tâches de
traitement
compile jar test custom
build
war
Un processus Gradle
est un ensemble de tâches
NantesJUG - Présentation Gradle 14
15. Possibilité d'écrire du code Java/Groovy sous forme d'unités de
traitement réutilisables
<!-- build.gradle --> API
Gradle
task(boucleTask).doLast{
for (int i:[1,2,3]){ print i }
} AAPI
Java/Groovy
void printMessage(String message){
> gradle boucleTask
println "Print " + message :boucleTask
} 123
task(distribution).doLast {
printMessage("Distribution") > gradle distribution
} :distribution
Print Distribution
task(release)
release.dependsOn(distribution) > gradle release
:distribution
release.doLast{ Print Distribution
println "Print Release" :release
} Print Release
NantesJUG - Présentation Gradle 15
16. ConventionTask Mise à disposition d'un ensemble
de tâches prédéfinies
AbstractCopyTask SourceTask Facile à Facile à
utiliser étendre
AbstractArchiveTask Copy Javadoc
public class Copy extends AbstractCopyTask {
public AbstractCopyTask from(Object... sourcePaths);
Zip Tar public AbstractCopyTask into(Object destDir);
public AbstractCopyTask include(String... includes);
. . .
}
Jar
task mycopy (type:Copy){
description ='Copies the resources dir'
from(file('resources'))
into(file('destination'))
War
include('**/*.txt', '**/*.xml')
}
NantesJUG - Présentation Gradle 16
19. Chaque plugin
- est un ensemble de tâches préconfigurées
- expose un objet de configuration (avec des conventions)
Plugins maven
Java Configuration
Object
eclipse idea
Jetty Configuration War Configuration
Object Object
code-quality war
projects-reports java
… …
jetty osgi …
scala
... Project
Configuration
NantesJUG - Présentation Gradle 19
20. Java Configuration
java Object
public class JavaPluginConvention {
public SouceSetContainer sourceSets();
public void setSourceCompatibility(Object value);
public void setTargetCompatibility(Object value);
public Manifest manifest()
. . .
}
<!-- build.gradle -->
Facile à
apply plugin:'java' mettre en
Simple à
place et
apprendre
facile à
sourceCompatibility = 1.6 maintenir
targetCompatibility = 1.6
NantesJUG - Présentation Gradle 20
21. Mise à
disposition
globalConfig-1.0.gradle
<!– build.gradle -->
task globalConfig {
...
}
Utilisation
<!– build.gradle --> > gradle config
apply from "http://repomanager/globalConfig-1.0.gradle" ...
...
NantesJUG - Présentation Gradle 21
23. • Possibilité de mettre en place des exclusions globales
• Flexibilité dans la définition des dépôts
repositories{
mavenCentral()
mavenRepo urls:"http://download.java.net/maven/2/"
flatDir name:'localRepository', dirs: 'lib'
}
• Possibilité de définir les dépendances et les déepdances
transitives directement dans le script Gradle
dependencies {
runtime module("org.codehaus.groovy:groovy-all:1.7.5") {
dependency("commons-cli:commons-cli:1.0") {
transitive = false
}
}
}
NantesJUG - Présentation Gradle 23
25. src apply plugin:'java'
main
sourceSets{
...
myGenSourceSet {
test java {
... srcDir 'output/generated'
}
output
}
generated }
Mise à disposition automatique > gradle clean build
d'un ensemble de tâches de :clean
traitement pour le build de cet :generateTask
ensemble de fichiers . . .
:compileMyGenSourceSetJava
:processMyGenSourceSetResources
:myGenSourceSetClasses
. . .
NantesJUG - Présentation Gradle 25
29. Les scripts d'initialisation permettent d'invoquer différents
listeners au chargement du script
//Script d'initialisation
addListener(new ApplyEclipsePlugin())
class ApplyEclipsePlugin extends BuildAdapter { Invoquer
par défaut
public void projectsEvaluated(Gradle gradle){ si placé
dans le
gradle.rootProject.allprojects { home de
apply plugin:'eclipse' l'utilisateur
}
}
}
gradle eclipse –I init.gradle
NantesJUG - Présentation Gradle 29
38. 1. Le script Gradle est compilé uniquement en cas de
changement
2. Détection des changements pour chaque entrée et
chaque sortie pour la plupart des tâches fournies
> gradle myzip
:myzip
> gradle myzip
:myzip UP-TO-DATE
> gradle myzip –-cache rebuild
:myzip
NantesJUG - Présentation Gradle 38
40. EXECUTION
Process 1 Process 6
TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST
CLASS CLASS CLASS CLASS CLASS CLASS CLASS CLASS CLASS CLASS
PARALLELISATION
Process 2 Process 7
TEST TEST TEST TEST TEST TEST TEST
CLASS CLASS CLASS CLASS CLASS CLASS CLASS
Process 3
TEST TEST TEST TEST TEST
CLASS CLASS CLASS CLASS CLASS
apply plugin:'java'
Process 4
TEST TEST TEST TEST TEST
CLASS CLASS CLASS CLASS CLASS test {
forkEvery = 5
maxParallelForks = 4
}
NantesJUG - Présentation Gradle 40
41. • Utilisation d'un processus parallèle pour éviter le cout de
lancement
> gradle build
...
Total time: 3s
> gradle build –daemon
...
Total time: 3s
> gradle build
...
Total time: 1s
• Va favoriser l'intégration de Gradle avec Gradle UI et les
IDE (Eclipse, IDEA, ...)
NantesJUG - Présentation Gradle 41
43. 1. Utilisation du plugin 'code-quality' pour les outils de
métriques Checkstyle et CodeNarc
apply plugin:'code-quality'
2 . Intégration complète via l'utilisation des tâches Ant des
outils de métriques
NantesJUG - Présentation Gradle 43
49. • Mailing List très active
• User guide très riche (300 pages)
• Nombreuses contributions de plugins
• Le nombre d'articles et de conférences sur le sujet
augmentent
NantesJUG - Présentation Gradle 49
50. • Conseil et Formation autour du produit
NantesJUG - Présentation Gradle 50
52. Points forts Faiblesses
• Mature • Pas de conventions par
défaut
• Fiable
• erbeux (syntaxe XML
V
• Flexible et extensible
lourde)
• ecture et écriture dans un
L • ntégration de Ivy à Ant
I
repository Maven souvent trop manuelle
• ontruction automatique
C
des classpath entre vos Menaces
sous-projets
• Nécessiter de se
former à l'utilisation du
couple Ant/Ivy dans le
cadre de la mise en
place de fonctionnalités
avancées
NantesJUG - Présentation Gradle 52
53. Points forts Faiblesses
• onvention over
C • aible gestion des
F
configuration dépendances
• ycle de vie
C • Non distinction entre la
• ystème de plugins
S version technique et la
version commerciale du
• Son écosystème produit
d'utilisateurs
• rocessus rigide (exemple
P
d'une ossature de build
Menaces figée)
• ifficulté dans la
D
reproductibilité du build
• ncompatibilité dans la
I
gestion de versions avec
un système extérieur
NantesJUG - Présentation Gradle 53
54. Points forts Faiblesses
. Convention over Système de build très
configuration à la récent
demande
. Cycle de vie fournit et
Menaces
facilement modifiable
. Système de plugins
. Incertitude sur la
. Intégration avec pérennité
toutes les
infrastructures Ant/Ivy . DSL Groovy peu être
et Maven existantes modifié
. Possibilité de mise en
place d'un build
incrémental sur de
nombreuses étapes de
son build
NantesJUG - Présentation Gradle 54
55. Environment
Instancie
Processus identifié (traçabilité) et répétable
DEPLOY TEST
BUILD RELEASE
INSTALL VALIDATION
NantesJUG - Présentation Gradle 55
57. • Introduction de modèles de JVM basés sur la nature des
applications
• Amélioration du DSL du graphe des tâches
• Amélioration de la gestion de dépendances
• Réutilisation possible des plugins Maven
• Plusieurs livres sur les cas d'utilisations en cours
d'éditions (OReilly)
• Une communauté plus large
NantesJUG - Présentation Gradle 57