Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
#jbcn2016 JBCN 2016 © S1
GRADLE IN 45MIN
Schalk Cronjé
ABOUT ME
Email:
Twitter / Ello : @ysb33r
ysb33r@gmail.com
Gradle plugins authored/contributed to: VFS, Asciidoctor,
JRuby ...
2
GET YOUR DAILY GRADLE DOSE
@DailyGradle
#gradleTip
3
 
4 . 1
SDKMAN
Manages parallel version of multiple SDKs
Mostly for (but not limited to) JVM-related systems
Windows users c...
4 . 2
SDKMAN
SdkMan:
Posh-GVM:
@sdkmanager
http://sdkman.io
https://github.com/ ofreud/posh-gvm
4 . 3
5
GRADLE
A next generation build-and-deploy pipeline
tool
6 . 1
MOST TRIVIAL JAVA PROJECT
apply plugin: 'java'
Will look for sources under src/main/java
6 . 2
JAVA PROJECT
repositories {
jcenter()
}
apply plugin : 'java'
dependencies {
testCompile 'junit:junit:4.1'
}
GRADLE DEPENDENCY MANAGEMENT
Easy to use
Flexible to con gure for exceptions
Uses dependencies closure
First word on line ...
7 . 1
GRADLE REPOSITORIES
Speci ed within a repositories closure
Processed in listed order to look for dependencies
jcente...
7 . 2
GRADLE REPOSITORIES
repositories {
jcenter()
mavenCentral()
maven { url "https://plugins.gradle.org/m2/" }
}
reposit...
7 . 3
GRADLE DSL
Underlying language is Groovy
You don’t need to be a Groovy expert to be a Gradle power
user
Groovy doesn...
8 . 1
GROOVY VS JAVA
In Groovy:
All class members are public by default
No need to create getters/setters for public elds
...
8 . 2
CALLING METHODS
class Foo {
void bar( def a,def b ) {}
}
def foo = new Foo()
foo.bar( '123',456 )
foo.bar '123', 456...
8 . 3
CALLING METHODS WITH CLOSURES
class Foo {
void bar( def a,Closure b ) {}
}
def foo = new Foo()
foo.bar( '123',{ prin...
8 . 4
MAPS IN GROOVY
Hashmaps in Groovy are simple to use
def myMap = [ plugin : 'java' ]
Maps are easy to pass inline to ...
8 . 5
LISTS IN GROOVY
Lists in Groovy are simple too
def myList = [ 'clone', ''http://github.com/ysb33r/GradleLectures' ]
...
8 . 6
CLOSURE DELEGATION IN GROOVY
When a symbol cannot be resolved within a closure,
Groovy will look elsewhere
In Groovy...
8 . 7
CLOSURE DELEGATION IN GROOVY
class Foo {
def target
}
class Bar {
Foo foo = new Foo()
void doSomething( Closure c ) ...
8 . 8
MORE CLOSURE MAGIC
If a Groovy class has a method 'call(Closure)`, the object can
be passed a closure directly.
clas...
8 . 9
CLOSURE DELEGATION IN GRADLE
In most cases the delegation will be entity the closure is
passed to.
Will also look at...
8 . 10
GRADLE TASKS
Can be based upon a task type
task runSomething ( type : Exec ) {
command 'git'
args 'clone', 'https:/...
9 . 1
9 . 2
GRADLE TASKS : CONFIGURATION VS ACTION
Use of << {} adds action to be executed
Tasks supplied by plugin will h...
BUILDSCRIPT
The buildscript closure is special
It tells Gradle what to load into the classpath before
evaluating the scrip...
10
EXTENSIONS
Extensions are global con guration blocks added by
plugins.
Example: The jruby-gradle-base plugin will add a...
11
12 . 1
GRADLE COMMAND-LINE
gradle -v
gradle -h
gradle tasks
gradle tasks --info
GRADLE WRAPPER
Use wrapper where possible:
Eliminates need to install Gradle in order to build project
Leads to more repro...
12 . 2
12 . 3
EXECUTING TASKS
./gradlew <taskName1> <taskName2> ...
./gradlew build
DEPENDENCIES
Examine dependencies involved with various con gurations
./gradlew dependencies
12 . 4
13 . 1
SUPPORT FOR OTHER JVM LANGUAGES
GROOVY PROJECT
repositories {
jcenter()
}
apply plugin : 'groovy'
dependencies {
compile 'org.codehaus.groovy:groovy-all:2...
13 . 2
13 . 3
SCALA PROJECT
repositories {
jcenter()
}
apply plugin : 'scala'
dependencies {
compile 'org.scala-lang:scala...
13 . 4
BUILDING KOTLIN
plugins {
id "com.zoltu.kotlin" version "1.0.1"
}
dependencies {
compile "org.jetbrains.kotlin:kotl...
RUNNING JRUBY
plugins {
id 'com.github.jruby-gradle.base' version '1.2.1'
}
import com.github.jrubygradle.JRubyExec
depend...
13 . 5
OTHER LANGUAGES
C++ / C / ASM / Resources (built-in)
Clojure (plugin)
Frege (plugin)
Golang (plugin)
Gosu (plugin)
...
14
SUPPORT FOR OTHER BUILDSYSTEMS
ANT (built-in)
GNU Make
MSBuild / xBuild
Grunt, Gulp
Anything else craftable via Exec or...
15
BUILDING DOCUMENTATION
Javadoc, Groovydoc, Scaladoc (built-in)
Doxygen (C, C++) (plugin)
Markdown (plugin)
Asciidoctor ...
16 . 1
16 . 2
BUILDING WITH ASCIIDOCTOR
plugins {
id 'org.asciidoctor.convert' version '1.5.2'
}
BUILDING WITH ASCIIDOCTOR
repositories {
jcenter()
}
asciidoctor {
sources {
include 'example.adoc'
}
backends 'html5'
}
16 . 3
PUBLISHING
Built-in to Maven, Ivy
Metadata publishing for native projects still lacking
Various plugins for AWS and...
17
18
MORE SUPPORT…
Of cial buildsystem for Android
Docker
Hadoop
TOUR DE FORCE
Build a distributable application packaged as as ZIP
Runnable via shell script or batch le
Contains classes ...
19 . 1
TOUR DE FORCE
plugins {
id 'java'
id 'groovy'
id 'com.zoltu.kotlin' version '1.0.1'
id 'application'
}
repositories...
19 . 2
ENDGAME
Gradle is breaking new ground
Ever improving native support
Continuous performance improvements
Go nd some ...
20
ABOUT THIS PRESENTATION
Written in Asciidoctor
Styled by asciidoctor-revealjs extension
Built using:
Gradle
gradle-asci...
21
WRITING PLUGINS?
https://leanpub.com/b/idiomaticgradle
22
THANK YOU
Email:
Twitter / Ello : @ysb33r
#idiomaticgradle
ysb33r@gmail.com
(Just in-case you need a buildtool consulta...
23
24 . 1
MIGRATIONS
24 . 2
ANT TO GRADLE
Re ect Ant Build into Gradle
ant.importBuild('build.xml')
24 . 3
MAVEN TO GRADLE
Go to directory where pom.xml is and type
gradle init --type pom
25 . 1
USEFUL STUFF
PUBLISHING VIA VFS
plugins {
id "org.ysb33r.vfs" version "1.0"
}
task publishToWebserver << {
vfs {
cp "${buildDir}/websit...
Upcoming SlideShare
Loading in …5
×

Gradle in 45min - JBCN2-16 version

714 views

Published on

Introduction to Gradle in 45min as done at JBCN 2016. Covers the basics of Gradle for people familiar with other build tools. Includes building Java, Scala, Groovy & Kotlin projects

Published in: Software
  • Be the first to comment

Gradle in 45min - JBCN2-16 version

  1. 1. #jbcn2016 JBCN 2016 © S1 GRADLE IN 45MIN Schalk Cronjé
  2. 2. ABOUT ME Email: Twitter / Ello : @ysb33r ysb33r@gmail.com Gradle plugins authored/contributed to: VFS, Asciidoctor, JRuby family (base, jar, war etc.), GnuMake, Doxygen
  3. 3. 2 GET YOUR DAILY GRADLE DOSE @DailyGradle #gradleTip
  4. 4. 3  
  5. 5. 4 . 1 SDKMAN Manages parallel version of multiple SDKs Mostly for (but not limited to) JVM-related systems Windows users can use Posh-GVM (Powershell) Windows 10 Bash ?? curl -s http://get.sdkman.io | bash
  6. 6. 4 . 2 SDKMAN SdkMan: Posh-GVM: @sdkmanager http://sdkman.io https://github.com/ ofreud/posh-gvm
  7. 7. 4 . 3 5 GRADLE A next generation build-and-deploy pipeline tool
  8. 8. 6 . 1 MOST TRIVIAL JAVA PROJECT apply plugin: 'java' Will look for sources under src/main/java
  9. 9. 6 . 2 JAVA PROJECT repositories { jcenter() } apply plugin : 'java' dependencies { testCompile 'junit:junit:4.1' }
  10. 10. GRADLE DEPENDENCY MANAGEMENT Easy to use Flexible to con gure for exceptions Uses dependencies closure First word on line is usually name of a con guration. Con gurations are usually supplied by plugins. Dependencies are downloaded from repositories Maven coordinates are used as format
  11. 11. 7 . 1 GRADLE REPOSITORIES Speci ed 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
  12. 12. 7 . 2 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' } } }
  13. 13. 7 . 3 GRADLE DSL Underlying language is Groovy You don’t need to be a Groovy expert to be a Gradle power user Groovy doesn’t need ; in most cases Groovy does more with less punctuation, making it an ideal choice for a DSL In most cases lines that do not end on an operator is considered a completed statement.
  14. 14. 8 . 1 GROOVY VS JAVA In Groovy: All class members are public by default No need to create getters/setters for public elds Both static & dynamic typing supported def means Object
  15. 15. 8 . 2 CALLING METHODS class Foo { void bar( def a,def b ) {} } def foo = new Foo() foo.bar( '123',456 ) foo.bar '123', 456 foo.with { bar '123', 456 }
  16. 16. 8 . 3 CALLING METHODS WITH CLOSURES class 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 }
  17. 17. 8 . 4 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'
  18. 18. 8 . 5 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'
  19. 19. 8 . 6 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 the Closure.delegate property.
  20. 20. 8 . 7 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 }
  21. 21. 8 . 8 MORE CLOSURE MAGIC If a Groovy class has a method 'call(Closure)`, the object can be 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' })
  22. 22. 8 . 9 CLOSURE DELEGATION IN GRADLE In most cases the delegation will be entity the closure is passed to. Will also look at the Project and ext objects. The Closure.delegate property allows plugin writers ability to create beautiful DSLs task runSomething(type : Exec ) { cmdline 'git' } is roughly the equivalent of ExecTask runSomething = new ExecTask() runSomething.cmdline( 'git' )
  23. 23. 8 . 10 GRADLE TASKS Can be based upon a task type task runSomething ( type : Exec ) { command 'git' args 'clone', 'https://bitbucket.com/ysb33r/GradleWorkshop' } Can be free-form task hellowWorld << { println 'Hello, world' }
  24. 24. 9 . 1 9 . 2 GRADLE TASKS : CONFIGURATION VS ACTION Use of << {} adds action to be executed Tasks supplied by plugin will have default actions Use of {} con gures a task
  25. 25. BUILDSCRIPT The buildscript closure is special It tells Gradle what to load into the classpath before evaluating the script itself. It also tells it where to look for those dependencies. Even though Gradle 2.1 has added a new way of adding external plugins, buildscript are much more exible.
  26. 26. 10 EXTENSIONS Extensions are global con guration blocks added by plugins. Example: The jruby-gradle-base plugin will add a jruby block. apply plugin: 'com.github.jruby-gradle.base' jruby { defaultVersion = '1.7.11' }
  27. 27. 11 12 . 1 GRADLE COMMAND-LINE gradle -v gradle -h gradle tasks gradle tasks --info
  28. 28. GRADLE WRAPPER Use 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
  29. 29. 12 . 2 12 . 3 EXECUTING TASKS ./gradlew <taskName1> <taskName2> ... ./gradlew build
  30. 30. DEPENDENCIES Examine dependencies involved with various con gurations ./gradlew dependencies
  31. 31. 12 . 4 13 . 1 SUPPORT FOR OTHER JVM LANGUAGES
  32. 32. 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' } }
  33. 33. 13 . 2 13 . 3 SCALA PROJECT repositories { jcenter() } apply plugin : 'scala' dependencies { compile 'org.scala-lang:scala-library:2.11.8' }
  34. 34. 13 . 4 BUILDING KOTLIN plugins { id "com.zoltu.kotlin" version "1.0.1" } dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib:1.0.1-1" }
  35. 35. RUNNING JRUBY plugins { 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)
  36. 36. 13 . 5 OTHER LANGUAGES C++ / C / ASM / Resources (built-in) Clojure (plugin) Frege (plugin) Golang (plugin) Gosu (plugin) Ceyon (plugin) Mirah (plugin)
  37. 37. 14 SUPPORT FOR OTHER BUILDSYSTEMS ANT (built-in) GNU Make MSBuild / xBuild Grunt, Gulp Anything else craftable via Exec or JavaExec task
  38. 38. 15 BUILDING DOCUMENTATION Javadoc, Groovydoc, Scaladoc (built-in) Doxygen (C, C++) (plugin) Markdown (plugin) Asciidoctor (plugin)
  39. 39. 16 . 1 16 . 2 BUILDING WITH ASCIIDOCTOR plugins { id 'org.asciidoctor.convert' version '1.5.2' }
  40. 40. BUILDING WITH ASCIIDOCTOR repositories { jcenter() } asciidoctor { sources { include 'example.adoc' } backends 'html5' }
  41. 41. 16 . 3 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.
  42. 42. 17 18 MORE SUPPORT… Of cial buildsystem for Android Docker Hadoop
  43. 43. TOUR DE FORCE Build a distributable application packaged as as ZIP Runnable via shell script or batch le Contains classes written Java, Groovy & Kotlin source Test source code with Spock Framework
  44. 44. 19 . 1 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
  45. 45. 19 . 2 ENDGAME Gradle is breaking new ground Ever improving native support Continuous performance improvements Go nd some more plugins at https://plugins.gradle.org
  46. 46. 20 ABOUT THIS PRESENTATION Written 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/Jbcn2016
  47. 47. 21 WRITING PLUGINS? https://leanpub.com/b/idiomaticgradle
  48. 48. 22 THANK YOU Email: Twitter / Ello : @ysb33r #idiomaticgradle ysb33r@gmail.com (Just in-case you need a buildtool consultant)
  49. 49. 23 24 . 1 MIGRATIONS
  50. 50. 24 . 2 ANT TO GRADLE Re ect Ant Build into Gradle ant.importBuild('build.xml')
  51. 51. 24 . 3 MAVEN TO GRADLE Go to directory where pom.xml is and type gradle init --type pom
  52. 52. 25 . 1 USEFUL STUFF
  53. 53. PUBLISHING VIA VFS plugins { id "org.ysb33r.vfs" version "1.0" } task publishToWebserver << { vfs { cp "${buildDir}/website", "ftp://${username}:${password}@int.someserver.com/var/www", recursive : true, overwrite : true } }

×