SlideShare a Scribd company logo
Gradle
The
Enterprise Automation
Tool
● SA at EPAM Systems
● primary skill is Java
● hands-on-coding with Groovy, Ruby
● exploring FP with Erlang/Elixir
● passionate about agile, clean code and devops
Agenda
● Introduction
● Gradle
● Step by step by features
● Alternatives
● References
● Q&A
Introduction
Build tools usage trend
Gradle  - the Enterprise Automation Tool
Continuous Integration
Principles
#1 Each change auto. built and deployed
#2 Test on closed to prod environment
Principles
#1 Each change auto. built and deployed
#2 Test on closed to prod environment
#1 Each change auto. built and deployed
#3 Integrate as frequently as possible
Principles
#2 Test on closed to prod environment
#1 Each change auto. built and deployed
#3 Integrate as frequently as possible
Principles
#4 The highest priority is to fix failed build
Benefits
● Each change guarantees working code
● Each update should guarantee working
code ;)
● There is no delay for epic merge
● Less bugs - depends on your tests
efficiency*
● Allows to have code ready to go live
Challenges
● Need to build infrastructure
● Need to build team culture
● Need to support/enhance infrastructure
● Overhead with writing different kinds of
tests
Continuous D*
Principles
#1 Every commit should result in a release
Principles
#1 Every commit should result in a release
#2 Automated tests are essential
Principles
#1 Every commit should result in a release
#2 Automated tests are essential
#3 Automate everything!
Principles
#1 Every commit should result in a release
#2 Automated tests are essential
#3 Automate everything!
#4 Done means release/live in prod
Benefits
● Speed of delivery of business idea to
customer
● Easy going live deployment
● Less time spent on delivery - more profit
● More motivation to do more as you can
see what you can change/improve
Challenges
● Big effort to implement changes for:
○ database increment/rollback
○ infrastructure rollout/rollback
○ decrease down time …
● Need to get customers to buy in
● Security policies
Gradle
2.14.1
Gradle
- General purpose build system
Gradle
- General purpose build system
- Comes with a rich DSL based on Groovy
Gradle
- General purpose build system
- Comes with a rich DSL based on Groovy
- Follows ”build-by-convention” principles
Gradle
- General purpose build system
- Comes with a rich DSL based on Groovy
- Follows ”build-by-convention” principles
- Built-in plug-ins for JVM languages, etc
Gradle
- General purpose build system
- Comes with a rich DSL based on Groovy
- Follows ”build-by-convention” principles
- Built-in plug-ins for JVM languages, etc
- Derives all the best from Ivy, Ant & Maven
Features
1. JDK 8
2. Gradle 2.2+
3. Git
Prerequisites
1. Change directory to D:ImagesGradle folder
2. Open Command Window in dir D:ImagesGradle
3. Execute
​ Gitbingit clone
https://github.com/webdizz/sbs-gradle.git
4. Change directory to sbs-gradle
5. Execute
set_env.bat
gradle -v
java -version
#0 Installation
Groovy is under the hood
1. Reset code base to initial state
git reset --hard 3a2ed47
git clean -df​
2. Create file build.gradle
3. Type
​ println 'Hello, World!​​​​​​​​​​​'​
4. Run
gradle
#1 Hello World!
Declarative
1. Run to see default tasks list
gradle tasks
2. Replace build.gradle file content with
​ apply plugin: 'java'​
3. Run to see new available tasks
gradle tasks
4. Checkout step s3_apply_plugin
5. Run to build Java source code
gradle build
6. Explore directory build
#2 Create simple build
Flexible Execution
1. Run task with part of name
gradle ta
2. Run task with part of name to clean and compile
​ gradle cle tC
3. Run task with part of name to clean and compile and
exclude processTestResources
gradle cle tC -x pTR
4. Get details for task
gradle -q help --task clean
#3 Execute tasks
1. Run task
gradle tasks
2. Run task to generate wrapper
​ gradle wrapper
3. Run tasks using wrapper
./gradlew tasks
4. Customize task wrapper to use another Gradle version
​task wrapper(type: Wrapper) {
gradleVersion = '2.2.1'
}​
5. Check Gradle version
./gradlew -v
#4 Use wrapper
Multi-module Structure
1. Checkout step s5_prepare
2. Add directory common
3. Move src to common
4. Create common/build.gradle for Java
5. Add new module to settings.gradle
include ':common'​
6. Run build
./gradlew clean build
7. Run task for module
./gradlew :com:compJ
#5 Create multi-module build
Dependency Management
Gradle
- compile - to compile source
Gradle
- compile - to compile source
- runtime - required by classes at runtime
Gradle
- compile - to compile source
- runtime - required by classes at runtime
- testCompile - to compile test sources
Gradle
- compile - to compile source
- runtime - required by classes at runtime
- testCompile - to compile test sources
- testRuntime - required to run the tests
1. Add repositories to download dependencies from to
build.gradle
allprojects { currProject ->
repositories {
mavenLocal()
mavenCentral()
jcenter()
maven {url 'http://repo.mycompany.com/’}
}
}​
#6 Dependencies
1. Add common dependencies for all subprojects in
build.gradle
subprojects {
apply plugin: 'java'
dependencies {
compile 'org.slf4j:slf4j-api:1.7.7'
testCompile
'org.mockito:mockito-core:1.10.19',
'junit:junit:4.12'
}
}​
#6.1 Dependencies
1. Add dependencies for concrete module in
common/build.gradle
dependencies {
compile
'org.projectlombok:lombok:1.14.4'
}​
#6.2 Dependencies
1. List project dependencies
./gradlew :common:dependencies
#6.3 Dependencies
Configuration
1. Extract common configuration parameters to gradle
.properties file
lombokVersion = 1.14.4
build.gradle file
dependencies {
compile
“org.projectlombok:lombok:$lombokVersion”
}​
#7 Configuration
1. Parameterise execution for custom task :printParameter
in build.gradle
task printParameter {
println givenParameter
}​
2. Add parameter default value to gradle.properties
3. Execute task
./gradlew -q :printParameter -PgivenParameter=hello
#7.1 Configuration
Rich API
#8 Rich API
● Lifecycle
● Create a Settings instance for the build.
● Evaluate the settings.gradle script, if present, against the Settings
object to configure it.
● Use the configured Settings object to create the hierarchy of Project
instances.
● Finally, evaluate each Project by executing its build.gradle file, if
present, against the project. The project are evaluated in such order
that a project is evaluated before its child projects.
● Tasks
● A project is essentially a collection of Task objects.
● Each task performs some basic piece of work.
● Dependencies
● A project generally has a number of dependencies.
● Project generally produces a number of artifacts, which other projects
can use.
● Plugins
● Plugins can be used to modularise and reuse project configuration.
● Properties
● Any property or method which your script uses is delegated through to
the associated Project object.
● A project has 5 property 'scopes'.
● Dynamic Methods
● A project has 5 method 'scopes'.
More Tests
1. Add integration test source sets in file
gradle/integTest.gradle
sourceSets {
integTest {
compileClasspath += main.output + test.output
runtimeClasspath += main.output + test.output
}
}
#8.1 Rich API
2. Add integration test configurations in file
gradle/integTest.gradle
configurations {
integTestCompile.extendsFrom testCompile
integTestRuntime.extendsFrom testRuntime
}
3. Include extension for subprojects in file build.gradle
apply from:
file("${rootProject.projectDir}/gradle/integ
Test.gradle")​
#8.1 Rich API
3. Add integration test task in file gradle/integTest.gradle
task integTest(type: Test){
testClassesDir =
sourceSets.integTest.output.classesDir
classpath =
sourceSets.integTest.runtimeClasspath
shouldRunAfter 'test'
}
check.dependsOn(integTest)
4. Execute integration tests
./gradlew integTest
#8.1 Rich API
1. Open build.gradle to add dependency for one task
from another
​ printParameter.dependsOn 'help'​
2. Run printParameter task
./gradlew printParameter
#8.2 Tasks Dependencies
1. Open build.gradle to add ordering for one task from
another
task areTestsExist {
if ([
file("${projectDir}/src/test/java").listFiles()
].isEmpty()) {
println 'Test directory is empty'
} else {
println 'Test directory is not empty, will
execute tests'
}
}
test.mustRunAfter areTestsExist
#8.3 Tasks Ordering*
2. Run test task
./gradlew test
#8.3 Tasks Ordering*
1. Add rule to validate running of integration tests task
tasks.addRule('Check correctness of running tests'){ String
taskName ->
gradle.taskGraph.whenReady{
Map<String, String> args =
gradle.startParameter.systemPropertiesArgs
gradle.taskGraph.allTasks.each { Task task ->
if (task.name.contains('integTest') &&
!args.containsKey('profile')) {
throw new
org.gradle.api.tasks.StopExecutionException("Profile was not
specified to run tests (-Dprofile=ci).")
}
}
}
}
#8.4 Rules
2. Run check task to have failure
./gradlew check
3. Run check task with expected parameter
./gradlew check -Dprofile=ci
​
#8.4 Rules
Parallel Execution
1. Switch to 9th step and execute next command
./gradlew test --parallel
2. Try to modify amount of executable threads
./gradlew test --parallel --parallel-threads=3
​
#9 Parallel builds
Incremental Builds
1. Create file gradle/releaseNotes.gradle to add task for
release notes
ext.destDir = new File(buildDir, 'releaseNotes')
ext.releaseNotesTemplate = file('releaseNotes.tmpl.txt')
tasks.create(name: 'copyTask', type: org.gradle.api.tasks.Copy) {
from releaseNotesTemplate
into destDir
doFirst {
if (!destDir.exists()) {
destDir.mkdir()
}
}
rename { String fileName ->
fileName.replace('.tmpl', '')
}
}
#10 Custom Inputs/Outputs
tasks.create('releaseNotes') {
inputs.file copyTask
outputs.dir destDir
}
2. Add releaseNotes.tmpl.txt file as a template for release
notes
3. Apply configuration from gradle/releaseNotes.gradle in
build.gradle
4. Let’s run releaseNotes task
./gradlew releaseNotes
#10 Custom Inputs/Outputs
1. Enhance release notes task to prepare nice release notes file
​
ext.changesFile = file('changes.txt')
ext.bugs = []
ext.features = []
changesFile.eachLine { String line ->
String bugSymbol = '#bug:'
String featureSymbol = '#feature:'
if (line.contains(bugSymbol)) {
bugs << line.replace(bugSymbol, '')
} else if (line.contains(featureSymbol)) {
features << line.replace(featureSymbol, '')
}
}
filter(org.apache.tools.ant.filters.ReplaceTokens,
tokens: [bugs: bugs.join("n"),
features: features.join("n")])​
#10.1 Files filtering
Test Coverage
1. Add JaCoCo configuration in gradle/coverage.gradle
apply plugin: "jacoco"
jacoco {
toolVersion = "0.7.7.201606060606"
}
check.dependsOn jacocoTestReport
jacocoTestReport {
dependsOn 'test'
reports {
xml.enabled true
csv.enabled false
html.enabled true
}
}
#11 Test Coverage
2. Apply configuration from gradle/coverage.gradle in
build.gradle
3. Implement proper test for proper method
4. Let’s run check task to collect coverage metrics
./gradlew check -Dprofile=ci
5. Open
common/build/reports/jacoco/test/html/index.html file
to overview coverage
#11 Test Coverage
1. Add JaCoCo configuration in gradle/coverage.gradle for
integration tests
​task jacocoIntegrationTestReport(type: JacocoReport) {
dependsOn integTest
sourceSets sourceSets.main
executionData integTest
reports {
xml {
enabled true
destination
"$buildDir/reports/jacoco/integTest/jacocoIntegTestReport.xml"
}
csv.enabled false
html {
destination "$buildDir/reports/jacoco/integTest/html"
}
}
}
#11.1 Integration Test Coverage
check.dependsOn jacocoIntegrationTestReport
jacocoIntegrationTestReport.mustRunAfter jacocoTestReport
2. Let’s run check task to collect coverage metrics for
integration tests as well
./gradlew check -Dprofile=ci
​
#11.1 Integration Test Coverage
Static Code Analysis
Ad-hoc,
fast
feedback
Ad-hoc,
fast
feedback
Over
time
1. Add configuration in gradle/codeQuality.gradle for code
quality analysis and apply configuration in build.gradle
subprojects {
apply plugin: 'findbugs'
findbugs {
ignoreFailures = true
toolVersion = '3.0.0'
}
apply plugin: 'pmd'
pmd {
toolVersion = '5.1.3'
}
}
​
#12 Static Code Analysis
2. Let’s run check task to collect code quality metrics
./gradlew check -Dprofile=ci
3. Open common/build/reports/pmd|findbugs/*.html
​
​
#12 Static Code Analysis
Artefacts Publishing
1. Add configuration in gradle/publishing.gradle for artefacts
publishing and apply configuration in build.gradle
apply plugin: 'maven-publish'
publishing {
repositories {
maven {
url
"http://artifactory.vagrantshare.com/artifactory/libs-release-local"
credentials {
username 'admin'
password 'password'
}
}
}
publications {
mavenJava(MavenPublication) {
groupId "name.webdizz.${rootProject.name}"
version = uploadVersion
from components.java
}
}
}
#13 Artefacts Publishing
2. Let’s run publish task to publish artefacts
./gradlew publish -PuploadVersion=1.1.1.[YourName]
3. Check artefact was uploaded at
http://artifactory.vagrantshare.com/artifactory
​
​
#13 Artefacts Publishing
Plugable Architecture
● Build script
Visible for build file
● buildSrc/src/main/groovy
Visible for project
● Standalone project
Could be shared between projects using binary artefact
1. Create file PluginsPrinterPlugin.groovy in
buildSrc/src/main/groovy
​import org.gradle.api.Plugin
import org.gradle.api.Project
public class PluginsPrinterPlugin implements Plugin<Project> {
void apply(Project project) {
project.task('printPlugins') << {
println 'Current project has next list of plugins:'
ext.plugins = project.plugins.collect { plugin ->
plugin.class.simpleName
}
println plugins
}
}
}
#14 Plugins Printer
2. Apply plugin for all projects in build.gradle file
allprojects {
apply plugin: PluginsPrinterPlugin
}
3. Let’s run printPlugins task to print plugins activated for
project
./gradlew printPlugins
​
​
#14 Plugins Printer
Alternatives
- build
like you
code
- a software
project
management
and
comprehension
tool
References
● http://www.gradle.org/
● http://www.gradle.org/books
● https://plugins.gradle.org/
● http://groovy-lang.org/
● https://github.com/webdizz/sbs-gradle
● https://nebula-plugins.github.io/
References
Q&A
Gradle  - the Enterprise Automation Tool
Izzet Mustafayev@EPAM Systems
@webdizz webdizz izzetmustafaiev
http://webdizz.name

More Related Content

PDF
Gradle Introduction
PDF
Introduction to gradle
PPTX
Building with Gradle
PPTX
PPTX
JVM++: The Graal VM
PDF
An Introduction to Gradle for Java Developers
PPTX
An introduction to Maven
PPTX
Jenkins CI
Gradle Introduction
Introduction to gradle
Building with Gradle
JVM++: The Graal VM
An Introduction to Gradle for Java Developers
An introduction to Maven
Jenkins CI

What's hot (20)

PPT
Maven Introduction
ODP
Java 9 Features
PDF
Spring Boot
PDF
Jenkins Pipelines
PDF
Continuous Integration/Deployment with Gitlab CI
PDF
Git & Github for beginners
PPTX
Jenkins tutorial for beginners
PPTX
Vagrant
PPTX
Jenkins CI presentation
PPTX
Trunk Based Development in the Enterprise - Its Relevance and Economics
PPTX
Spring Cloud Config
PDF
Git-flow workflow and pull-requests
PPTX
Maven tutorial
PPTX
Git - Basic Crash Course
PDF
GraalVM Native and Spring Boot 3.0
PDF
Git flow Introduction
PDF
SpringOne Tour: Spring Boot 3 and Beyond
PPTX
Exploring the power of Gradle in android studio - Basics & Beyond
PDF
Painless JavaScript Testing with Jest
PDF
Kubernetes
Maven Introduction
Java 9 Features
Spring Boot
Jenkins Pipelines
Continuous Integration/Deployment with Gitlab CI
Git & Github for beginners
Jenkins tutorial for beginners
Vagrant
Jenkins CI presentation
Trunk Based Development in the Enterprise - Its Relevance and Economics
Spring Cloud Config
Git-flow workflow and pull-requests
Maven tutorial
Git - Basic Crash Course
GraalVM Native and Spring Boot 3.0
Git flow Introduction
SpringOne Tour: Spring Boot 3 and Beyond
Exploring the power of Gradle in android studio - Basics & Beyond
Painless JavaScript Testing with Jest
Kubernetes
Ad

Viewers also liked (20)

PDF
Gradle by Example
PDF
Gradle - time for a new build
PDF
Gradle in 45min
PDF
Intro to CI/CD using Docker
ODP
Gradle: The Build System you have been waiting for!
PDF
Javaone - Gradle: Harder, Better, Stronger, Faster
PDF
Gradle enabled android project
PDF
Gradle presentation
PDF
Gradle build tool that rocks with DSL JavaOne India 4th May 2012
PDF
Making a small QA system with Docker
PDF
What's New in Docker 1.13?
PPTX
Building with Gradle
PDF
Git,Travis,Gradle
PDF
Gradle
PDF
Android Gradle about using flavor
PPTX
From Ant to Maven to Gradle a tale of CI tools for JVM
PDF
Why gradle
ODP
Captain Agile and the Providers of Value
PDF
Alpes Jug (29th March, 2010) - Apache Maven
Gradle by Example
Gradle - time for a new build
Gradle in 45min
Intro to CI/CD using Docker
Gradle: The Build System you have been waiting for!
Javaone - Gradle: Harder, Better, Stronger, Faster
Gradle enabled android project
Gradle presentation
Gradle build tool that rocks with DSL JavaOne India 4th May 2012
Making a small QA system with Docker
What's New in Docker 1.13?
Building with Gradle
Git,Travis,Gradle
Gradle
Android Gradle about using flavor
From Ant to Maven to Gradle a tale of CI tools for JVM
Why gradle
Captain Agile and the Providers of Value
Alpes Jug (29th March, 2010) - Apache Maven
Ad

Similar to Gradle - the Enterprise Automation Tool (20)

PDF
Make Your Build Great Again (DroidConSF 2017)
PDF
Gradle
PDF
Gradle - Build System
PDF
Gradle - Build system evolved
PPTX
Gradle : An introduction
PDF
ICONUK 2015 - Gradle Up!
PDF
Why Gradle?
PDF
North Virginia Coldfusion User Group Meetup - Testbox - July 19th 2017
PDF
What's new in Gradle 4.0
PDF
OpenCms Days 2012 - Developing OpenCms with Gradle
PPTX
Faster java ee builds with gradle [con4921]
PPTX
Faster Java EE Builds with Gradle
PPTX
Faster Java EE Builds with Gradle
ODP
Eclipse Buildship JUG Hamburg
PDF
Keeping your build tool updated in a multi repository world
PPTX
Gradle 2.Write once, builde everywhere
PPTX
Gradle 2.breaking stereotypes.
PPTX
Gradle,the new build system for android
PDF
10 Cool Facts about Gradle
PPTX
7 maven vsgradle
Make Your Build Great Again (DroidConSF 2017)
Gradle
Gradle - Build System
Gradle - Build system evolved
Gradle : An introduction
ICONUK 2015 - Gradle Up!
Why Gradle?
North Virginia Coldfusion User Group Meetup - Testbox - July 19th 2017
What's new in Gradle 4.0
OpenCms Days 2012 - Developing OpenCms with Gradle
Faster java ee builds with gradle [con4921]
Faster Java EE Builds with Gradle
Faster Java EE Builds with Gradle
Eclipse Buildship JUG Hamburg
Keeping your build tool updated in a multi repository world
Gradle 2.Write once, builde everywhere
Gradle 2.breaking stereotypes.
Gradle,the new build system for android
10 Cool Facts about Gradle
7 maven vsgradle

More from Izzet Mustafaiev (20)

PDF
Overcome a Frontier
PDF
Web Security... Level Up
PDF
Kotlin strives for Deep Learning
PDF
Can I do AI?
PDF
Consumer-Driven Contracts to enable API evolution
PDF
Functional web with elixir and elm in phoenix
PDF
Fabric8 CI/CD
PPTX
Don’t let your code to be illiterate along with your colleagues
PDF
Performance testing for web-scale
PDF
[Szjug] Docker. Does it matter for java developer?
PDF
Fault tolerance - look, it's simple!
PDF
µServices Architecture @ EPAM WOW 2015
PDF
Continuous Development Pipeline
PDF
Docker. Does it matter for Java developer ?
PDF
Microservices Architecture
PDF
“Bootify your app - from zero to hero
PDF
Metrics by coda hale : to know your app’ health
PDF
Buildr - build like you code
PDF
Groovy MOPping
PDF
TDD with Spock @xpdays_ua
Overcome a Frontier
Web Security... Level Up
Kotlin strives for Deep Learning
Can I do AI?
Consumer-Driven Contracts to enable API evolution
Functional web with elixir and elm in phoenix
Fabric8 CI/CD
Don’t let your code to be illiterate along with your colleagues
Performance testing for web-scale
[Szjug] Docker. Does it matter for java developer?
Fault tolerance - look, it's simple!
µServices Architecture @ EPAM WOW 2015
Continuous Development Pipeline
Docker. Does it matter for Java developer ?
Microservices Architecture
“Bootify your app - from zero to hero
Metrics by coda hale : to know your app’ health
Buildr - build like you code
Groovy MOPping
TDD with Spock @xpdays_ua

Recently uploaded (20)

PDF
Navsoft: AI-Powered Business Solutions & Custom Software Development
PDF
top salesforce developer skills in 2025.pdf
PPTX
CHAPTER 2 - PM Management and IT Context
PDF
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
PDF
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
PDF
Understanding Forklifts - TECH EHS Solution
PPTX
Online Work Permit System for Fast Permit Processing
PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
PDF
Nekopoi APK 2025 free lastest update
PDF
Design an Analysis of Algorithms II-SECS-1021-03
PDF
Design an Analysis of Algorithms I-SECS-1021-03
PPT
Introduction Database Management System for Course Database
PDF
Softaken Excel to vCard Converter Software.pdf
PDF
System and Network Administraation Chapter 3
PDF
Wondershare Filmora 15 Crack With Activation Key [2025
PPTX
history of c programming in notes for students .pptx
PPTX
Operating system designcfffgfgggggggvggggggggg
PDF
Odoo Companies in India – Driving Business Transformation.pdf
PDF
PTS Company Brochure 2025 (1).pdf.......
PDF
medical staffing services at VALiNTRY
Navsoft: AI-Powered Business Solutions & Custom Software Development
top salesforce developer skills in 2025.pdf
CHAPTER 2 - PM Management and IT Context
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
Understanding Forklifts - TECH EHS Solution
Online Work Permit System for Fast Permit Processing
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
Nekopoi APK 2025 free lastest update
Design an Analysis of Algorithms II-SECS-1021-03
Design an Analysis of Algorithms I-SECS-1021-03
Introduction Database Management System for Course Database
Softaken Excel to vCard Converter Software.pdf
System and Network Administraation Chapter 3
Wondershare Filmora 15 Crack With Activation Key [2025
history of c programming in notes for students .pptx
Operating system designcfffgfgggggggvggggggggg
Odoo Companies in India – Driving Business Transformation.pdf
PTS Company Brochure 2025 (1).pdf.......
medical staffing services at VALiNTRY

Gradle - the Enterprise Automation Tool

  • 2. ● SA at EPAM Systems ● primary skill is Java ● hands-on-coding with Groovy, Ruby ● exploring FP with Erlang/Elixir ● passionate about agile, clean code and devops
  • 3. Agenda ● Introduction ● Gradle ● Step by step by features ● Alternatives ● References ● Q&A
  • 8. Principles #1 Each change auto. built and deployed
  • 9. #2 Test on closed to prod environment Principles #1 Each change auto. built and deployed
  • 10. #2 Test on closed to prod environment #1 Each change auto. built and deployed #3 Integrate as frequently as possible Principles
  • 11. #2 Test on closed to prod environment #1 Each change auto. built and deployed #3 Integrate as frequently as possible Principles #4 The highest priority is to fix failed build
  • 12. Benefits ● Each change guarantees working code ● Each update should guarantee working code ;) ● There is no delay for epic merge ● Less bugs - depends on your tests efficiency* ● Allows to have code ready to go live
  • 13. Challenges ● Need to build infrastructure ● Need to build team culture ● Need to support/enhance infrastructure ● Overhead with writing different kinds of tests
  • 15. Principles #1 Every commit should result in a release
  • 16. Principles #1 Every commit should result in a release #2 Automated tests are essential
  • 17. Principles #1 Every commit should result in a release #2 Automated tests are essential #3 Automate everything!
  • 18. Principles #1 Every commit should result in a release #2 Automated tests are essential #3 Automate everything! #4 Done means release/live in prod
  • 19. Benefits ● Speed of delivery of business idea to customer ● Easy going live deployment ● Less time spent on delivery - more profit ● More motivation to do more as you can see what you can change/improve
  • 20. Challenges ● Big effort to implement changes for: ○ database increment/rollback ○ infrastructure rollout/rollback ○ decrease down time … ● Need to get customers to buy in ● Security policies
  • 23. Gradle - General purpose build system
  • 24. Gradle - General purpose build system - Comes with a rich DSL based on Groovy
  • 25. Gradle - General purpose build system - Comes with a rich DSL based on Groovy - Follows ”build-by-convention” principles
  • 26. Gradle - General purpose build system - Comes with a rich DSL based on Groovy - Follows ”build-by-convention” principles - Built-in plug-ins for JVM languages, etc
  • 27. Gradle - General purpose build system - Comes with a rich DSL based on Groovy - Follows ”build-by-convention” principles - Built-in plug-ins for JVM languages, etc - Derives all the best from Ivy, Ant & Maven
  • 29. 1. JDK 8 2. Gradle 2.2+ 3. Git Prerequisites
  • 30. 1. Change directory to D:ImagesGradle folder 2. Open Command Window in dir D:ImagesGradle 3. Execute ​ Gitbingit clone https://github.com/webdizz/sbs-gradle.git 4. Change directory to sbs-gradle 5. Execute set_env.bat gradle -v java -version #0 Installation
  • 31. Groovy is under the hood
  • 32. 1. Reset code base to initial state git reset --hard 3a2ed47 git clean -df​ 2. Create file build.gradle 3. Type ​ println 'Hello, World!​​​​​​​​​​​'​ 4. Run gradle #1 Hello World!
  • 34. 1. Run to see default tasks list gradle tasks 2. Replace build.gradle file content with ​ apply plugin: 'java'​ 3. Run to see new available tasks gradle tasks 4. Checkout step s3_apply_plugin 5. Run to build Java source code gradle build 6. Explore directory build #2 Create simple build
  • 36. 1. Run task with part of name gradle ta 2. Run task with part of name to clean and compile ​ gradle cle tC 3. Run task with part of name to clean and compile and exclude processTestResources gradle cle tC -x pTR 4. Get details for task gradle -q help --task clean #3 Execute tasks
  • 37. 1. Run task gradle tasks 2. Run task to generate wrapper ​ gradle wrapper 3. Run tasks using wrapper ./gradlew tasks 4. Customize task wrapper to use another Gradle version ​task wrapper(type: Wrapper) { gradleVersion = '2.2.1' }​ 5. Check Gradle version ./gradlew -v #4 Use wrapper
  • 39. 1. Checkout step s5_prepare 2. Add directory common 3. Move src to common 4. Create common/build.gradle for Java 5. Add new module to settings.gradle include ':common'​ 6. Run build ./gradlew clean build 7. Run task for module ./gradlew :com:compJ #5 Create multi-module build
  • 41. Gradle - compile - to compile source
  • 42. Gradle - compile - to compile source - runtime - required by classes at runtime
  • 43. Gradle - compile - to compile source - runtime - required by classes at runtime - testCompile - to compile test sources
  • 44. Gradle - compile - to compile source - runtime - required by classes at runtime - testCompile - to compile test sources - testRuntime - required to run the tests
  • 45. 1. Add repositories to download dependencies from to build.gradle allprojects { currProject -> repositories { mavenLocal() mavenCentral() jcenter() maven {url 'http://repo.mycompany.com/’} } }​ #6 Dependencies
  • 46. 1. Add common dependencies for all subprojects in build.gradle subprojects { apply plugin: 'java' dependencies { compile 'org.slf4j:slf4j-api:1.7.7' testCompile 'org.mockito:mockito-core:1.10.19', 'junit:junit:4.12' } }​ #6.1 Dependencies
  • 47. 1. Add dependencies for concrete module in common/build.gradle dependencies { compile 'org.projectlombok:lombok:1.14.4' }​ #6.2 Dependencies
  • 48. 1. List project dependencies ./gradlew :common:dependencies #6.3 Dependencies
  • 50. 1. Extract common configuration parameters to gradle .properties file lombokVersion = 1.14.4 build.gradle file dependencies { compile “org.projectlombok:lombok:$lombokVersion” }​ #7 Configuration
  • 51. 1. Parameterise execution for custom task :printParameter in build.gradle task printParameter { println givenParameter }​ 2. Add parameter default value to gradle.properties 3. Execute task ./gradlew -q :printParameter -PgivenParameter=hello #7.1 Configuration
  • 54. ● Lifecycle ● Create a Settings instance for the build. ● Evaluate the settings.gradle script, if present, against the Settings object to configure it. ● Use the configured Settings object to create the hierarchy of Project instances. ● Finally, evaluate each Project by executing its build.gradle file, if present, against the project. The project are evaluated in such order that a project is evaluated before its child projects.
  • 55. ● Tasks ● A project is essentially a collection of Task objects. ● Each task performs some basic piece of work. ● Dependencies ● A project generally has a number of dependencies. ● Project generally produces a number of artifacts, which other projects can use.
  • 56. ● Plugins ● Plugins can be used to modularise and reuse project configuration. ● Properties ● Any property or method which your script uses is delegated through to the associated Project object. ● A project has 5 property 'scopes'. ● Dynamic Methods ● A project has 5 method 'scopes'.
  • 58. 1. Add integration test source sets in file gradle/integTest.gradle sourceSets { integTest { compileClasspath += main.output + test.output runtimeClasspath += main.output + test.output } } #8.1 Rich API
  • 59. 2. Add integration test configurations in file gradle/integTest.gradle configurations { integTestCompile.extendsFrom testCompile integTestRuntime.extendsFrom testRuntime } 3. Include extension for subprojects in file build.gradle apply from: file("${rootProject.projectDir}/gradle/integ Test.gradle")​ #8.1 Rich API
  • 60. 3. Add integration test task in file gradle/integTest.gradle task integTest(type: Test){ testClassesDir = sourceSets.integTest.output.classesDir classpath = sourceSets.integTest.runtimeClasspath shouldRunAfter 'test' } check.dependsOn(integTest) 4. Execute integration tests ./gradlew integTest #8.1 Rich API
  • 61. 1. Open build.gradle to add dependency for one task from another ​ printParameter.dependsOn 'help'​ 2. Run printParameter task ./gradlew printParameter #8.2 Tasks Dependencies
  • 62. 1. Open build.gradle to add ordering for one task from another task areTestsExist { if ([ file("${projectDir}/src/test/java").listFiles() ].isEmpty()) { println 'Test directory is empty' } else { println 'Test directory is not empty, will execute tests' } } test.mustRunAfter areTestsExist #8.3 Tasks Ordering*
  • 63. 2. Run test task ./gradlew test #8.3 Tasks Ordering*
  • 64. 1. Add rule to validate running of integration tests task tasks.addRule('Check correctness of running tests'){ String taskName -> gradle.taskGraph.whenReady{ Map<String, String> args = gradle.startParameter.systemPropertiesArgs gradle.taskGraph.allTasks.each { Task task -> if (task.name.contains('integTest') && !args.containsKey('profile')) { throw new org.gradle.api.tasks.StopExecutionException("Profile was not specified to run tests (-Dprofile=ci).") } } } } #8.4 Rules
  • 65. 2. Run check task to have failure ./gradlew check 3. Run check task with expected parameter ./gradlew check -Dprofile=ci ​ #8.4 Rules
  • 67. 1. Switch to 9th step and execute next command ./gradlew test --parallel 2. Try to modify amount of executable threads ./gradlew test --parallel --parallel-threads=3 ​ #9 Parallel builds
  • 69. 1. Create file gradle/releaseNotes.gradle to add task for release notes ext.destDir = new File(buildDir, 'releaseNotes') ext.releaseNotesTemplate = file('releaseNotes.tmpl.txt') tasks.create(name: 'copyTask', type: org.gradle.api.tasks.Copy) { from releaseNotesTemplate into destDir doFirst { if (!destDir.exists()) { destDir.mkdir() } } rename { String fileName -> fileName.replace('.tmpl', '') } } #10 Custom Inputs/Outputs
  • 70. tasks.create('releaseNotes') { inputs.file copyTask outputs.dir destDir } 2. Add releaseNotes.tmpl.txt file as a template for release notes 3. Apply configuration from gradle/releaseNotes.gradle in build.gradle 4. Let’s run releaseNotes task ./gradlew releaseNotes #10 Custom Inputs/Outputs
  • 71. 1. Enhance release notes task to prepare nice release notes file ​ ext.changesFile = file('changes.txt') ext.bugs = [] ext.features = [] changesFile.eachLine { String line -> String bugSymbol = '#bug:' String featureSymbol = '#feature:' if (line.contains(bugSymbol)) { bugs << line.replace(bugSymbol, '') } else if (line.contains(featureSymbol)) { features << line.replace(featureSymbol, '') } } filter(org.apache.tools.ant.filters.ReplaceTokens, tokens: [bugs: bugs.join("n"), features: features.join("n")])​ #10.1 Files filtering
  • 73. 1. Add JaCoCo configuration in gradle/coverage.gradle apply plugin: "jacoco" jacoco { toolVersion = "0.7.7.201606060606" } check.dependsOn jacocoTestReport jacocoTestReport { dependsOn 'test' reports { xml.enabled true csv.enabled false html.enabled true } } #11 Test Coverage
  • 74. 2. Apply configuration from gradle/coverage.gradle in build.gradle 3. Implement proper test for proper method 4. Let’s run check task to collect coverage metrics ./gradlew check -Dprofile=ci 5. Open common/build/reports/jacoco/test/html/index.html file to overview coverage #11 Test Coverage
  • 75. 1. Add JaCoCo configuration in gradle/coverage.gradle for integration tests ​task jacocoIntegrationTestReport(type: JacocoReport) { dependsOn integTest sourceSets sourceSets.main executionData integTest reports { xml { enabled true destination "$buildDir/reports/jacoco/integTest/jacocoIntegTestReport.xml" } csv.enabled false html { destination "$buildDir/reports/jacoco/integTest/html" } } } #11.1 Integration Test Coverage
  • 76. check.dependsOn jacocoIntegrationTestReport jacocoIntegrationTestReport.mustRunAfter jacocoTestReport 2. Let’s run check task to collect coverage metrics for integration tests as well ./gradlew check -Dprofile=ci ​ #11.1 Integration Test Coverage
  • 80. 1. Add configuration in gradle/codeQuality.gradle for code quality analysis and apply configuration in build.gradle subprojects { apply plugin: 'findbugs' findbugs { ignoreFailures = true toolVersion = '3.0.0' } apply plugin: 'pmd' pmd { toolVersion = '5.1.3' } } ​ #12 Static Code Analysis
  • 81. 2. Let’s run check task to collect code quality metrics ./gradlew check -Dprofile=ci 3. Open common/build/reports/pmd|findbugs/*.html ​ ​ #12 Static Code Analysis
  • 83. 1. Add configuration in gradle/publishing.gradle for artefacts publishing and apply configuration in build.gradle apply plugin: 'maven-publish' publishing { repositories { maven { url "http://artifactory.vagrantshare.com/artifactory/libs-release-local" credentials { username 'admin' password 'password' } } } publications { mavenJava(MavenPublication) { groupId "name.webdizz.${rootProject.name}" version = uploadVersion from components.java } } } #13 Artefacts Publishing
  • 84. 2. Let’s run publish task to publish artefacts ./gradlew publish -PuploadVersion=1.1.1.[YourName] 3. Check artefact was uploaded at http://artifactory.vagrantshare.com/artifactory ​ ​ #13 Artefacts Publishing
  • 86. ● Build script Visible for build file ● buildSrc/src/main/groovy Visible for project ● Standalone project Could be shared between projects using binary artefact
  • 87. 1. Create file PluginsPrinterPlugin.groovy in buildSrc/src/main/groovy ​import org.gradle.api.Plugin import org.gradle.api.Project public class PluginsPrinterPlugin implements Plugin<Project> { void apply(Project project) { project.task('printPlugins') << { println 'Current project has next list of plugins:' ext.plugins = project.plugins.collect { plugin -> plugin.class.simpleName } println plugins } } } #14 Plugins Printer
  • 88. 2. Apply plugin for all projects in build.gradle file allprojects { apply plugin: PluginsPrinterPlugin } 3. Let’s run printPlugins task to print plugins activated for project ./gradlew printPlugins ​ ​ #14 Plugins Printer
  • 93. ● http://www.gradle.org/ ● http://www.gradle.org/books ● https://plugins.gradle.org/ ● http://groovy-lang.org/ ● https://github.com/webdizz/sbs-gradle ● https://nebula-plugins.github.io/ References
  • 94. Q&A
  • 96. Izzet Mustafayev@EPAM Systems @webdizz webdizz izzetmustafaiev http://webdizz.name