Contrôle d’accès et Gestion des identités: Terminologies et Protocoles d’auth...
Présentation Gradle au LyonJUG par Grégory Boissinot - Zenika
1. 1Lyon JUG - Présentation Gradle
GRADLE
Gregory BOISSINOT
23/11/2010
2. 2Lyon JUG - Présentation Gradle
• 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
• Introduction et déploiement de Gradle à grande échelle
• Commiter Hudson
– Intégration des châines de build Java (Gradle), C/C++, ADA
4. 4Lyon JUG - Présentation Gradle
• Transformation d'une production humaine (le code
source) en une représentation machine (le binaire)
Fichier
Source
JAR
JVM
println "Hello World"
for (int i:[1,2,3]){
print i
}
A;^A^@^Am^A^@^T()Ljava/lang/Object;^C^
@^@^@^@^A^@^KHello World^H^@2^A^@-
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^
....
Fichier
Binaire
5. 5Lyon JUG - Présentation Gradle
• 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
8. 8Lyon JUG - Présentation Gradle
• 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
9. 9Lyon JUG - Présentation Gradle
• Spécification du 'quoi' et pas du 'comment'
Même
convention
que Maven
apply plugin:'java'
repositories {
mavenCental()
}
dependencies {
compile
"jdom:jdom:1.1"
testCompile
"junit:junit:4.8"
}
myLib
.jar
src
main
java
test
java
> gradle clean build
:clean
:compileJava
:processResources
:classes
:jar
:assemble
:compileTestJava
:processTestResources
:testClasses
:test
:check
:build
BUILD SUCCESSFUL resources
resources
10. 10Lyon JUG - Présentation Gradle
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
11. 11Lyon JUG - Présentation Gradle
Project
repositories
dependencies
task
configurations
artifacts
API
ant
Écrire un script Gradle consiste à configurer un objet Project
build.gradle
Eléments
personnalisés
12. 12Lyon JUG - Présentation Gradle
• 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
13. 13Lyon JUG - Présentation Gradle
<!-- build.gradle -->
task(boucleTask).doFirst{
for (int i:[1,2,3]){ print i }
}
void printMessage(String message){
println "Print " + message
}
task(distribution).doFirst {
printMessage("Distribution")
}
task(release)
release.dependsOn(distribution)
release.doFirst{
println "Print Release"
}
> gradle boucleTask
:boucleTask
123
> gradle distribution
:distribution
Print Distribution
> gradle release
:distribution
Print Distribution
:release
Print Release
Possibilité d'écrire du code Java/Groovy sous forme d'unités réutilisables
14. 14Lyon JUG - Présentation Gradle
task mycopy (type:Copy){
description ='Copies the resources dir'
from(file('resources'))
into(file('target'))
include('**/*.txt', '**/*.xml')
}
AbstractCopyTask
AbstractArchiveTask
Zip
Jar
War
Tar
SourceTask
Javadoc
ConventionTask
Copy
public class Copy extends AbstractCopyTask {
public AbstractCopyTask from(Object... sourcePaths);
public AbstractCopyTask into(Object destDir);
public AbstractCopyTask include(String... includes);
. . .
}
16. 16Lyon JUG - Présentation Gradle
• Les plugins Gradle
• Insertion dans un environnement agile
17. 17Lyon JUG - Présentation Gradle
java
war
maven
osgi
code-quality
jetty
scala
eclipse idea
projects-reports
Java Configuration
Object
War Configuration
Object
Jetty Configuration
Object
…
Plugins
Project
Configuration
…
…
Chaque plugin
- est un ensemble de tâches
- expose un objet Java convention
18. 18Lyon JUG - Présentation Gradle
> gradle config
...
<!– build.gradle -->
task config {
...
}
<!– build.gradle -->
apply from "http://repomanager/config-1.0.gradle"
...
config-1.0.gradle
Mise à
disposition
Utilisation
20. 20Lyon JUG - Présentation Gradle
• Flexibilité dans la définition des dépôts
• Possibilité de mettre en place des exclusions globales
• Possibilité de définir les dépendances transitives dans le
script Gradle
repositories{
mavenCentral()
mavenRepo urls: "http://download.java.net/maven/2/"
flatDir name: 'localRepository', dirs: 'lib'
}
dependencies {
runtime module("org.codehaus.groovy:groovy-all:1.7.5") {
dependency("commons-cli:commons-cli:1.0") {
transitive = false
}
}
}
31. 31Lyon JUG - Présentation Gradle
Repository
Maven
distant Artifacts +
meta Maven
Maven
Ant
Tasks
Repository
Maven
Local Artifacts +
meta Maven
apply plugin:'java'
apply plugin:'maven'
group='test'
version='1.0-SNAPSHOT'
uploadArchives {
repositories {
mavenDeployer {
repository(
url: remoteRepo)
}
}
}
> gradle
uploadArchives
> gradle
install
32. 32Lyon JUG - Présentation Gradle
• Gestion avancée d'un multi projet
• Utilisation d'un cache
• Exécution parallèle des tests
• Build daemon
33. 33Lyon JUG - Présentation Gradle
// settings.gradle
include 'api',
'shared',
'services:webservices'
// root build.gradle
subprojects {
apply plugin: 'java'
}
project(':api') {
dependencies {
compile project(':shared')
}
}
// webservices/build.gradle
apply plugin:'war'
dependencies {
compile
project(':shared'),
project(':api'),
'commons-io:commons-io:1.2'
}
shared
webservices api
api > gradle buildNeeded
:shared:jar
:api:jar
:api:test
:shared:test
api > gradle buildDependents
:shared:jar
:api:jar
:api:test
:webservices:war
:webservices:test
api > gradle jar –-no-rebuild
api:jar
34. 34Lyon JUG - Présentation Gradle
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
36. 36Lyon JUG - Présentation Gradle
apply plugin:'java'
test {
forkEvery = 5
maxParallelForks = 4
}
Process 1
TEST
SUITE
TEST
SUITE
TEST
SUITE
TEST
SUITE
TEST
SUITE
Process 7
TEST
SUITE
TEST
SUITE
Process 2
TEST
SUITE
TEST
SUITE
TEST
SUITE
TEST
SUITE
TEST
SUITE
Process 3
TEST
SUITE
TEST
SUITE
TEST
SUITE
TTEST
SUITE
TEST
SUITE
EXECUTION
Process 4
TEST
SUITE
TEST
SUITE
TTEST
SUITE
TEST
SUITE
TEST
SUITE
Process 6
TEST
SUITE
TEST
SUITE
TEST
SUITE
TEST
SUITE
TEST
SUITE
PARALLELISATION
37. 37Lyon JUG - Présentation Gradle
• Utilisation d'un processus parallèle pour éviter le cout de
lancement
• Va favoriser l'intégration de Gradle avec Gradle UI et les
IDE (Eclipse, IDEA, ...)
> gradle build
...
Total time: 3s
> gradle build –daemon
...
Total time: 3s
> gradle build
...
Total time: 1s
39. 39Lyon JUG - Présentation Gradle
gmock
spock
security
4
40. 40Lyon JUG - Présentation Gradle
• 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
42. 42Lyon JUG - Présentation Gradle
• 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