Slide 1

Slide 1 text

Introduction to Gradle Gasol Wu 2012/9/15

Slide 2

Slide 2 text

Who am I • Work at KKBOX • http://github.com/Gasol • Twitter @gasolwu

Slide 3

Slide 3 text

Build System History 3 2 +

Slide 4

Slide 4 text

The Problem is ... !

Slide 5

Slide 5 text

<fileset dir="${srcTest}"> 4.0.0 grId coc-comparison jar 1.0-SNAPSHOT commons-lang commons-lang 2.5 junit junit 4.8.1 test 1.6 1.6 apply plugin: 'java' version="1.0-SNAPSHOT" group="grId" archivesBaseName="coc-comparison" repositories { mavenCentral() } dependencies { compile 'commons-lang:commons-lang:2.5' testCompile 'junit:junit:4.8.1' } 2 http://kaczanowscy.pl/tomek/2010-11/build-script-length-maven3-polyglot-maven-gradle-ant

Slide 6

Slide 6 text

Size Comparison Size Comparison Size Comparison chars lines Ant 1733 102 Maven 2 904 31 Gradle 224 17

Slide 7

Slide 7 text

• Quite verbose • Expressiveness of XML is limited • It’s hard to trace

Slide 8

Slide 8 text

So, What We Really Want?

Slide 9

Slide 9 text

• Easy to customize and extend • Abstraction and structuring

Slide 10

Slide 10 text

A Better Way To Build!

Slide 11

Slide 11 text

Gradle • Ease of migration • Declarative builds and build-by-convention • Rich DSL based on Groovy • Leverage both Ant and Maven • Gradle Wrapper

Slide 12

Slide 12 text

Gradle is Groovy Groovy is Java

Slide 13

Slide 13 text

// build.gradle System.out.println(“Java Way”); 4.times { print it }

Slide 14

Slide 14 text

> gradle Java Way 0 1 2 3 :help Welcome to Gradle 1.2. To run a build, run gradle ... To see a list of available tasks, run gradle tasks To see a list of command-line options, run gradle --help BUILD SUCCESSFUL Total time: 2.454 secs

Slide 15

Slide 15 text

Task task myTask task myTask { configure closure } task myType << { task action } task myTask(type: SomeType) task myTask(type: SomeType) { configure closure}

Slide 16

Slide 16 text

Hello World // build.gradle task hello { doLast { println ‘Hello World!’ } } > gradle -q hello Hello World!

Slide 17

Slide 17 text

A shortcut task definition task hello << { println ‘Hello World!’ }

Slide 18

Slide 18 text

Build scripts are code task upper << { String someString = ‘mY_nAmE’ println “Original: $someString“ println “Upper: “ + someString.toUpperCase() } > gradle -q upper Original: mY_nAmE Upper: MY_NAME

Slide 19

Slide 19 text

Groovy in Gradle’s tasks task count << { 4.times { print “$it “ } } > gradle -q count 0 1 2 3

Slide 20

Slide 20 text

Task dependencies task hello << { println ‘Hello World’ } task intro(dependsOn: hello) << { println “I’m Gradle” } > gradle -q intro Hello World! I’m Gradle

Slide 21

Slide 21 text

Lazy dependsOn task X(dependsOn: ‘Y’) << { println ‘X’ } task Y << { println ‘Y’ } > gradle -q X Y X

Slide 22

Slide 22 text

Dynamic tasks 4.times { counter -> task “task$counter” << { println “I’m task number $counter” } } > gradle -q task1 I’m task number 1

Slide 23

Slide 23 text

Default tasks defaultTasks ‘clean’, ‘run’ task clean << { println ‘Default Cleaning!’ } task run << { println ‘Default Running!’ } task other << { println “I’m not a default task!” } > gradle -q Default Cleaning! Default Running!

Slide 24

Slide 24 text

Configure by DAG task distribution << { println "We build the zip with version=$version" } task release(dependsOn: 'distribution') << { println 'We release now' } gradle.taskGraph.whenReady { if (it.hasTask(release)) { version = '1.0' } else { version = '1.0-SNAPSHOT' } }

Slide 25

Slide 25 text

Build Phases • Initialization • Configuration • The build scripts of all projects which are part of the build are executed. • Execution

Slide 26

Slide 26 text

Build phases (cont.) // settings.gradle println ‘initialization phase’ // build.gradle println ‘configuration phase’ task configured { println ‘configuration phase’ } task test << { println ‘execution phase’ }

Slide 27

Slide 27 text

Build phases (output) > gradle test initialization phase initialization phase execution phase :test BUILD SUCCESSFUL Total time: 1 secs

Slide 28

Slide 28 text

Ant are first class citizens // build.xml // build.gradle ant.importBuild ‘build.xml’ task hello(dependsOn: helloFromAnt) << { println ‘Hello ‘ + ant.gradleName }

Slide 29

Slide 29 text

Ant are first class citizens (cont.) > gradle tasks --all /* skip */ Other tasks ---------- hello helloFromAnt > gradle hello :helloFromAnt [ant:echo] Hello Ant! :hello Hello Gradle BUILD SUCCESSFUL Total time: 2.015 secs

Slide 30

Slide 30 text

A basic Java project apply plugin: ‘java’

Slide 31

Slide 31 text

Directory Structure By Default . ├── build.gradle └── src ├── main │ ├── java │ └── resources └── test ├── java └── resources sourceSets { main { java { srcDir ‘src/main/java’ } resources { srcDir ‘src/main/resources’ } } test { java { srcDir ‘src/test/java’ } resources { srcDir ‘src/test/resources’ } } }

Slide 32

Slide 32 text

> gradle build :compileJava :processResources :classes :jar :assemble :compileTestJava :processTestResources :testClasses :test :check :build BUILD SUCCESSFUL Total time: 1 secs

Slide 33

Slide 33 text

External Dependencies repositories { mavenCetral() } dependencies { compile group: ‘common-collections’, name: ‘common- collections’, version: ‘3.2’ testCompile ‘junit:junit:4.+’ }

Slide 34

Slide 34 text

More dependencies dependencies { compile project(':shared') compile files('libs/a.jar', 'libs/b.jar') runtime fileTree(dir: 'libs', include: '*.jar') compile gradleApi() groovy localGroovy() }

Slide 35

Slide 35 text

More repositories repositories { mavenCentral() mavenLocal() maven { url "http://repo.mycompany.com/maven2" } ivy { url "http://repo.mycompany.com/maven2" layout "maven" credentials { username 'user' password 'password' } } }

Slide 36

Slide 36 text

Customising Project apply plugin: 'java' apply plugin: 'maven' apply plugin: 'eclipse' sourceCompatibility = 1.5 version = '1.0' jar { manifest { attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version } } repositories { mavenCentral() } dependencies { compile 'commons-collections:commons-collections:3.2' testCompile 'junit:junit:4.+' } uploadArchives { repositories.mavenDeployer { repository(url: 'file://localhost/tmp/repo') } }

Slide 37

Slide 37 text

> tree -C /tmp/repo/ /tmp/repo/ └── quickstart └── quickstart ├── 1.0 │ ├── quickstart-1.0.jar │ ├── quickstart-1.0.jar.md5 │ ├── quickstart-1.0.jar.sha1 │ ├── quickstart-1.0.pom │ ├── quickstart-1.0.pom.md5 │ └── quickstart-1.0.pom.sha1 ├── maven-metadata.xml ├── maven-metadata.xml.md5 └── maven-metadata.xml.sha1 3 directories, 9 files

Slide 38

Slide 38 text

Standard Gradle Plugins • java, groovy, scala, antlr, cpp*, cpp-exe*, cpp-lib* • announce, application, ear, jetty, maven, osgi, war, maven2Gradle • checkstyle, codearc, eclipse, ecilpse-wtp, findbugs, idea, jdepend, pmd, project-report, signing, sonar

Slide 39

Slide 39 text

Multi-Project? http://gradle.org/docs/current/userguide/ multi_project_builds.html

Slide 40

Slide 40 text

Demo • gradle-android-plugin • Writing my own plugin • git://github.com/Gasol/intro-to-gradle.git

Slide 41

Slide 41 text

Links • http://gradle.org/docs/current/userguide/ userguide.html • https://speakerdeck.com/u/bmuschko/p/ next-generation-builds-with-gradle-1

Slide 42

Slide 42 text

http://gradleware.com/registered/books/building-and-testing/

Slide 43

Slide 43 text

Thanks :)

Slide 44

Slide 44 text

Question?