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
ToursJUG - 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^
....
ToursJUG - 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
ToursJUG - 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
ToursJUG - Présentation Gradle 8
9. Central java.net
Maven
JBoss …
Codehaus
Artifacts +
maven meta
Ivy
Repository
Artifacts +
ivy meta
Other
Repository
Artifacts +
custom meta
ToursJUG - 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
mavenCental() :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
ToursJUG - 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 au minimum le même niveau de support
pour les anciens projets que les nouveaux projets
ToursJUG - 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
ToursJUG - 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
ToursJUG - 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
ToursJUG - Présentation Gradle 14
15. Possibilité d'écrire du code Java/Groovy sous forme d'unités de
traitement réutilisables
<!-- build.gradle --> Gradle
task(boucleTask).doLast{
for (int i:[1,2,3]){ print i }
} 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
ToursJUG - Présentation Gradle 15
16. ConventionTask Mise à disposition d'un ensemble
de tâches prédéfinies
- réutilisables
- faciles à étendre
AbstractCopyTask SourceTask
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')
}
ToursJUG - Présentation Gradle 16
18. 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
ToursJUG - Présentation Gradle 18
19. 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
ToursJUG - Présentation Gradle 19
20. Mise à
disposition
globalConfig-1.0.gradle
<!– build.gradle -->
task globalConfig {
...
}
Utilisation
<!– build.gradle --> > gradle config
apply from "http://repomanager/globalConfig-1.0.gradle" ...
...
ToursJUG - Présentation Gradle 20
22. • 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
}
}
}
ToursJUG - Présentation Gradle 22
36. 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
ToursJUG - Présentation Gradle 36
38. 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
}
ToursJUG - Présentation Gradle 38
39. • 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, ...)
ToursJUG - Présentation Gradle 39
43. • 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
ToursJUG - Présentation Gradle 43
44. • Fourniture de consulting et de formation
ToursJUG - Présentation Gradle 44
46. • Introduction de modèles de JVM basés sur la nature des
applications
• Amélioration du DSL du graphe des tâches
• Réutilisation possible des plugins Maven
• Un livre en préparation
• Une communauté plus large
ToursJUG - Présentation Gradle 46