SlideShare une entreprise Scribd logo
1Lyon JUG - Présentation Gradle
GRADLE
Gregory BOISSINOT
23/11/2010
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
3Lyon JUG - Présentation Gradle
INTERNET
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
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
6Lyon JUG - Présentation Gradle
1ère génération
2008
2001
2
1
3
2ème génération 3ème génération
2000 2005 2008
7Lyon JUG - Présentation Gradle
<!–- ANT -- build.xml -->
<project>
<target name="retrieceDeps>
...
</target>
<target name="compile" ...
</project>
<!–- GRADLE– build.gradle -->
apply plugin:'java'
version=1.0
repositories {
mavenCental()
flatDir(dirs:'lib')
}
dependencies {
compile(
group:'org.apache.wicket',
name:'wicket',
version:'1.4.7')
}
<!–- MAVEN – pom.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.lyonjug</groupId>
<artifactId>maven</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>org.apache.wicket</groupId>
<artifactId>wicket</artifactId>
<version>1.4.7</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
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
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
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
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
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
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
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);
. . .
}
15Lyon JUG - Présentation Gradle
<!– HelloTask.groovy -->
class HelloTask extends DefaultTask {
def message="Default Message"
@TaskAction
public void print(){
println message
}
}
> gradle myhello
:myhello
Default Message
> gradle myhello2
:myhello2
Task Message<!-- build.gradle -->
task(myhello, type:HelloTask)
task(myhello2, type:HelloTask){
message="Task Message"
}
16Lyon JUG - Présentation Gradle
• Les plugins Gradle
• Insertion dans un environnement agile
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
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
19Lyon JUG - Présentation Gradle
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
}
}
}
21Lyon JUG - Présentation Gradle
apply plugin:'java'
processResources.enabled=false
test.onlyIf{
!project.hasProperty('skipTests')}
//Add behavior in the lifecycle
task(preJar)
jar.dependsOn preJar
//Change the output directory
buildDirName='target'
//Change the source directory
sourceSets{
main{
java.srcDirs file('src/java'),
file('src/java2')
}
}
> gradle build –PskipTests
:compileJava
:processResources SKIPPED
:classes
:preJar
:jar
:war
:assemble
:compileTestJava
:processTestResources
:testClasses
:test SKIPPED
:check
:build
BUILD SUCCESSFUL
22Lyon JUG - Présentation Gradle
apply plugin:'java'
sourceSets{
myGenSourceSet {
java {
srcDir 'build/generated'
}
}
}
> gradle clean build
:clean
:generateTask
. . .
:compileMyGenSourceSetJava
:processMyGenSourceSetResources
:myGenSourceSetClasses
. . .
23Lyon JUG - Présentation Gradle
sourceSets{
myGenSourceSet {
java {
srcDir 'build/generated'
}
main {
compileClasspath =
configurations.compile
+sourceSets.myGenSourceSet.classes
runtimeClasspath =
classes
+ configurations.runtime
+ sourceSets.myGenSourceSet.classes
}
}
jar {
from sourceSets.myGenSourceSet.classes
}
> gradle clean build
:clean
:generateTask
:compileMyGenSourceSetJava
:processMyGenSourceSetResources
:myGenSourceSetClasses
:compileJava
:processResources
:classes
. . .
24Lyon JUG - Présentation Gradle
version = 1.0
gradle.taskGraph.whenReady { taskGraph ->
if (! taskGraph.hasTask(':release')){
version+='-SNAPSHOT' }
}
GRADLE
SCRIPT
Engine
CONFIGURATIONPHASE
t1 t2
t4
Project
Convention 1
HOOK
t3 t1 t2
t4
Project
Convention 2
t3
EXECUTIONPHASE
gradle –-properties
gradle –-tasks
gradle –-dependencies
gradle –-dry-run build
// Other hooks
gradle.taskGraph.beforeTask { task -> .. .
gradle.beforeProject { project -> .. .
...
25Lyon JUG - Présentation Gradle
Soyez informé des événements: TestListener,
BuildListener, TaskActionListener, …
class MyTestListener implements TestListener{
void beforeTest(TestDescriptor test) {
println 'testStarting: '+test.getName()
}
void afterTest(TestDescriptor test,
TestResult result) {
println 'testFinished: '+test.getName()
+', result: '+result.getResultType()
}
}
Test
(junit)
GRADLE
beforeTest
afterTest
26Lyon JUG - Présentation Gradle
import org.junit.Assert
task myzip (type:Zip) {
from 'somedir'
include '*.txt'
baseName='zipname'
doLast {
Assert.assertEquals('zipname.zip',
myzip.archiveName)
Assert.assertEquals(file('build/distributions'),
myzip.destinationDir)
Assert.assertTrue(
!zipTree(myzip.archivePath).isEmpty())
txtfiles = fileTree('somedir').include('*.txt')
ziptxtfiles=zipTree(myzip.archivePath).matching{
include('*.txt')
}
Assert.assertEquals (
txtfiles.getFiles().size(),
ziptxtfiles.getFiles().size())
}
}
zipname
.zip
createZip
check
> gradle myzip
:myzip
BUILD SUCCESSFUL
>
27Lyon JUG - Présentation Gradle
28Lyon JUG - Présentation Gradle
task generateTask(dependsOn:preSchemaGen) << {
ant.echo (message:"Generating ...")
ant {
def schemagenTaskPath = path {
fileset(dirs:'lib', includes: '*.jar')
}
taskdef (
name: "xjc", classname: "com.sun.tools.xjc.XJCTask",
classpath: schemagenTaskPath
)
xjc(destdir:generatedSources,
package:"com.zenika.lib.model"){
schema(dir:"src/main/resources", includes:"**/*.xsd")
}
}
}
29Lyon JUG - Présentation Gradle
build.gradle
build.xml
ant.importBuild('build.xml')
antTask.doLast {
println('Hello from Gradle')
}
<project>
<target name="antTask">
<echo message="Hello from Ant"/>
</target>
</project>
> gradle antTask
:antTask
Hello from Ant
Hello from Gradle
30Lyon JUG - Présentation Gradle
IVY
Repository
Ivy
distant Artifacts +
meta Ivy
apply plugin:'java'
repositories {
mavenCental()
flatDir(dirs:'destrepo',
name:'ivyrep’)
}
group='test'
version='1.0'
status='release'
uploadArchives {
repositories {
add(repositories.ivyrep)
}
}
> gradle uploadArchives
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
32Lyon JUG - Présentation Gradle
• Gestion avancée d'un multi projet
• Utilisation d'un cache
• Exécution parallèle des tests
• Build daemon
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
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
35Lyon JUG - Présentation Gradle
class GenerateSchemaType extends DefaultTask {
String depsPath
@InputFiles
SourceDirectorySet inputXsdDirs
@OutputDirectory
File outputFile
@TaskAction
void generate() {
ant { ...}
}
}
task generateTask(type:GenerateSchemaType) {
inputXsdDirs = sourceSets.main.resources
outputFile = generatedSources
depsPath = configurations.jaxb.asPath
}
> gradle build
:generateTask UP-TO-DATE
:compileGeneratedJava UP-TO-DATE
:processGeneratedResources UP-TO-DATE
:generatedClasses UP-TO-DATE
:compileJava UP-TO-DATE
...
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
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
38Lyon JUG - Présentation Gradle
39Lyon JUG - Présentation Gradle
gmock
spock
security
4
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
41Lyon JUG - Présentation Gradle
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
43Lyon JUG - Présentation Gradle
44Lyon JUG - Présentation Gradle
• Essayez-le !
• Utilisez-le !
• Faites du buzz!
45Lyon JUG - Présentation Gradle
Merci

Contenu connexe

Tendances

Gwt jetty et sources de données
Gwt   jetty et sources de donnéesGwt   jetty et sources de données
Gwt jetty et sources de donnéesFranck SIMON
 
Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008Guillaume Laforge
 
NightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery AvancéNightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery AvancéZenika
 
NightClazz Build Tools & Continuous Delivery
NightClazz Build Tools & Continuous DeliveryNightClazz Build Tools & Continuous Delivery
NightClazz Build Tools & Continuous DeliveryZenika
 
GWT Principes & Techniques
GWT Principes & TechniquesGWT Principes & Techniques
GWT Principes & TechniquesRachid NID SAID
 
Développement Android
Développement AndroidDéveloppement Android
Développement AndroidFranck SIMON
 
Bases de données Spatiales - POSTGIS
Bases de données Spatiales - POSTGISBases de données Spatiales - POSTGIS
Bases de données Spatiales - POSTGISOmar El Kharki
 
REX sur l'outilage Continuous Delivery
REX sur l'outilage Continuous DeliveryREX sur l'outilage Continuous Delivery
REX sur l'outilage Continuous DeliveryDamien Goldenberg
 
Formation GraceTHD Ou mode d'emploi pour réceptionner, visualiser & gérer les...
Formation GraceTHD Ou mode d'emploi pour réceptionner, visualiser & gérer les...Formation GraceTHD Ou mode d'emploi pour réceptionner, visualiser & gérer les...
Formation GraceTHD Ou mode d'emploi pour réceptionner, visualiser & gérer les...Christophe Niel
 
Déploiement d'une application Java EE dans Azure
Déploiement d'une application Java EE dans AzureDéploiement d'une application Java EE dans Azure
Déploiement d'une application Java EE dans AzureJosé Paumard
 
Java scripting api
Java scripting apiJava scripting api
Java scripting apiFranck SIMON
 
Docker, Pierre angulaire du continuous delivery ?
Docker, Pierre angulaire du continuous delivery ?Docker, Pierre angulaire du continuous delivery ?
Docker, Pierre angulaire du continuous delivery ?Adrien Blind
 
Gwt fast overview_v1
Gwt fast overview_v1Gwt fast overview_v1
Gwt fast overview_v1David Herviou
 

Tendances (20)

Gwt jetty et sources de données
Gwt   jetty et sources de donnéesGwt   jetty et sources de données
Gwt jetty et sources de données
 
gradle_lavajug
gradle_lavajuggradle_lavajug
gradle_lavajug
 
gradle_nantesjug
gradle_nantesjuggradle_nantesjug
gradle_nantesjug
 
Android ORMLite
Android   ORMLiteAndroid   ORMLite
Android ORMLite
 
Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008
 
Android NDK
Android   NDKAndroid   NDK
Android NDK
 
NightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery AvancéNightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery Avancé
 
NightClazz Build Tools & Continuous Delivery
NightClazz Build Tools & Continuous DeliveryNightClazz Build Tools & Continuous Delivery
NightClazz Build Tools & Continuous Delivery
 
Soiree Maven 2
Soiree Maven 2Soiree Maven 2
Soiree Maven 2
 
GWT Principes & Techniques
GWT Principes & TechniquesGWT Principes & Techniques
GWT Principes & Techniques
 
Gradle_ToursJUG
Gradle_ToursJUGGradle_ToursJUG
Gradle_ToursJUG
 
Développement Android
Développement AndroidDéveloppement Android
Développement Android
 
Bases de données Spatiales - POSTGIS
Bases de données Spatiales - POSTGISBases de données Spatiales - POSTGIS
Bases de données Spatiales - POSTGIS
 
Présentation1
Présentation1Présentation1
Présentation1
 
REX sur l'outilage Continuous Delivery
REX sur l'outilage Continuous DeliveryREX sur l'outilage Continuous Delivery
REX sur l'outilage Continuous Delivery
 
Formation GraceTHD Ou mode d'emploi pour réceptionner, visualiser & gérer les...
Formation GraceTHD Ou mode d'emploi pour réceptionner, visualiser & gérer les...Formation GraceTHD Ou mode d'emploi pour réceptionner, visualiser & gérer les...
Formation GraceTHD Ou mode d'emploi pour réceptionner, visualiser & gérer les...
 
Déploiement d'une application Java EE dans Azure
Déploiement d'une application Java EE dans AzureDéploiement d'une application Java EE dans Azure
Déploiement d'une application Java EE dans Azure
 
Java scripting api
Java scripting apiJava scripting api
Java scripting api
 
Docker, Pierre angulaire du continuous delivery ?
Docker, Pierre angulaire du continuous delivery ?Docker, Pierre angulaire du continuous delivery ?
Docker, Pierre angulaire du continuous delivery ?
 
Gwt fast overview_v1
Gwt fast overview_v1Gwt fast overview_v1
Gwt fast overview_v1
 

En vedette

Visualizing Issues - UCCA Presentation
Visualizing Issues - UCCA PresentationVisualizing Issues - UCCA Presentation
Visualizing Issues - UCCA Presentationseaninchina
 
Funda gürbüz(twitter)
Funda gürbüz(twitter)Funda gürbüz(twitter)
Funda gürbüz(twitter)funda91
 
Ppp testing original
Ppp testing originalPpp testing original
Ppp testing originalluisocampo88
 
Pre production 1
Pre production 1Pre production 1
Pre production 1ecsmedia
 
Pre production power point
Pre production power pointPre production power point
Pre production power pointecsmedia
 
Didática - retrospectiva
Didática - retrospectivaDidática - retrospectiva
Didática - retrospectivaKarine Pinheiro
 
perfil profesional
perfil profesionalperfil profesional
perfil profesionalhpcatherine
 
Little cherry virus 2 comp 1
Little cherry virus 2 comp 1Little cherry virus 2 comp 1
Little cherry virus 2 comp 1treddout
 
Q2 final evaluation
Q2 final evaluationQ2 final evaluation
Q2 final evaluationownisr
 
My dar dark tale with sounds
My dar dark tale with soundsMy dar dark tale with sounds
My dar dark tale with soundslekeitioeskola
 
SPECIALITÀ E MONUMENTI D'ITALIA
SPECIALITÀ E MONUMENTI D'ITALIASPECIALITÀ E MONUMENTI D'ITALIA
SPECIALITÀ E MONUMENTI D'ITALIAelia osma
 
Demand-Driven Acquisitions, Part 1
Demand-Driven Acquisitions, Part 1Demand-Driven Acquisitions, Part 1
Demand-Driven Acquisitions, Part 1Michael Levine-Clark
 

En vedette (20)

Visualizing Issues - UCCA Presentation
Visualizing Issues - UCCA PresentationVisualizing Issues - UCCA Presentation
Visualizing Issues - UCCA Presentation
 
Funda gürbüz(twitter)
Funda gürbüz(twitter)Funda gürbüz(twitter)
Funda gürbüz(twitter)
 
Ppp testing original
Ppp testing originalPpp testing original
Ppp testing original
 
Job specification
Job specificationJob specification
Job specification
 
Job specification
Job specificationJob specification
Job specification
 
Pre production 1
Pre production 1Pre production 1
Pre production 1
 
Pre production power point
Pre production power pointPre production power point
Pre production power point
 
Didática - retrospectiva
Didática - retrospectivaDidática - retrospectiva
Didática - retrospectiva
 
Lista
ListaLista
Lista
 
Género y comunicación
Género y comunicaciónGénero y comunicación
Género y comunicación
 
perfil profesional
perfil profesionalperfil profesional
perfil profesional
 
Little cherry virus 2 comp 1
Little cherry virus 2 comp 1Little cherry virus 2 comp 1
Little cherry virus 2 comp 1
 
Question7
Question7Question7
Question7
 
Left 4 Dead
Left 4 DeadLeft 4 Dead
Left 4 Dead
 
Ecn Valdre
Ecn ValdreEcn Valdre
Ecn Valdre
 
Q2 final evaluation
Q2 final evaluationQ2 final evaluation
Q2 final evaluation
 
アクセシビリティへの取り組みの歴史
アクセシビリティへの取り組みの歴史アクセシビリティへの取り組みの歴史
アクセシビリティへの取り組みの歴史
 
My dar dark tale with sounds
My dar dark tale with soundsMy dar dark tale with sounds
My dar dark tale with sounds
 
SPECIALITÀ E MONUMENTI D'ITALIA
SPECIALITÀ E MONUMENTI D'ITALIASPECIALITÀ E MONUMENTI D'ITALIA
SPECIALITÀ E MONUMENTI D'ITALIA
 
Demand-Driven Acquisitions, Part 1
Demand-Driven Acquisitions, Part 1Demand-Driven Acquisitions, Part 1
Demand-Driven Acquisitions, Part 1
 

Similaire à Présentation Gradle au LyonJUG par Grégory Boissinot - Zenika

Play framework - Human Talks Grenoble - 12.02.2013
Play framework - Human Talks Grenoble - 12.02.2013Play framework - Human Talks Grenoble - 12.02.2013
Play framework - Human Talks Grenoble - 12.02.2013Xavier NOPRE
 
Aperçu de RequireJS
Aperçu de RequireJSAperçu de RequireJS
Aperçu de RequireJSVISEO
 
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...XavierPestel
 
Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...
Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...
Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...Pierre Ternon
 
Au secours, mon chef m'a demandé de passer au DevOps
Au secours, mon chef m'a demandé de passer au DevOpsAu secours, mon chef m'a demandé de passer au DevOps
Au secours, mon chef m'a demandé de passer au DevOpsantony_guilloteau
 
Introduction à SBT
Introduction à SBTIntroduction à SBT
Introduction à SBTJean Detoeuf
 
Automatisez vos tâches répétitives avec Grunt (Blend 2013)
Automatisez vos tâches répétitives avec Grunt (Blend 2013)Automatisez vos tâches répétitives avec Grunt (Blend 2013)
Automatisez vos tâches répétitives avec Grunt (Blend 2013)Corinne Schillinger
 
Présentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'OfflinePrésentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'OfflineDNG Consulting
 
Chaine de production pipeline
Chaine de production   pipelineChaine de production   pipeline
Chaine de production pipelineNicolas wallerand
 
Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Aurélien Maury
 
Comparatif des frameworks js mv
Comparatif des frameworks js mvComparatif des frameworks js mv
Comparatif des frameworks js mvMael Monnier
 
Apache flink - prise en main rapide
Apache flink - prise en main rapideApache flink - prise en main rapide
Apache flink - prise en main rapideBilal Baltagi
 
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)hibnico
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovyguest6e3bed
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation GroovyJS Bournival
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hoodsvuillet
 
Dev cloud java : la tête dans les nuages
Dev cloud java : la tête dans les nuagesDev cloud java : la tête dans les nuages
Dev cloud java : la tête dans les nuagesSOAT
 
Scub Foundation, usine logicielle Java libre
Scub Foundation, usine logicielle Java libreScub Foundation, usine logicielle Java libre
Scub Foundation, usine logicielle Java libreStéphane Traumat
 

Similaire à Présentation Gradle au LyonJUG par Grégory Boissinot - Zenika (20)

Play framework - Human Talks Grenoble - 12.02.2013
Play framework - Human Talks Grenoble - 12.02.2013Play framework - Human Talks Grenoble - 12.02.2013
Play framework - Human Talks Grenoble - 12.02.2013
 
Gradle
GradleGradle
Gradle
 
Aperçu de RequireJS
Aperçu de RequireJSAperçu de RequireJS
Aperçu de RequireJS
 
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
 
Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...
Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...
Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...
 
Au secours, mon chef m'a demandé de passer au DevOps
Au secours, mon chef m'a demandé de passer au DevOpsAu secours, mon chef m'a demandé de passer au DevOps
Au secours, mon chef m'a demandé de passer au DevOps
 
Introduction à SBT
Introduction à SBTIntroduction à SBT
Introduction à SBT
 
Automatisez vos tâches répétitives avec Grunt (Blend 2013)
Automatisez vos tâches répétitives avec Grunt (Blend 2013)Automatisez vos tâches répétitives avec Grunt (Blend 2013)
Automatisez vos tâches répétitives avec Grunt (Blend 2013)
 
Présentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'OfflinePrésentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'Offline
 
Springioc
SpringiocSpringioc
Springioc
 
Chaine de production pipeline
Chaine de production   pipelineChaine de production   pipeline
Chaine de production pipeline
 
Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011Grails from scratch to prod - MixIT 2011
Grails from scratch to prod - MixIT 2011
 
Comparatif des frameworks js mv
Comparatif des frameworks js mvComparatif des frameworks js mv
Comparatif des frameworks js mv
 
Apache flink - prise en main rapide
Apache flink - prise en main rapideApache flink - prise en main rapide
Apache flink - prise en main rapide
 
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
Maven/Ivy vs OSGi (Toulouse Jug 26-05-2011)
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovy
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovy
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hood
 
Dev cloud java : la tête dans les nuages
Dev cloud java : la tête dans les nuagesDev cloud java : la tête dans les nuages
Dev cloud java : la tête dans les nuages
 
Scub Foundation, usine logicielle Java libre
Scub Foundation, usine logicielle Java libreScub Foundation, usine logicielle Java libre
Scub Foundation, usine logicielle Java libre
 

Plus de Zenika

Datascience & IoT
Datascience & IoTDatascience & IoT
Datascience & IoTZenika
 
Matinale Agile Wake Up #4 : les tests et l'agilité
Matinale Agile Wake Up #4 : les tests et l'agilitéMatinale Agile Wake Up #4 : les tests et l'agilité
Matinale Agile Wake Up #4 : les tests et l'agilitéZenika
 
Agile Wake Up #3 : Lean UX
Agile Wake Up #3 : Lean UXAgile Wake Up #3 : Lean UX
Agile Wake Up #3 : Lean UXZenika
 
Agile Wake Up #3 : La transformation Agile de Kisio Digital
Agile Wake Up #3 : La transformation Agile de Kisio DigitalAgile Wake Up #3 : La transformation Agile de Kisio Digital
Agile Wake Up #3 : La transformation Agile de Kisio DigitalZenika
 
Agile Wake Up #3 : la contractualisation Agile
Agile Wake Up #3 : la contractualisation AgileAgile Wake Up #3 : la contractualisation Agile
Agile Wake Up #3 : la contractualisation AgileZenika
 
Zenika matinale spark-zeppelin_ml
Zenika matinale spark-zeppelin_mlZenika matinale spark-zeppelin_ml
Zenika matinale spark-zeppelin_mlZenika
 
Docker du mythe à la réalité
Docker du mythe à la réalitéDocker du mythe à la réalité
Docker du mythe à la réalitéZenika
 
Motivation 3.0 : sens, autonomie et maîtrise.
Motivation 3.0 : sens, autonomie et maîtrise.Motivation 3.0 : sens, autonomie et maîtrise.
Motivation 3.0 : sens, autonomie et maîtrise.Zenika
 
Matinale React
Matinale ReactMatinale React
Matinale ReactZenika
 
NigthClazz Spark - Machine Learning / Introduction à Spark et Zeppelin
NigthClazz Spark - Machine Learning / Introduction à Spark et ZeppelinNigthClazz Spark - Machine Learning / Introduction à Spark et Zeppelin
NigthClazz Spark - Machine Learning / Introduction à Spark et ZeppelinZenika
 
NightClazz Spark / Machine Learning
NightClazz Spark / Machine LearningNightClazz Spark / Machine Learning
NightClazz Spark / Machine LearningZenika
 
HTTP2 : ce qui va changer par Julien Landuré
HTTP2 : ce qui va changer par Julien LanduréHTTP2 : ce qui va changer par Julien Landuré
HTTP2 : ce qui va changer par Julien LanduréZenika
 
Agile Wake Up #1 du 01/12/2015 : L'agilité au service des projets Orange Fran...
Agile Wake Up #1 du 01/12/2015 : L'agilité au service des projets Orange Fran...Agile Wake Up #1 du 01/12/2015 : L'agilité au service des projets Orange Fran...
Agile Wake Up #1 du 01/12/2015 : L'agilité au service des projets Orange Fran...Zenika
 
Agile Wake Up #1 du 01/12/2015 : Scrum Master's Diary par Arnaud Villenave
Agile Wake Up #1 du 01/12/2015 : Scrum Master's Diary par Arnaud VillenaveAgile Wake Up #1 du 01/12/2015 : Scrum Master's Diary par Arnaud Villenave
Agile Wake Up #1 du 01/12/2015 : Scrum Master's Diary par Arnaud VillenaveZenika
 
Agile Wake Up #1 du 01/12/2015 : L'agilité à grande échelle
Agile Wake Up #1 du 01/12/2015 : L'agilité à grande échelleAgile Wake Up #1 du 01/12/2015 : L'agilité à grande échelle
Agile Wake Up #1 du 01/12/2015 : L'agilité à grande échelleZenika
 
Entreprise libérée : Du mythe à la réalité ?
Entreprise libérée : Du mythe à la réalité ?Entreprise libérée : Du mythe à la réalité ?
Entreprise libérée : Du mythe à la réalité ?Zenika
 
Conference MicroServices101 - 1ere partie
Conference MicroServices101 - 1ere partieConference MicroServices101 - 1ere partie
Conference MicroServices101 - 1ere partieZenika
 
NightClazz Docker Découverte
NightClazz Docker Découverte NightClazz Docker Découverte
NightClazz Docker Découverte Zenika
 
Matinale DevOps / Docker
Matinale DevOps / DockerMatinale DevOps / Docker
Matinale DevOps / DockerZenika
 
NightClazz Java 8 Decouverte
NightClazz Java 8 DecouverteNightClazz Java 8 Decouverte
NightClazz Java 8 DecouverteZenika
 

Plus de Zenika (20)

Datascience & IoT
Datascience & IoTDatascience & IoT
Datascience & IoT
 
Matinale Agile Wake Up #4 : les tests et l'agilité
Matinale Agile Wake Up #4 : les tests et l'agilitéMatinale Agile Wake Up #4 : les tests et l'agilité
Matinale Agile Wake Up #4 : les tests et l'agilité
 
Agile Wake Up #3 : Lean UX
Agile Wake Up #3 : Lean UXAgile Wake Up #3 : Lean UX
Agile Wake Up #3 : Lean UX
 
Agile Wake Up #3 : La transformation Agile de Kisio Digital
Agile Wake Up #3 : La transformation Agile de Kisio DigitalAgile Wake Up #3 : La transformation Agile de Kisio Digital
Agile Wake Up #3 : La transformation Agile de Kisio Digital
 
Agile Wake Up #3 : la contractualisation Agile
Agile Wake Up #3 : la contractualisation AgileAgile Wake Up #3 : la contractualisation Agile
Agile Wake Up #3 : la contractualisation Agile
 
Zenika matinale spark-zeppelin_ml
Zenika matinale spark-zeppelin_mlZenika matinale spark-zeppelin_ml
Zenika matinale spark-zeppelin_ml
 
Docker du mythe à la réalité
Docker du mythe à la réalitéDocker du mythe à la réalité
Docker du mythe à la réalité
 
Motivation 3.0 : sens, autonomie et maîtrise.
Motivation 3.0 : sens, autonomie et maîtrise.Motivation 3.0 : sens, autonomie et maîtrise.
Motivation 3.0 : sens, autonomie et maîtrise.
 
Matinale React
Matinale ReactMatinale React
Matinale React
 
NigthClazz Spark - Machine Learning / Introduction à Spark et Zeppelin
NigthClazz Spark - Machine Learning / Introduction à Spark et ZeppelinNigthClazz Spark - Machine Learning / Introduction à Spark et Zeppelin
NigthClazz Spark - Machine Learning / Introduction à Spark et Zeppelin
 
NightClazz Spark / Machine Learning
NightClazz Spark / Machine LearningNightClazz Spark / Machine Learning
NightClazz Spark / Machine Learning
 
HTTP2 : ce qui va changer par Julien Landuré
HTTP2 : ce qui va changer par Julien LanduréHTTP2 : ce qui va changer par Julien Landuré
HTTP2 : ce qui va changer par Julien Landuré
 
Agile Wake Up #1 du 01/12/2015 : L'agilité au service des projets Orange Fran...
Agile Wake Up #1 du 01/12/2015 : L'agilité au service des projets Orange Fran...Agile Wake Up #1 du 01/12/2015 : L'agilité au service des projets Orange Fran...
Agile Wake Up #1 du 01/12/2015 : L'agilité au service des projets Orange Fran...
 
Agile Wake Up #1 du 01/12/2015 : Scrum Master's Diary par Arnaud Villenave
Agile Wake Up #1 du 01/12/2015 : Scrum Master's Diary par Arnaud VillenaveAgile Wake Up #1 du 01/12/2015 : Scrum Master's Diary par Arnaud Villenave
Agile Wake Up #1 du 01/12/2015 : Scrum Master's Diary par Arnaud Villenave
 
Agile Wake Up #1 du 01/12/2015 : L'agilité à grande échelle
Agile Wake Up #1 du 01/12/2015 : L'agilité à grande échelleAgile Wake Up #1 du 01/12/2015 : L'agilité à grande échelle
Agile Wake Up #1 du 01/12/2015 : L'agilité à grande échelle
 
Entreprise libérée : Du mythe à la réalité ?
Entreprise libérée : Du mythe à la réalité ?Entreprise libérée : Du mythe à la réalité ?
Entreprise libérée : Du mythe à la réalité ?
 
Conference MicroServices101 - 1ere partie
Conference MicroServices101 - 1ere partieConference MicroServices101 - 1ere partie
Conference MicroServices101 - 1ere partie
 
NightClazz Docker Découverte
NightClazz Docker Découverte NightClazz Docker Découverte
NightClazz Docker Découverte
 
Matinale DevOps / Docker
Matinale DevOps / DockerMatinale DevOps / Docker
Matinale DevOps / Docker
 
NightClazz Java 8 Decouverte
NightClazz Java 8 DecouverteNightClazz Java 8 Decouverte
NightClazz Java 8 Decouverte
 

Dernier

Protéger l'intégrité de son environnement numérique
Protéger l'intégrité de son environnement numériqueProtéger l'intégrité de son environnement numérique
Protéger l'intégrité de son environnement numériquePaperjam_redaction
 
Slides du webinaire de l'Infopole sur l'IA
Slides du webinaire de l'Infopole sur l'IASlides du webinaire de l'Infopole sur l'IA
Slides du webinaire de l'Infopole sur l'IAInfopole1
 
Modèles de contrôle d accès_ RBAC (Role Based Access Control).pdf
Modèles de contrôle d accès_ RBAC (Role Based Access Control).pdfModèles de contrôle d accès_ RBAC (Role Based Access Control).pdf
Modèles de contrôle d accès_ RBAC (Role Based Access Control).pdfHajer Boujezza
 
cours Systèmes de Gestion des Identités.pdf
cours Systèmes de Gestion des Identités.pdfcours Systèmes de Gestion des Identités.pdf
cours Systèmes de Gestion des Identités.pdfHajer Boujezza
 
Augmentez vos conversions en ligne : les techniques et outils qui marchent vr...
Augmentez vos conversions en ligne : les techniques et outils qui marchent vr...Augmentez vos conversions en ligne : les techniques et outils qui marchent vr...
Augmentez vos conversions en ligne : les techniques et outils qui marchent vr...OsharaInc
 
Contrôle d’accès et Gestion des identités: Terminologies et Protocoles d’auth...
Contrôle d’accès et Gestion des identités: Terminologies et Protocoles d’auth...Contrôle d’accès et Gestion des identités: Terminologies et Protocoles d’auth...
Contrôle d’accès et Gestion des identités: Terminologies et Protocoles d’auth...Hajer Boujezza
 

Dernier (6)

Protéger l'intégrité de son environnement numérique
Protéger l'intégrité de son environnement numériqueProtéger l'intégrité de son environnement numérique
Protéger l'intégrité de son environnement numérique
 
Slides du webinaire de l'Infopole sur l'IA
Slides du webinaire de l'Infopole sur l'IASlides du webinaire de l'Infopole sur l'IA
Slides du webinaire de l'Infopole sur l'IA
 
Modèles de contrôle d accès_ RBAC (Role Based Access Control).pdf
Modèles de contrôle d accès_ RBAC (Role Based Access Control).pdfModèles de contrôle d accès_ RBAC (Role Based Access Control).pdf
Modèles de contrôle d accès_ RBAC (Role Based Access Control).pdf
 
cours Systèmes de Gestion des Identités.pdf
cours Systèmes de Gestion des Identités.pdfcours Systèmes de Gestion des Identités.pdf
cours Systèmes de Gestion des Identités.pdf
 
Augmentez vos conversions en ligne : les techniques et outils qui marchent vr...
Augmentez vos conversions en ligne : les techniques et outils qui marchent vr...Augmentez vos conversions en ligne : les techniques et outils qui marchent vr...
Augmentez vos conversions en ligne : les techniques et outils qui marchent vr...
 
Contrôle d’accès et Gestion des identités: Terminologies et Protocoles d’auth...
Contrôle d’accès et Gestion des identités: Terminologies et Protocoles d’auth...Contrôle d’accès et Gestion des identités: Terminologies et Protocoles d’auth...
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
  • 3. 3Lyon JUG - Présentation Gradle INTERNET
  • 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
  • 6. 6Lyon JUG - Présentation Gradle 1ère génération 2008 2001 2 1 3 2ème génération 3ème génération 2000 2005 2008
  • 7. 7Lyon JUG - Présentation Gradle <!–- ANT -- build.xml --> <project> <target name="retrieceDeps> ... </target> <target name="compile" ... </project> <!–- GRADLE– build.gradle --> apply plugin:'java' version=1.0 repositories { mavenCental() flatDir(dirs:'lib') } dependencies { compile( group:'org.apache.wicket', name:'wicket', version:'1.4.7') } <!–- MAVEN – pom.xml--> <?xml version="1.0" encoding="UTF-8"?> <project> <modelVersion>4.0.0</modelVersion> <groupId>org.lyonjug</groupId> <artifactId>maven</artifactId> <version>1.0</version> <dependencies> <dependency> <groupId>org.apache.wicket</groupId> <artifactId>wicket</artifactId> <version>1.4.7</version> <scope>compile</scope> </dependency> </dependencies> </project>
  • 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); . . . }
  • 15. 15Lyon JUG - Présentation Gradle <!– HelloTask.groovy --> class HelloTask extends DefaultTask { def message="Default Message" @TaskAction public void print(){ println message } } > gradle myhello :myhello Default Message > gradle myhello2 :myhello2 Task Message<!-- build.gradle --> task(myhello, type:HelloTask) task(myhello2, type:HelloTask){ message="Task Message" }
  • 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
  • 19. 19Lyon JUG - Présentation Gradle
  • 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 } } }
  • 21. 21Lyon JUG - Présentation Gradle apply plugin:'java' processResources.enabled=false test.onlyIf{ !project.hasProperty('skipTests')} //Add behavior in the lifecycle task(preJar) jar.dependsOn preJar //Change the output directory buildDirName='target' //Change the source directory sourceSets{ main{ java.srcDirs file('src/java'), file('src/java2') } } > gradle build –PskipTests :compileJava :processResources SKIPPED :classes :preJar :jar :war :assemble :compileTestJava :processTestResources :testClasses :test SKIPPED :check :build BUILD SUCCESSFUL
  • 22. 22Lyon JUG - Présentation Gradle apply plugin:'java' sourceSets{ myGenSourceSet { java { srcDir 'build/generated' } } } > gradle clean build :clean :generateTask . . . :compileMyGenSourceSetJava :processMyGenSourceSetResources :myGenSourceSetClasses . . .
  • 23. 23Lyon JUG - Présentation Gradle sourceSets{ myGenSourceSet { java { srcDir 'build/generated' } main { compileClasspath = configurations.compile +sourceSets.myGenSourceSet.classes runtimeClasspath = classes + configurations.runtime + sourceSets.myGenSourceSet.classes } } jar { from sourceSets.myGenSourceSet.classes } > gradle clean build :clean :generateTask :compileMyGenSourceSetJava :processMyGenSourceSetResources :myGenSourceSetClasses :compileJava :processResources :classes . . .
  • 24. 24Lyon JUG - Présentation Gradle version = 1.0 gradle.taskGraph.whenReady { taskGraph -> if (! taskGraph.hasTask(':release')){ version+='-SNAPSHOT' } } GRADLE SCRIPT Engine CONFIGURATIONPHASE t1 t2 t4 Project Convention 1 HOOK t3 t1 t2 t4 Project Convention 2 t3 EXECUTIONPHASE gradle –-properties gradle –-tasks gradle –-dependencies gradle –-dry-run build // Other hooks gradle.taskGraph.beforeTask { task -> .. . gradle.beforeProject { project -> .. . ...
  • 25. 25Lyon JUG - Présentation Gradle Soyez informé des événements: TestListener, BuildListener, TaskActionListener, … class MyTestListener implements TestListener{ void beforeTest(TestDescriptor test) { println 'testStarting: '+test.getName() } void afterTest(TestDescriptor test, TestResult result) { println 'testFinished: '+test.getName() +', result: '+result.getResultType() } } Test (junit) GRADLE beforeTest afterTest
  • 26. 26Lyon JUG - Présentation Gradle import org.junit.Assert task myzip (type:Zip) { from 'somedir' include '*.txt' baseName='zipname' doLast { Assert.assertEquals('zipname.zip', myzip.archiveName) Assert.assertEquals(file('build/distributions'), myzip.destinationDir) Assert.assertTrue( !zipTree(myzip.archivePath).isEmpty()) txtfiles = fileTree('somedir').include('*.txt') ziptxtfiles=zipTree(myzip.archivePath).matching{ include('*.txt') } Assert.assertEquals ( txtfiles.getFiles().size(), ziptxtfiles.getFiles().size()) } } zipname .zip createZip check > gradle myzip :myzip BUILD SUCCESSFUL >
  • 27. 27Lyon JUG - Présentation Gradle
  • 28. 28Lyon JUG - Présentation Gradle task generateTask(dependsOn:preSchemaGen) << { ant.echo (message:"Generating ...") ant { def schemagenTaskPath = path { fileset(dirs:'lib', includes: '*.jar') } taskdef ( name: "xjc", classname: "com.sun.tools.xjc.XJCTask", classpath: schemagenTaskPath ) xjc(destdir:generatedSources, package:"com.zenika.lib.model"){ schema(dir:"src/main/resources", includes:"**/*.xsd") } } }
  • 29. 29Lyon JUG - Présentation Gradle build.gradle build.xml ant.importBuild('build.xml') antTask.doLast { println('Hello from Gradle') } <project> <target name="antTask"> <echo message="Hello from Ant"/> </target> </project> > gradle antTask :antTask Hello from Ant Hello from Gradle
  • 30. 30Lyon JUG - Présentation Gradle IVY Repository Ivy distant Artifacts + meta Ivy apply plugin:'java' repositories { mavenCental() flatDir(dirs:'destrepo', name:'ivyrep’) } group='test' version='1.0' status='release' uploadArchives { repositories { add(repositories.ivyrep) } } > gradle uploadArchives
  • 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
  • 35. 35Lyon JUG - Présentation Gradle class GenerateSchemaType extends DefaultTask { String depsPath @InputFiles SourceDirectorySet inputXsdDirs @OutputDirectory File outputFile @TaskAction void generate() { ant { ...} } } task generateTask(type:GenerateSchemaType) { inputXsdDirs = sourceSets.main.resources outputFile = generatedSources depsPath = configurations.jaxb.asPath } > gradle build :generateTask UP-TO-DATE :compileGeneratedJava UP-TO-DATE :processGeneratedResources UP-TO-DATE :generatedClasses UP-TO-DATE :compileJava UP-TO-DATE ...
  • 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
  • 38. 38Lyon JUG - Présentation Gradle
  • 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
  • 41. 41Lyon JUG - Présentation Gradle
  • 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
  • 43. 43Lyon JUG - Présentation Gradle
  • 44. 44Lyon JUG - Présentation Gradle • Essayez-le ! • Utilisez-le ! • Faites du buzz!
  • 45. 45Lyon JUG - Présentation Gradle Merci