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
I
• Ancien Committer Hudson
– Intégration des chaînes de build Java (Gradle), C/C++, ADA
• Committer Jenkins
– Maintenance corrective et évolutive des plugins réalisés
– Développement de solutions transverses
Toulouse 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^
....
Toulouse 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
Toulouse 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
• Flexible à la Ant avec les conventions de Maven à la
demande
• Modèle de description du build très riche à travers une
API Java et une DSL Groovy
• Support et insertion totale dans des infrastructures Maven
et Ant/Ivy existantes
Toulouse JUG - Présentation Gradle 8
9. Central java.net
Maven
JBoss …
Codehaus
Artifacts +
maven meta
Ivy
Repository
Artifacts +
ivy meta
Other
Repository
Artifacts +
custom meta
Toulouse JUG - 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
Toulouse JUG - Présentation Gradle 10
11. On ne peut pas anticiper tous les besoins
Aucun projet n'est pas pareil!
Il est important de fournir au minimum le même niveau de support
pour les anciens projets que les nouveaux projets
Toulouse JUG - Présentation Gradle 11
12. Écrire un script Gradle consiste à configurer un objet Project
configurations
build.gradle
repositories
dependencies
Project ant
Eléments
task
personnalisés
artifacts
Public
API
Toulouse JUG - Présentation Gradle 12
13. • Conçu pour répondre à un maximum de scénarios
– Plusieurs répertoires de sources par projet
– Des dépendances distinctes 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, le tout dans une approche
déclarative
Toulouse JUG - Présentation Gradle 13
14. compile jar test custom
build
war
Un processus Gradle
est un ensemble de tâches
Toulouse JUG - Présentation Gradle 14
15. Possibilité d'écrire du code Java/Groovy sous forme d'unités de
traitement 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"
}
Toulouse JUG - Présentation Gradle 15
16. task mycopy (type:Copy){
description ='Copies the resources dir'
from(file('resources')) ConventionTask
into(file('destination'))
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
Toulouse JUG - 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
Toulouse JUG - Présentation Gradle 19
20. Mise à
disposition
config-1.0.gradle
<!– build.gradle -->
task config {
...
}
Utilisation
<!– build.gradle --> > gradle config
apply from "http://repomanager/config-1.0.gradle" ...
...
Toulouse JUG - Présentation Gradle 20
22. • 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
}
}
}
Toulouse JUG - Présentation Gradle 22
33. 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
Toulouse JUG - Présentation Gradle 33
34. • Gestion avancée d'un multi projet
• Utilisation d'un cache
• Exécution parallèle des tests
• Build daemon
Toulouse JUG - Présentation Gradle 34
35. // 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
}
Toulouse JUG - Présentation Gradle 35
36. 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
Toulouse JUG - 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
}
Toulouse JUG - 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, ...)
Toulouse JUG - Présentation Gradle 39
40. IDE Maturité
NetBeans
Eclipse +
IntelliJ ++
Toulouse JUG - Présentation Gradle 40
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
Toulouse JUG - Présentation Gradle 43
44. • Fourniture de consulting et de formation
Toulouse JUG - Présentation Gradle 44
46. • Bootstrap pour Sonar
• 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
Toulouse JUG - Présentation Gradle 46
50. • Les meilleurs spécialistes, reconnus internationalement
• Des thématiques utilisées au jour le jour :
Java Avancé, NoSQL, Clojure, HTML5, RabbitMQ, Scala,
performance, Eclipse Orion, Spring, Jenkins (Hudson),
services decoupling, etc.
• Vous pourrez poser toutes vos questions aux grands
acteurs de la sphère Java
• Eligible aux DIF ou prise en charge par le budget de
formation (FAFIEC, OPCALIA, …)
http://www.whatsnextparis.com
Toulouse JUG - Présentation Gradle 50