GRADLE
Gregory BOISSINOT
23/11/2010
Lyon JUG - Présentation Gradle 1
• 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
• 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
• 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
• 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
• 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
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
É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
• 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
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
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
Chaque plugin
- est un ensemble de tâches
- expose un objet Java convention
Plugins maven
Java Configuration
Object
eclipse idea
Jetty Configuration War Configuration
Object Object
code-quality war
… …
projects-reports java
…
jetty osgi
scala
Project
Configuration
Lyon JUG - Présentation Gradle 17
Mise à
disposition
config-1.0.gradle
<!– build.gradle -->
task config {
...
}
Utilisation
<!– build.gradle --> > gradle config
apply from "http://repomanager/config-1.0.gradle" ...
...
Lyon JUG - Présentation Gradle 18
• 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
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
• 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
// 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
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
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
• 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
gmock
spock
security
4
Lyon JUG - Présentation Gradle 39
• 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
• 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