6. • La nature des besoins d'automatisation changent
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
• La portée des outils existants ne couvrait pas tous les
besoins ou partiellement
LavaJUG - Présentation Gradle 6
10. • Peut-on anticiper tous les besoins d'automatisation?
– Est-ce que tous les projets sont identiques?
– Est-ce que le besoin d'automatisation
évolue au cours du cycle de vie du projet?
• Souhaite-on uniformiser l'automatisation
entre les anciens projets et les nouveaux projets ?
• Quelles sont les compétences des personnes
– qui vont mettre en place les processus de build?
– qui vont maintenir les descripteurs de build?
LavaJUG - Présentation Gradle 10
13. • Un langage de build (API)
– A la frontière entre un langage de script et un modèle
statique
• Les conventions de Maven à la demande
– Facilite l'apprentissage et la migration
• De nombreux cycles de construction (cycle de vie)
fournies par défaut
• Build incrémental à tous les niveaux
• Systèmes de plugins
LavaJUG - Présentation Gradle 13
14. • Une réutilisation native des tâches Ant
• Lecture et écriture dans un repository Maven (Nexus,
Artifactory, Archiva, etc)
• Gestion de dépendances simple, flexible et puissante
– Des concepts et des mécanismes issus de Ivy
LavaJUG - Présentation Gradle 14
15. • Gradle tente de résoudre les problèmes Maven suivants:
• Difficulté de personnalisation du cycle de vie
• Mauvaise granularité entre phase et plugins
• Gestion des dépendances difficile
• Non distinction des dépendances de type projet et
de type externes
• Lié strictement à un pattern de version
• Pas de possibilité les algorithmes de résolution
• 1 seul artefact par projet (par défaut)
• Difficulté de mise en place des tests d'intégration
• Difficulté de packaging -complexe
LavaJUG Présentation Gradle 15
16. • Spécification du 'quoi' et pas du 'comment'
iture
Fourn le
yc
d'un c
de vie
Même
ntion
> gradle clean build conve en
av
apply plugin:'java' :clean que M
:compileJava
src
repositories { :processResources
} :classes myLib main
:jar .jar
dependencies { java
:assemble
} :compileTestJava resources
:processTestResources
:testClasses
:test test
:check
java
:build
BUILD SUCCESSFUL resources
LavaJUG - Présentation Gradle 16
17. É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
LavaJUG - Présentation Gradle 17
20. 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')
}
LavaJUG - Présentation Gradle 20
22. java Java Configuration
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
LavaJUG - Présentation Gradle 22
26. 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
LavaJUG - Présentation Gradle 26
35. 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
LavaJUG - Présentation Gradle 35
37. 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
}
LavaJUG - Présentation Gradle 37
38. • 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, ...)
LavaJUG - Présentation Gradle 38
39. IDE Maturité
NetBeans
Eclipse +
Eclipse STS ++
Idea IntelliJ ++
LavaJUG - Présentation Gradle 39
40. HUDSON JENKINS
Fonctionnalités:
- Installation automatique de Gradle (via URL, Run Script)
- Wizard de configuration
- Utilisation possible du Gradle wrapper
- Dry-Run
- Coloration syntaxique
LavaJUG - Présentation Gradle 40
41. Environment
Instancie
Processus identifié (traçabilité) et répétable
DEPLOY TEST
BUILD RELEASE
INSTALL VALIDATION
LavaJUG - Présentation Gradle 41
43. • Mailing List très active
• User guide très riche (400 pages)
• Nombreuses contributions de plugins
• Le nombre d'articles et de conférences augmentent
LavaJUG - Présentation Gradle 43
45. • Des besoins spécifiques de construction
• Structure de répertoires propre au projet
• Définition d'un cycle de vie personnalisé
• Plusieurs artefacts par projet
• Des besoins spécifiques de tests
• Tests d'intégration complexe
• Tests sur plusieurs JDK
• Beaucoup de tests à paralléliser
• Gestion fine des dépendances
• Build incrémental à plusieurs niveaux
• Définition de modèle de build (proche des concepts de Maven)
LavaJUG - Présentation Gradle 45
46. • Comme tous les outils, un outil de build ne s'impose pas
• Ne pas l'opposer à Maven ou à Ant mais l'utiliser comme
complément
• Construction avec Gradle et déploiement dans un repo
Maven
• Réutilisation des scripts Ant existants et surcharge/
réécriture des cible Ant existantes (sans modifications
des scripts actuels)
• Solution parfaite pour construire son propre modèle de
build entreprise adapté à ses besoins
• Gradle est utilisé comme un framework
• L'utilisation de Gradle est caché (GradleWrapper)
LavaJUG - Présentation Gradle 46
47. • Utiliser Gradle comme un langage de build (API,
réutilisabilité de modules, orientation objet, ...) et pas
juste un langage de script de luxe
• Cadrer les descripteurs Gradle d'un projet à un autre
• Des revues de code des scripts sont à prévoir
• Comme tout code source, le build évolue et donc est
soumis à des refactoring réguliers
• Essayer d'abstraire des modèles de build réutilisables
• Utiliser une version stable
LavaJUG - Présentation Gradle 47