Contenu connexe
Similaire à Gradle_BreizJUG
Similaire à Gradle_BreizJUG (20)
Plus de Gregory Boissinot
Plus de Gregory Boissinot (13)
Gradle_BreizJUG
- 1. GRADLE
Grégory Boissinot
13/09/2010
Copyright © BreizhJug
- 2. A mon propos
• Consultant et formateur Zenika
– Mes spécialités: Build et Intégration continue
– Build master chez Thales
• Introduction et déploiement de Gradle à grande
échelle
• Commiter Hudson
– Intégration des châines de build Gradle,
C/C++, ADA
Copyright © BreizhJug
- 3. Pourquoi un outil de plus?
• La nature des besoins a changé
– Augmentation des besoins d'automatisation
– Un build peut faire beaucoup plus de choses
que la simple création d'une archive Java
Copyright © BreizhJug
- 4. Evolution des outils
2000 2005 2008
1ère génération 2ème génération 3ème génération
2
3
1
Copyright © BreizhJug
- 5. Gradle: première définition
• Système de build pour les projets Java,
Groovy, OSGI, Web et Scala
• Flexible à la Ant avec les conventions de
Maven à la demande
• Insertion totale dans une infrastructure Ant
et Maven existante
Copyright © BreizhJug
- 6. Approche déclarative et
notion de conventions
• Spécification du 'quoi' et pas du 'comment'
apply plugin:'java' > gradle clean build
:clean
repositories { :compileJava
src
mavenCentral() :processResources
} :classes myLib main
.jar
:jar
dependencies { java
:assemble
compile :compileTestJava resources
"jdom:jdom:1.0" :processTestResources
testCompile :testClasses
"junit:junit:4.7" :test test
} :check
java
:build
BUILD SUCCESSFUL resources
Copyright © BreizhJug
- 7. On ne peut pas anticiper
tous les besoins des projets
Copyright © BreizhJug
- 8. Un langage de build
configurations
repositories
build.gradle
dependencies
Project
ant
task
artifacts
API
Copyright © BreizhJug
- 9. Un langage de build
extensible
• 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
– ....
• Nombreux points d'extension
• Fourniture de ses propres éléments
Copyright © BreizhJug
- 10. Délégation du build à un
ensemble de tâches
// build.gradle > gradle distribution
task(distribution).doFirst{ :distribution
println "Print Distribution" Print Distribution
for (int i:[1,2,3]){ print i } 123
}
> gradle release
task(release) :distribution
release.dependsOn(distribution) Print Distribution
release.doFirst{ 123
println "Print Release" :release AbstractCopyTask
} Print Release
task mycopy (type:Copy){
from(file('resources')) AbstractArchiveTask Copy
into(file('target'))
include('**/*.txt', '**/*.xml')
}
Zip Tar
myCopy.exclude('**/.properties')
public class Copy extends AbstractCopyTask {
AbstractCopyTask from(Object... sourcePaths);
AbstractCopyTask into(Object destDir);
AbstractCopyTask includes(String includes);
Copyright © BreizhJug
AbstractCopyTask excludes(String excludes); }
- 11. Création de tâches
personnalisées
// common.gradle
class HelloTask extends DefaultTask {
def message="Default Message"
@TaskAction > gradle myhello
public void print(){ :myhello
println message Default Message
}
} > gradle myhello2
:myhello2
// build.gradle Task Message
apply from : 'http://ci.repo/common.gradle'
task(myhello, type:HelloTask)
task(myhello2, type:HelloTask){
message="Task Message"
}
Copyright © BreizhJug
- 12. Regroupement des tâches
sous forme de plugins
Plugins maven Java Configuration
Object
eclipse idea Jetty Configuration War Configuration
Object Object
code-quality war
… …
projects-reports java
…
jetty osgi
Project
scala Configuration
Copyright © BreizhJug
- 13. Performance
• Gestion multi-projet avancée
• Utilisation d'un cache
• Exécution parallèle des tests
Copyright © BreizhJug
- 14. Gestion multi-projet
// settings.gradle
avancée shared
include 'api',
'shared',
'services:webservices' webservices api
// root build.gradle api > gradle buildNeeded
subprojects { :shared:jar
apply plugin: 'java' :api:jar
} :api:test
project(':api') { :shared:test
dependencies {
compile project(':shared') api > gradle buildDependents
} :shared:jar
} :api:jar
:api:test
// webservices/build.gradle :webservices:war
apply plugin:'war' :webservices:test
dependencies {
compile
api > gradle –-no-rebuild
project(':shared'),
project(':api'), api:jar
'commons-io:commons-io:1.2'
}
Copyright © BreizhJug
- 15. Utilisation d'un cache
• Le script est compilé uniquement en cas
de nouveaux changements
• Détection des changements des inputs et
des outputs >gradle myzip
:myzip
>gradle myzip
:myzip UP-TO-DATE
>gradle myzip –-cahce rebuild
:myzip
Copyright © BreizhJug
- 16. Exécution parallèle des tests
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
}
Copyright © BreizhJug
- 18. Introspecter et manipuler
un build
CONFIGURATION PHASE
t1 t2 t3 t1 t2 t3
EXECUTION PHASE
t4 t4
HOOK
GRADLE
SCRIPT
Project Project Engine
Convention 1 Convention 2
gradle –-properties version = 1.0
gradle –-tasks –-all gradle.taskGraph.whenReady{taskGraph ->
gradle –-dependencies if (!taskGraph.hasTask(':release')){
gradle –-dry-run build version+='-SNAPSHOT'
}
}
Copyright © BreizhJug
- 19. Être à l'écoute de son build
• Soyez informé des événements: TestListener,
BuildListener, TaskActionListener, …
class MyTestListener implements TestListener{
beforeTest
void beforeTest(TestDescriptor test) {
GRADLE
println 'testStarting: '+test.getName()
} Test
(junit)
void afterTest(TestDescriptor test,
TestResult result) {
println 'testFinished: '+test.getName() afterTest
+', result: '+result.getResultType()
}
}
Copyright © BreizhJug
- 20. Tester vos scripts
import org.junit.Assert
> gradle myzip
task myzip (type:Zip) { :myzip
from 'somedir'
include '*.txt'
baseName='zipname'
doLast {
Assert.assertEquals('zipname.zip',
myzip.archiveName) createZip
Assert.assertEquals(file('build/distributions'),
myzip.destinationDir)
Assert.assertTrue( zipname
!zipTree(myzip.archivePath).isEmpty()) .zip
txtfiles = fileTree('somedir').include('*.txt')
check
ziptxtfiles=zipTree(myzip.archivePath).matching{
include('*.txt')
}
Assert.assertEquals (
txtfiles.getFiles().size(), BUILD SUCCESSFUL
ziptxtfiles.getFiles().size()) >
}
}
Copyright © BreizhJug
- 21. Une boîte à outils pour une
insertion dans l'existant
Copyright © BreizhJug
- 22. Réutilisation des tâches Ant
ant.echo (message:ANT)
ant {
def wsdl2java_classpath = path {
fileset(dirs:'lib', includes: '*.jar')
}
taskdef(
name: 'axiswsdl2java',
classname:
'org.apache.axis.tools.ant.wsdl.Wsdl2javaAntTask',
classpath: wsdl2java_classpath )
axiswsdl2java( output:"generated",
verbose:"true" ,
url:"Exemple.wsdl" )
}
Copyright © BreizhJug
- 23. Réutilisation des scripts ANT
build.xml <project>
<target name="antTask">
<echo message="Hello from Ant"/>
</target>
</project>
build.grad ant.importBuild('build.xml')
le
antTask.doLast {
println('Hello from Gradle')
}
> gradle antTask
:antTask
Hello from Ant
Hello from Gradle
Copyright © BreizhJug
- 24. Déploiement
dans un dépôt Ivy
apply plugin:'java'
repositories { IVY
flatDir(dirs:'destrepo',
name:'ivyrep’)
}
group='test'
> gradle uploadArchives
version='1.0'
status='release'
uploadArchives {
repositories {
add(repositories.ivyrep)
}
Repository
}
Ivy
distant Artifacts +
meta Ivy
Copyright © BreizhJug
- 25. Déploiement
dans un dépôt Maven
apply plugin:'java' Maven
apply plugin:'maven' Ant
Tasks
group='test'
version='1.0-SNAPSHOT'
uploadArchives {
repositories {
mavenDeployer {
> gradle > gradle
repository( install uploadArchives
url: remoteRepo)
}
}
}
Repository Repository
Maven Maven
Artifacts +
Local meta Maven distant
Artifacts +
meta Maven
Copyright © BreizhJug
- 27. Roadmap
• Nouveau DSL de gestion des dépendances
• Build Daemon (Amélioration du temps de
démarrage et d'exécution)
• 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
Copyright © BreizhJug
- 29. Parlez-en!
• Essayez-le!
• Utilisez-le!
• Faites du buzz!
Copyright © BreizhJug