Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Gradlin': Nuts and Bolts

NeiL saitug
September 21, 2014

Gradlin': Nuts and Bolts

Etsy loves Gradle. We use it for all our builds, and have it integrated with our Jenkins / CI jobs to run all of our tests, lints, builds, update version numbers, and deploy our internal releases.

Everyone should love Gradle. This talk will get the audience acquainted with the Groovy/Gradle DSL, and then move into some really sweet ways you can clean up and reuse your build code (for multiproject builds and plugins).

What this talk will cover:
- Groovy basics: closures, filtering, variable declaration, classes
- Gradle primitives: files, tasks, configurations
- Gradle execution phases: configuration and execution

Given at DroidCon NYC 2014 on Sept 21.
http://nyc.droidcon.com/2014/dcnyc/21/

NeiL saitug

September 21, 2014
Tweet

More Decks by NeiL saitug

Other Decks in Programming

Transcript

  1. Things not covered in this talk: » Task dependencies »

    Manipulating Files » Build Graph Hooks » The Android Plugin » Multiproject Build Logic » Plugins
  2. Groovy: A dynamic, static, strongly, duck typed language that is

    imperative, object-oriented, functional, and scripting. It runs on the Java Virtual Machine.
  3. Groovy: A dynamic, static, strongly, duck typed language that is

    imperative, object-oriented, functional, and scripting. It runs on the Java Virtual Machine.
  4. Java: for (String it : new String[] { "Erin", "Jan",

    "Taylor" }) { if (it.length() >= 4) { System.out.println(it); } }
  5. Java: for (String it : new String[] { "Erin", "Jan",

    "Taylor" }) { if (it.length() >= 4) { System.out.println(it); } } Groovy: ["Erin", "Jan", "Taylor"].findAll{ it.size() >= 4 }.each{ println it }
  6. Fancy Groovy Features » Syntax » Null Checks » Dynamic

    Typing » GStrings » Arrays » Closures » Objects
  7. ;

  8. GStrings Java: int amount = 4563; String yourBill = "You

    owe me " + amount; String.format("You owe me %d", amount);
  9. GStrings Java: String.format("On %s the %s of %s %s paid

    $%d to %s", dayOfWeek, day, month, payee, amountPaid, richMan);
  10. GStrings Groovy: def amount = 4563 def yourBill = "You

    owe me $amount" def fancyAmount = [4,5,6,3] def yourBill = "You owe me ${ fancyAmount.join() }"
  11. GStrings Groovy: def amount = 4563 def yourBill = "You

    owe me $amount" def fancyAmount = [4,5,6,3] def yourBill = "You owe me ${ fancyAmount.join() }" def yourBill = "You owe me \$${ fancyAmount.join() }"
  12. GStrings Groovy: String string = “On $dayOfWeek the $day of

    $month” + “ $payee paid \$$amountPaid to $richMan”
  13. Arrays ["Erin", "Jan", "Taylor" ].size() ["Erin", "Jan", "Taylor" ].get(1) ["Erin",

    "Jan", "Taylor" ][1] for (String string : [ "Erin", "Jan", "Taylor" ]) { println string.length() }
  14. Arrays ["Erin", "Jan", "Taylor" ].size() ["Erin", "Jan", "Taylor" ].get(1) ["Erin",

    "Jan", "Taylor" ][1] for (String string : [ "Erin", "Jan", "Taylor" ]) { println string.length() } ["Erin", "Jan", "Taylor" ].each { println it.length() }
  15. Closures Java: int[] ints = new int[] { 1, 2,

    3, 4, 5, 6, 7, 8, 9}; int[] odds = new OddFinder().findOdds(ints);
  16. Closures Groovy: list = [1, 2, 3, 4, 5, 6,

    7, 8, 9] def odds = list.findAll { it % 2 } assert odds == [1, 3, 5, 7, 9]
  17. Closures Groovy: \\ Abbreviated with it { it % 2

    } \\ Long form { number -> number % 2 }
  18. Groovy Objects Groovy: class AGroovyObject { String color } def

    myGroovyObject = new AGroovyObject() myGroovyObject.setColor('blue') assert myGroovyObject.getColor() == 'blue' myGroovyObject.color = 'fuschia' assert myGroovyObject.color == 'fuschia'
  19. Ain’t it Groovy? » Syntax » Null Checks » Dynamic

    Typing » GStrings » Arrays » Closures » Objects
  20. Gradle: Gradle is a project automation tool that builds upon

    the concepts of Apache Ant and Apache Maven and introduces a Groovy-based domain-specific language (DSL) instead of the more traditional XML form of declaring the project configuration.
  21. The task is the core building block of a build

    action. » Build an Android Project $ ./gradlew assemble
  22. The task is the core building block of a build

    action. » Build an Android Project $ ./gradlew assemble » Show me all the Tasks in a project $ ./gradlew tasks
  23. :tasks ------------------------------------------------------------ All tasks runnable from root project ------------------------------------------------------------ Android

    tasks ------------- androidDependencies - Displays the Android dependencies of the project signingReport - Displays the signing info for each variant Build tasks ----------- assemble - Assembles all variants of all applications and secondary packages. assembleDebug - Assembles all Debug builds assembleDebugTest - Assembles the Test build for the Debug build assembleRelease - Assembles all Release builds build - Assembles and tests this project. ...
  24. Groovy / Gradle: task hello { doLast { println "Hello

    DroidConNYC!" } } Run: $ ./gradlew hello
  25. Groovy: task hello2 << { println "Hello Again!” } task

    brokenHello { println "Hello -- Too Soon!!" }
  26. Task Actions » Tasks are just a set of “actions”,

    which are closures » Three ways to add an Action (closure) to a task: » doFirst {} » doLast {} » leftShift {} / <<
  27. Groovy: class ExpandoClass { def propertyMissing(String name) { println "Missing

    property $name" } def backingMap = [:] Object getProperty( String property ) { if( backingMap[ property ] == null ) { propertyMissing( property ) } else { backingMap[ property ] } } void setProperty( String property, Object value ) { backingMap[ property ] = value } }
  28. Properties project.ext.prop1 = "foo" task doStuff { ext.prop2 = "bar"

    } if (project.hasProperty['prop1’]) { // Do something }
  29. Properties /** * Adds release signing properties to build if

    * proper properties are present */ if (project.hasProperty('alias') && project.hasProperty('keystore') && project.hasProperty('keyPassword') && project.hasProperty('storePassword')) { project.android.signingConfigs.release.storeFile project.file(project.keystore) project.android.signingConfigs.release.keyAlias project.alias project.android.signingConfigs.release.storePassword = project.storePassword project.android.signingConfigs.release.keyPassword = project.keyPassword } else { project.android.buildTypes.release.signingConfig = null }
  30. Further Reading: » Gradle Beyond the Basics http://chimera.labs.oreilly.com/books/ 1234000001741/ch01.html »

    Extensive Gradle API documentation at gradle.org » Gradle Plugin User Guide - Android Tools Project Site http://tools.android.com/tech-docs/new-build- system/user-guide