Gradle_BreizJUG

649 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
649
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Gradle_BreizJUG

  1. 1. GRADLE Grégory Boissinot 13/09/2010Copyright © BreizhJug
  2. 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++, ADACopyright © BreizhJug
  3. 3. Pourquoi un outil de plus? •  La nature des besoins a changé – Augmentation des besoins dautomatisation – Un build peut faire beaucoup plus de choses que la simple création dune archive JavaCopyright © BreizhJug
  4. 4. Evolution des outils 2000 2005 2008 1ère génération 2ème génération 3ème génération 2 3 1Copyright © BreizhJug
  5. 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 existanteCopyright © BreizhJug
  6. 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 resourcesCopyright © BreizhJug
  7. 7. On ne peut pas anticiper tous les besoins des projetsCopyright © BreizhJug
  8. 8. Un langage de build configurations repositories build.gradle dependencies Project ant task artifacts APICopyright © BreizhJug
  9. 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 dextension •  Fourniture de ses propres élémentsCopyright © BreizhJug
  10. 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. 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. 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 ConfigurationCopyright © BreizhJug
  13. 13. Performance •  Gestion multi-projet avancée •  Utilisation dun cache •  Exécution parallèle des testsCopyright © BreizhJug
  14. 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. 15. Utilisation dun 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 :myzipCopyright © BreizhJug
  16. 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
  17. 17. Haut niveau de contrôleCopyright © BreizhJug
  18. 18. Introspecter et manipuler un build CONFIGURATION PHASE t1 t2 t3 t1 t2 t3 EXECUTION PHASE t4 t4 HOOKGRADLESCRIPT Project Project Engine Convention 1 Convention 2gradle –-properties version = 1.0gradle –-tasks –-all gradle.taskGraph.whenReady{taskGraph ->gradle –-dependencies if (!taskGraph.hasTask(:release)){gradle –-dry-run build version+=-SNAPSHOT } }Copyright © BreizhJug
  19. 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. 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. 21. Une boîte à outils pour une insertion dans lexistantCopyright © BreizhJug
  22. 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. 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 GradleCopyright © BreizhJug
  24. 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 IvyCopyright © BreizhJug
  25. 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 MavenCopyright © BreizhJug
  26. 26. Qui utilise Gradle en 2010? gmock spcok securityCopyright © BreizhJug
  27. 27. Roadmap •  Nouveau DSL de gestion des dépendances •  Build Daemon (Amélioration du temps de démarrage et dexécution) •  Introduction de modèles de JVM basés sur la nature des applications •  Fourniture dun DSL de composition du build •  Amélioration du DSL du graphe des tâches •  Réutilisation possible des plugins MavenCopyright © BreizhJug
  28. 28. dans lavenir ...Copyright © BreizhJug
  29. 29. Parlez-en! •  Essayez-le! •  Utilisez-le! •  Faites du buzz!Copyright © BreizhJug

×