GradleBuild Automation Evolved           1
Quem somos nozes?        2
Marcelo EmanoelConsultor na TriadWorks@marceloemanoel                3
Yuri AdamsEstagiário da TriadWorks@yuriadams                 4
TriadWorksConsultoriaTreinamentosMentoring               5
AutomatizaçãoSe a tarefa é repetitiva, AUTOMATIZE!Aumenta a qualidade do projetoAumenta a produtividade do time           ...
Cenário Atual      7
Cenário AtualFerramentas mais comuns: ANT MAVEN ANT + IVY                8
Pontos Positivos:    Ant + IvyControle total do buildFlexibilidadeDependências entre TargetsMuitas targets existentesGeren...
10
Pontos Fracos:     Ant + IvyAusência de ConvençõesExtremamente verbosoMais imperativo que descritivo               11
Pontos Positivos:     MavenConvenções invés de ConfiguraçõesLayout PadrãoSistema de PluginsBuilds Multi MódulosGerenciamen...
13
Pontos fracos:      MavenConvenções extremamente inflexíveisIntegração obrigatória no ciclo de buildFaz download da intern...
15
Foco em pontos positivos das demaisopçõesDSL de ProjetoVoltado para projetos baseados na JVMUtiliza Groovy                ...
Flexibilidade do AntGerenciamento de dependências estiloIvyConvenções inteligentes do MavenVelocidade e Hashing do GitPode...
SEM XML!   18
19
GradleConvenções, mas sempre com apossibilidade de configuraçãoGerenciamento de DependênciasIntegração com Ant e MavenPlug...
GradleFlexibilidadeDeclarativoDSL                  21
Convenções    22
23
Convenções    24
Gerenciamento de                        Dependênciasapply plugin: “java”                                                  ...
Gerenciamento de    DependênciasCompatibilidade com repositórios doMaven e IvyArquivos em discoCache                 26
Gerenciamento de           DependênciasRepositório Central do   repositories {                           mavenCentral()   ...
Gerenciamento de          Dependências               dependencies {                 compile(group:”br.com.caelum”,Repositó...
Gradle TasksMenor unidade de trabalho executadapelo buildSão objetosPossuem tiposFazem parte de um Grafo DirecionadoAcícli...
(30
Grafo Direcionado       AcíclicoPara qualquer vértice v, não há umaligação dirigida começando e terminandoem v            ...
Grafo Direcionado     Acíclico        32
)33
Gradle taskstask simpleTask << {  println “I am a simple task”}task simpleTasksimpleTask << {  println “Am I what?”}simple...
Gradle tasks                       Depends Ontask dependencyTask << {  println “I’m a dependency”}task dependentTask {    ...
Gradle tasks                       Depends Ontask dependencyTask << {  println “I’m a dependency”}task dependentTask(depen...
Gradle tasks                     Depends On                        Gradletask dependencyTask << {  println “I’m a dependen...
Gradle tasks                                    Task Types                 Gradle                                         ...
Gradle tasks                            Task Types        Gradle                                     ANTapply plugin: “jav...
PluginsFuncionalidades que interessamAdicionam novas Tasks, domain Objects,conventions e extendem os objetos docore e de o...
41
Aplicação de PluginsSão aplicados através do método applyda classe ProjectSomente uma vez                  42
Aplicação de Plugins  apply plugin: “java”  apply plugin: org.gradle.api.plugins.JavaPlugin  apply plugin: JavaPlugin     ...
Exemplos de Pluginsincluídos na API padrão Java               Maven War                EAR Jetty              Checkstyle A...
Outros PluginsAndroid                   TomcatAndroidAnnotations        MacAppBundleArtifactory               TemplatesCob...
Integração com o AntIntegração totalObjeto “       ant” expostoPossível importar um Build completo outasks individualmente...
Integração com o AntTargets da API padrão funcionam semnenhuma firulaTargets externos são facilmenteintegradosTargets pass...
Executando Targets Ant       no Gradle  task antEcho << {    ant.echo(message:”this is gradle calling an Ant target”)  }  ...
Executando Targets Ant           no Gradleconfigurations {  pmd}dependencies {  pmd “pmd:pmd:4.2.5”}task check << {  ant.t...
Importando um Build     completo     ant.importBuild “build.xml”                 50
Dependências entre          Target e Tasks<target name=”antEcho”>  <echo>This is Ant</echo></target>task hello(dependsOn:a...
GradleWrapperPermite a utilização do Gradle sem quepra isso seja preciso instalar o Gradle namáquinaPensado para utilizaçã...
GradleWrappertask generateWrapper(type:Wrapper) {  gradleVersion=”1.0-rc-3”}                    > gradle generateWrapper  ...
54
https://github.com/marceloemanoel/        vraptor-js-controller        > ./gradlew check jar                  55
56
Mas, eu não gosto de usar o terminal...         57
Mas, eu não gosto de usar o terminal...         57
Spring STS Gradle     Support        58
Spring STS Gradle       SupportImport WizardGerenciamento de Dependências(Semi-)AutomatizadoExtensão do Eclipse para Execu...
DocumentaçãoBuilding and Testing with Gradle (http://gradleware.com/registered-access?content=books/building-and-testing/)...
SuporteForum (http://forums.gradle.org/gradle)Gradleware (http://gradle.org/gradleware)                 61
Quem já usa?     62
Quem já usa?     62
Quem já usa?     62
Mais informações       63
Mais informaçõeshttp://gradle.org        63
Estamoscontratando     64
65
BUILD SUCCESSFUL                   66
Upcoming SlideShare
Loading in …5
×

Build Automation Evolved

1,360 views

Published on

Presentation at JavaCE Conference about Build Automation using Gradle.

Published in: Technology
1 Comment
3 Likes
Statistics
Notes
No Downloads
Views
Total views
1,360
On SlideShare
0
From Embeds
0
Number of Embeds
9
Actions
Shares
0
Downloads
4
Comments
1
Likes
3
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Build Automation Evolved

    1. 1. GradleBuild Automation Evolved 1
    2. 2. Quem somos nozes? 2
    3. 3. Marcelo EmanoelConsultor na TriadWorks@marceloemanoel 3
    4. 4. Yuri AdamsEstagiário da TriadWorks@yuriadams 4
    5. 5. TriadWorksConsultoriaTreinamentosMentoring 5
    6. 6. AutomatizaçãoSe a tarefa é repetitiva, AUTOMATIZE!Aumenta a qualidade do projetoAumenta a produtividade do time 6
    7. 7. Cenário Atual 7
    8. 8. Cenário AtualFerramentas mais comuns: ANT MAVEN ANT + IVY 8
    9. 9. Pontos Positivos: Ant + IvyControle total do buildFlexibilidadeDependências entre TargetsMuitas targets existentesGerenciamento de dependências 9
    10. 10. 10
    11. 11. Pontos Fracos: Ant + IvyAusência de ConvençõesExtremamente verbosoMais imperativo que descritivo 11
    12. 12. Pontos Positivos: MavenConvenções invés de ConfiguraçõesLayout PadrãoSistema de PluginsBuilds Multi MódulosGerenciamento de dependências 12
    13. 13. 13
    14. 14. Pontos fracos: MavenConvenções extremamente inflexíveisIntegração obrigatória no ciclo de buildFaz download da internet 14
    15. 15. 15
    16. 16. Foco em pontos positivos das demaisopçõesDSL de ProjetoVoltado para projetos baseados na JVMUtiliza Groovy 16
    17. 17. Flexibilidade do AntGerenciamento de dependências estiloIvyConvenções inteligentes do MavenVelocidade e Hashing do GitPoder da Metaprogramação do Groovy 17
    18. 18. SEM XML! 18
    19. 19. 19
    20. 20. GradleConvenções, mas sempre com apossibilidade de configuraçãoGerenciamento de DependênciasIntegração com Ant e MavenPluginsBuild multi projetos 20
    21. 21. GradleFlexibilidadeDeclarativoDSL 21
    22. 22. Convenções 22
    23. 23. 23
    24. 24. Convenções 24
    25. 25. Gerenciamento de Dependênciasapply plugin: “java” <?xml version=”1.0” encoding=”UTF-8”?>repositories { <ivy-module version=”2.0”> mavenCentral() <info organisation=”br.com.teste.ivy”} module=”teste-ivy”/>dependencies { <configurations> compile “br.com.caelum:vraptor:3.4.1” <conf name=”runtime”/> testCompile “junit:junit:4.10” <conf name=”test”/>} </configurations> <dependencies> <dependency<project xmlns=”http://maven.apache.org/POM/4.0.0” org=”br.com.caelum” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” name=”vraptor” xsi:schemaLocation=”http://maven.apache.org/POM/4.0.0 rev=”3.4.1” http://maven.apache.org/maven-v4_0_0.xsd”> conf=”runtime->default” />! <modelVersion>4.0.0</modelVersion> </dependencies> <groupId>GRUPO</groupId> </ivy-module> <artifactId>ATERFATO</artifactId> <packaging>war</packaging> <name>Nome</name> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>br.com.caelum</groupId> <artifactId>vraptor<artifactId> <version>3.4.1</version> <dependency> </dependencies> 25</project>
    26. 26. Gerenciamento de DependênciasCompatibilidade com repositórios doMaven e IvyArquivos em discoCache 26
    27. 27. Gerenciamento de DependênciasRepositório Central do repositories { mavenCentral() Maven: } Outro Repositório repositories { mavenRepo url: “http://maven.ow2.org/maven2/” Maven: } repositories { flatDir name: “repositorioEmDisco”, dirs: “lib”Repositório em Disco: flatDir dirs: [“WEB-INF/lib”, “outroDiretorio”] } 27
    28. 28. Gerenciamento de Dependências dependencies { compile(group:”br.com.caelum”,Repositório: name:”vraptor”, version:”3.4.1”) providedCompile “javax.servlet:servlet-api:2.5” } dependencies { Diretório: compile fileTree(dir:“${webAppDirName}/WEB-INF/lib”, include:”*.jar”) } dependencies { springModules.each { Código: } compile “org.springframework:${it}:3.1.0.RELEASE” } 28
    29. 29. Gradle TasksMenor unidade de trabalho executadapelo buildSão objetosPossuem tiposFazem parte de um Grafo DirecionadoAcíclico 29
    30. 30. (30
    31. 31. Grafo Direcionado AcíclicoPara qualquer vértice v, não há umaligação dirigida começando e terminandoem v 31
    32. 32. Grafo Direcionado Acíclico 32
    33. 33. )33
    34. 34. Gradle taskstask simpleTask << { println “I am a simple task”}task simpleTasksimpleTask << { println “Am I what?”}simpleTask << { println “I am a simple Task”} 34
    35. 35. Gradle tasks Depends Ontask dependencyTask << { println “I’m a dependency”}task dependentTask { task dependentTask { dependsOn “dependencyTask” dependsOn << dependencyTask} }task dependentTask { task dependentTask { dependsOn dependencyTask loadTask.dependsOn dependencyTask} } 35
    36. 36. Gradle tasks Depends Ontask dependencyTask << { println “I’m a dependency”}task dependentTask(dependsOn: dependencyTask) { doFirst {task loadTask(dependsOn: dependsTask) println “first” } doLast { println “last” }} 36
    37. 37. Gradle tasks Depends On Gradletask dependencyTask << { println “I’m a dependency”}task dependentTask(dependsOn: dependencyTask) ANT<target name=”dependencyTarget”> <echo>everybody depends on me to print anything</echo></target><target name=”dependentTarget” depends=”dependencyTarget”></target> 37
    38. 38. Gradle tasks Task Types Gradle ANTapply plugin: “java” <target name=”jar” depends=”compile”> <delete file=”hello.jar”/>task myJarTask(type: Jar) { <delete file=”MANIFEST.MF”/> manifest { <manifest file=”MANIFEST.MF”> attributes(BuiltBy: “firstValue”, <attribute name=”Built-By” MainClass: “howTo.Hello”) value=”${user.name}”/> } <attribute name=”Main-Class” archiveName: “hello.jar” value=”howto.Hello”/> destinationDir = file(“${buildDir}/jars”) </manifest> from sourceSets.main.classes} <jar destfile=”hello.jar” basedir=”.” includes=”**/*.class” manifest=”MANIFEST.MF” /> </target> 38
    39. 39. Gradle tasks Task Types Gradle ANTapply plugin: “java” <target name=”jar” depends=”compile”>apply plugin: “application” <delete file=”hello.jar”/>mainClassName = “howto.Hello” <delete file=”MANIFEST.MF”/> <manifest file=”MANIFEST.MF”> <attribute name=”Built-By” value=”${user.name}”/> <attribute name=”Main-Class” value=”howto.Hello”/> </manifest> <jar destfile=”hello.jar” basedir=”.” includes=”**/*.class” manifest=”MANIFEST.MF” /> </target> 39
    40. 40. PluginsFuncionalidades que interessamAdicionam novas Tasks, domain Objects,conventions e extendem os objetos docore e de outros pluginsImplementam a interface Plugin 40
    41. 41. 41
    42. 42. Aplicação de PluginsSão aplicados através do método applyda classe ProjectSomente uma vez 42
    43. 43. Aplicação de Plugins apply plugin: “java” apply plugin: org.gradle.api.plugins.JavaPlugin apply plugin: JavaPlugin 43
    44. 44. Exemplos de Pluginsincluídos na API padrão Java Maven War EAR Jetty Checkstyle Application Sonar Groovy Scala Eclipse Antlr 44
    45. 45. Outros PluginsAndroid TomcatAndroidAnnotations MacAppBundleArtifactory TemplatesCobertura UbuntuPackagerClojure JSLintGwt 45
    46. 46. Integração com o AntIntegração totalObjeto “ ant” expostoPossível importar um Build completo outasks individualmenteTargets como cidadãos de 1ª classe 46
    47. 47. Integração com o AntTargets da API padrão funcionam semnenhuma firulaTargets externos são facilmenteintegradosTargets passam a ser tratados comoTasks do Gradle 47
    48. 48. Executando Targets Ant no Gradle task antEcho << { ant.echo(message:”this is gradle calling an Ant target”) } task antEcho << { ant.echo ”this is gradle calling an Ant target” } :antEcho [ant:echo] this is gradle calling an Ant target BUILD SUCCESSFUL 48
    49. 49. Executando Targets Ant no Gradleconfigurations { pmd}dependencies { pmd “pmd:pmd:4.2.5”}task check << { ant.taskdef(name:”pmd”, classname:”net.sourceforge.pmd.ant.PMDTask”, classpath: configurations.pmd.asPath) ant.pmd(shortFilenames: “true”, failonruleviolation: “true”, rulesetfiles: file(“pmd-rules.xml”).toURI().toString()) { formatter(type:”text”, toConsole:”true”) fileset(dir:”src”) })} 49
    50. 50. Importando um Build completo ant.importBuild “build.xml” 50
    51. 51. Dependências entre Target e Tasks<target name=”antEcho”> <echo>This is Ant</echo></target>task hello(dependsOn:antEcho) << { println “and this is Gradle”} > gradle hello :antEcho [ant:echo] This is Ant and this is Gradle BUILD SUCCESSFUL 51
    52. 52. GradleWrapperPermite a utilização do Gradle sem quepra isso seja preciso instalar o Gradle namáquinaPensado para utilização em ser vidoresde integração contínua 52
    53. 53. GradleWrappertask generateWrapper(type:Wrapper) { gradleVersion=”1.0-rc-3”} > gradle generateWrapper :generateWrapper BUILD SUCCESSFULprojeto/ gradlew gradlew.bat gradle/wrapper/ gradle-wrapper.jar gradle-wrapper.properties 53
    54. 54. 54
    55. 55. https://github.com/marceloemanoel/ vraptor-js-controller > ./gradlew check jar 55
    56. 56. 56
    57. 57. Mas, eu não gosto de usar o terminal... 57
    58. 58. Mas, eu não gosto de usar o terminal... 57
    59. 59. Spring STS Gradle Support 58
    60. 60. Spring STS Gradle SupportImport WizardGerenciamento de Dependências(Semi-)AutomatizadoExtensão do Eclipse para Execução deTasks do Gradle 59
    61. 61. DocumentaçãoBuilding and Testing with Gradle (http://gradleware.com/registered-access?content=books/building-and-testing/)User Guide (http://gradle.org/docs/current/userguide/userguide_single.html)DSL Reference (http://gradle.org/docs/current/dsl/index.html)Tutoriais (http://gradle.org/docs/current/userguide/tutorials.html) 60
    62. 62. SuporteForum (http://forums.gradle.org/gradle)Gradleware (http://gradle.org/gradleware) 61
    63. 63. Quem já usa? 62
    64. 64. Quem já usa? 62
    65. 65. Quem já usa? 62
    66. 66. Mais informações 63
    67. 67. Mais informaçõeshttp://gradle.org 63
    68. 68. Estamoscontratando 64
    69. 69. 65
    70. 70. BUILD SUCCESSFUL 66

    ×