Top Banner
GRADLE IN 45MIN Schalk Cronjé
49

Gradle in 45min

Apr 16, 2017

Download

Software

Schalk Cronjé
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Gradle in 45min

GRADLE IN 45MINSchalk Cronjé

Page 2: Gradle in 45min

ABOUT ME

Email:

Twitter / Ello : @ysb33r

[email protected]

Gradle plugins authored/contributed to: VFS, Asciidoctor,JRuby family (base, jar, war etc.), GnuMake, Doxygen

Page 3: Gradle in 45min

GET YOUR DAILY GRADLE DOSE

@DailyGradle

#gradleTip

Page 4: Gradle in 45min

GRADLEA next generation build-and-deploy

pipeline tool

Page 5: Gradle in 45min

MOST TRIVIAL JAVA PROJECT

apply plugin: 'java'

Will look for sources under src/main/java

Page 6: Gradle in 45min

JAVA PROJECT

repositories { jcenter() }

apply plugin : 'java'

dependencies { testCompile 'junit:junit:4.1' }

Page 7: Gradle in 45min

GRADLE DEPENDENCYMANAGEMENT

Easy to use

Flexible to configure for exceptions

Uses dependencies closure

First word on line is usually name of a configuration.

Configurations are usually supplied by plugins.

Dependencies are downloaded from repositories

Maven coordinates are used as format

Page 8: Gradle in 45min

GRADLE REPOSITORIES

Specified within a repositories closure

Processed in listed order to look for dependencies

jcenter() preferred open-source repo.

mavenLocal(), mavenCentral(), maven {}

Ivy repositories via ivy {}

Flat-directory repositories via flatDir

Page 9: Gradle in 45min

GRADLE REPOSITORIES

repositories { jcenter() mavenCentral() maven { url "https://plugins.gradle.org/m2/" } }

repositories { ivy { url 'file://path/to/repo' layout 'pattern', { artifact '[module]/[revision]/[artifact](.[ext])' ivy '[module]/[revision]/ivy.xml' } } }

Page 10: Gradle in 45min

GRADLE DSLUnderlying language is Groovy

You don’t need to be a Groovy expert to be a Gradle poweruser

Groovy doesn’t need ; in most cases

Groovy does more with less punctuation, making it anideal choice for a DSL

In most cases lines that do not end on an operator isconsidered a completed statement.

Page 11: Gradle in 45min

GROOVY VS JAVA

In Groovy:

All class members are public by default

No need to create getters/setters for public fields

Both static & dynamic typing supported

def means Object

Page 12: Gradle in 45min

CALLING METHODSclass Foo { void bar( def a,def b ) {} }

def foo = new Foo()

foo.bar( '123',456 ) foo.bar '123', 456

foo.with { bar '123', 456 }

Page 13: Gradle in 45min

CALLING METHODS WITH CLOSURESclass Foo { void bar( def a,Closure b ) {} }

def foo = new Foo()

foo.bar( '123',{ println it } )

foo.bar ('123') { println it }

foo.bar '123', { println it }

Page 14: Gradle in 45min

MAPS IN GROOVY

Hashmaps in Groovy are simple to use

def myMap = [ plugin : 'java' ]

Maps are easy to pass inline to functions

project.apply( plugin : 'java' )

Which in Gradle can become

apply plugin : 'java'

Page 15: Gradle in 45min

LISTS IN GROOVY

Lists in Groovy are simple too

def myList = [ 'clone', ''http://github.com/ysb33r/GradleLectures' ]

This makes it possible for Gradle to do

args 'clone', 'http://github.com/ysb33r/GradleLectures'

Page 16: Gradle in 45min

CLOSURE DELEGATION IN GROOVY

When a symbol cannot be resolved within a closure,Groovy will look elsewhere

In Groovy speak this is called a Delegate.

This can be programmatically controlled via theClosure.delegate property.

Page 17: Gradle in 45min

CLOSURE DELEGATION IN GROOVY

class Foo { def target }

class Bar { Foo foo = new Foo() void doSomething( Closure c ) { c.delegate = foo c() } }

Bar bar = new Bar() bar.doSomething { target = 10 }

Page 18: Gradle in 45min

MORE CLOSURE MAGIC

If a Groovy class has a method 'call(Closure)`, the object canbe passed a closure directly.

class Foo { def call( Closure c) { /* ... */ } }

Foo foo = new Foo() foo {

println 'Hello, world'

}

// This avoids ugly syntax foo.call({ println 'Hello, world' })

Page 19: Gradle in 45min

CLOSURE DELEGATION IN GRADLE

In most cases the delegation will be entity the closure ispassed to.

Will also look at the Project and ext objects.

The Closure.delegate property allows plugin writersability to create beautiful DSLs

task runSomething(type : Exec ) { cmdline 'git' }

is roughly the equivalent ofExecTask runSomething = new ExecTask() runSomething.cmdline( 'git' )

Page 20: Gradle in 45min

GRADLE TASKSCan be based upon a task type

task runSomething ( type : Exec ) {

command 'git'

args 'clone', 'https://bitbucket.com/ysb33r/GradleWorkshop'

}

Can be free-formtask hellowWorld << {

println 'Hello, world'

}

Page 21: Gradle in 45min

GRADLE TASKS : CONFIGURATION VS

ACTION

Use of << {} adds action to be executed

Tasks supplied by plugin will have default actions

Use of {} configures a task

Page 22: Gradle in 45min

BUILDSCRIPTThe buildscript closure is special

It tells Gradle what to load into the classpath beforeevaluating the script itself.

It also tells it where to look for those dependencies.

Even though Gradle 2.1 has added a new way of addingexternal plugins, buildscript are much more flexible.

Page 23: Gradle in 45min

EXTENSIONS

Extensions are global configuration blocks added byplugins.

Example: The jruby-gradle-base plugin will add ajruby block.

apply plugin: 'com.github.jruby-gradle.base'

jruby { defaultVersion = '1.7.11' }

Page 24: Gradle in 45min

GRADLE COMMAND-LINE

gradle -v gradle -h gradle tasks gradle tasks --info

Page 25: Gradle in 45min

GRADLE WRAPPERUse wrapper where possible:

Eliminates need to install Gradle in order to build project

Leads to more reproducible builds

gradle wrapper --wrapper-version 2.12

./gradlew tasks

Page 26: Gradle in 45min

EXECUTING TASKS./gradlew <taskName1> <taskName2> ...

./gradlew build

Page 27: Gradle in 45min

DEPENDENCIESExamine dependencies involved with various configurations

./gradlew dependencies

Page 28: Gradle in 45min

SUPPORT FOR OTHER JVMLANGUAGES

Page 29: Gradle in 45min

GROOVY PROJECT

repositories { jcenter() }

apply plugin : 'groovy'

dependencies { compile 'org.codehaus.groovy:groovy-all:2.4.3'

testCompile ('org.spockframework:spock-core:1.0-groovy-2.4') { exclude module : 'groovy-all' } }

Page 30: Gradle in 45min

SCALA PROJECT

repositories { jcenter() }

apply plugin : 'scala'

dependencies { compile 'org.scala-lang:scala-library:2.11.8' }

Page 31: Gradle in 45min

BUILDING KOTLIN

plugins { id "com.zoltu.kotlin" version "1.0.1" }

dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib:1.0.1-1"

}

Page 32: Gradle in 45min

RUNNING JRUBYplugins {

id 'com.github.jruby-gradle.base' version '1.2.1'

}

import com.github.jrubygradle.JRubyExec

dependencies {

jrubyExec "rubygems:colorize:0.7.7"

}

task printSomePrettyOutputPlease(type: JRubyExec) {

description "Execute our nice local print-script.rb"

script "${projectDir}/print-script.rb"

}

(Example from JRuby-Gradle project)

Page 33: Gradle in 45min

OTHER LANGUAGESC++ / C / ASM / Resources (built-in)

Clojure (plugin)

Frege (plugin)

Golang (plugin)

Gosu (plugin)

Mirah (plugin in progress)

Page 34: Gradle in 45min

SUPPORT FOR OTHERBUILDSYSTEMS

ANT (built-in)

GNU Make

MSBuild / xBuild

Grunt, Gulp

Anything else cra�able via Exec or JavaExec task

Page 35: Gradle in 45min

BUILDING DOCUMENTATION

Javadoc, Groovydoc, Scaladoc (built-in)

Doxygen (C, C++) (plugin)

Markdown (plugin)

Asciidoctor (plugin)

Page 36: Gradle in 45min

BUILDING WITH ASCIIDOCTORplugins { id 'org.asciidoctor.convert' version '1.5.2' }

Page 37: Gradle in 45min

BUILDING WITH ASCIIDOCTORrepositories { jcenter() }

asciidoctor { sources { include 'example.adoc' }

backends 'html5'

}

Page 38: Gradle in 45min

PUBLISHING

Built-in to Maven, Ivy

Metadata publishing for native projects still lacking

Various plugins for AWS and other cloud storage

Plain old copies to FTP, SFTP etc.

Page 39: Gradle in 45min

MORE SUPPORT…

Official buildsystem for Android

Docker

Hadoop

Page 40: Gradle in 45min

TOUR DE FORCE

Build a distributable application packaged as as ZIP

Runnable via shell script or batch file

Contains classes written Java, Groovy & Kotlin source

Test source code with Spock Framework

Page 41: Gradle in 45min

TOUR DE FORCE

plugins { id 'java' id 'groovy' id 'com.zoltu.kotlin' version '1.0.1' id 'application' }

repositories { jcenter() }

dependencies { compile 'org.codehaus.groovy:groovy-all:2.4.3' compile 'org.jetbrains.kotlin:kotlin-stdlib:1.0.1-1' testCompile 'org.spockframework:spock-core:1.0-groovy-2.4' }

version = '1.0' mainClassName = "gradle.workshop.HelloJava"

compileGroovy.dependsOn compileKotlin

Page 42: Gradle in 45min

ENDGAMEGradle is breaking new ground

Ever improving native support

Continuous performance improvements

Go find some more plugins at https://plugins.gradle.org

Page 43: Gradle in 45min

ABOUT THIS PRESENTATIONWritten in Asciidoctor

Styled by asciidoctor-revealjs extension

Built using:

Gradle

gradle-asciidoctor-plugin

gradle-vfs-plugin

Code snippets tested as part of build

Source code:https://github.com/ysb33r/GradleLectures/tree/MkJugMar2016

Page 44: Gradle in 45min

THANK YOU

Email:

Twitter / Ello : @ysb33r

#idiomaticgradle

[email protected]

https://leanpub.com/idiomaticgradle

Page 45: Gradle in 45min

MIGRATIONS

Page 46: Gradle in 45min

ANT TO GRADLE

Reflect Ant Build into Gradleant.importBuild('build.xml')

Page 47: Gradle in 45min

MAVEN TO GRADLE

Go to directory where pom.xml is and typegradle init --type pom

Page 48: Gradle in 45min

USEFUL STUFF

Page 49: Gradle in 45min

PUBLISHING VIA VFS

plugins { id "org.ysb33r.vfs" version "1.0-beta3" }

task publishToWebserver << {

vfs { cp "${buildDir}/website", "ftp://${username}:${password}@int.someserver.com/var/www", recursive : true, overwrite : true } }