WRITE GRADLE PLUGINSWRITE GRADLE PLUGINS
ESCRIBIR Y PUBLICAR TUS PLUGINS DEESCRIBIR Y PUBLICAR TUS PLUGINS DE
GRADLE "MADE EASY"GRADLE "MADE EASY"
Jorge Aguilera
1
PRESENTACIÓNPRESENTACIÓN
Created by /Jorge Aguilera @jagedn
2
PRESENTACIÓNPRESENTACIÓN
@jagedn (Jorge Aguilera)
Created by /Jorge Aguilera @jagedn
2
PRESENTACIÓNPRESENTACIÓN
@jagedn (Jorge Aguilera)
Groovy (101 GroovyScript)
Created by /Jorge Aguilera @jagedn
2
PRESENTACIÓNPRESENTACIÓN
@jagedn (Jorge Aguilera)
Groovy (101 GroovyScript)
Groogle (Groovy+Google)
Created by /Jorge Aguilera @jagedn
2
PRESENTACIÓNPRESENTACIÓN
@jagedn (Jorge Aguilera)
Groovy (101 GroovyScript)
Groogle (Groovy+Google)
Extensiones de Asciidoctor (Puravida Extensions)
Created by /Jorge Aguilera @jagedn
2
PRESENTACIÓNPRESENTACIÓN
@jagedn (Jorge Aguilera)
Groovy (101 GroovyScript)
Groogle (Groovy+Google)
Extensiones de Asciidoctor (Puravida Extensions)
Gradle Plugins
Created by /Jorge Aguilera @jagedn
2
PRESENTACIÓNPRESENTACIÓN
@jagedn (Jorge Aguilera)
Groovy (101 GroovyScript)
Groogle (Groovy+Google)
Extensiones de Asciidoctor (Puravida Extensions)
Gradle Plugins
Disclaimer
Created by /Jorge Aguilera @jagedn
2
AGENDAAGENDA
3
AGENDAAGENDA
Introducción a Gradle
3
AGENDAAGENDA
Introducción a Gradle
Project, tasks, plugins, extension
3
AGENDAAGENDA
Introducción a Gradle
Project, tasks, plugins, extension
Pasos para construir y publicar en Gradle
3
AGENDAAGENDA
Introducción a Gradle
Project, tasks, plugins, extension
Pasos para construir y publicar en Gradle
Demo time
3
AGENDAAGENDA
Introducción a Gradle
Project, tasks, plugins, extension
Pasos para construir y publicar en Gradle
Demo time
PuraVida Gradle plugins
3
4
GRADLEGRADLE
Gradle vs Maven vs Ant
Install
download & unzip
sdkman install gradle
docker run -v $(pwd):/home/gradle/gradle
gradle init
./gradlew [-b build.gradle] hello
5
CONCEPTOSCONCEPTOS
Project(s)
Task(s)
Plugin(s)
6
PROJECTPROJECT
Cada build de Gradle está formado por un conjunto
de proyectos.
Puede ser construir un algo (un jar, un war, un zip,
etc)
Pero también puede ser hacer algo (desplegar un
servicio, enviar un tweet, etc)
7
TASKTASK
Unidad básica de los proyectos.
8
TASK 1/3TASK 1/3
gradle hello
task hello(){
doLast{
println "hello"
}
}
9
TASK 2/3TASK 2/3
gradle goodbye
task hello(){
doLast{
println "hello"
}
}
task goodbye(){
doLast{
println "goodbye"
}
}
goodbye.dependsOn hello
10
TASK 3/3TASK 3/3
gradle hello
task hello(){
doLast{
println "hello ISS"
} }
hello.onlyIf{
def slurper = new groovy.json.JsonSlurper()
def json = slurper.parseText(
"http://api.open-notify.org/iss-now.json".toURL()
float nlon = json.iss_position.longitude
float nlat = json.iss_position.latitude
float LAT = 40.4237401
float LON = -3.7012653
Math.abs(LAT-nlat) < 1 && Math.abs(LON-nlon) < 1
}
11
12
PLUGINSPLUGINS
Mecanismo para compartir Tasks
Un plugin puede añadir 1 o varias Tasks
Dónde:
chero build.gradle
directorio buildSrc/src/main/groovy
proyecto independiente
13
PROYECTO INDEPENDIENTEPROYECTO INDEPENDIENTE
Elegir un nombre cuali cado
gradle init
Crear MyTask
Crear MyPlugin y aplicar la Task
Anotar con @TaskAction el main de la Task
Declarar el plugin /META-INF/gradle-
plugins/TU.PLUGIN.CUALIFICADO.properties
Bonus si tu plugin usa Extension
14
DEPENDENCIASDEPENDENCIAS
dependencies {
compile localGroovy()
compile gradleApi()
}
15
DECLARAR EL PLUGINDECLARAR EL PLUGIN
TU.PLUGIN.CUALIFICADO.properties
implementation-class=com.foo.baar.MyPlugin
16
PLUGINPLUGIN
class MyPlugin implements Plugin<Project> {
void apply(Project project) {
project.with {
apply(plugin: 'base')
task('mytask',
type:MyTask,
group:'others',
description: 'Look Mom, a plugin from Puravida in
}
}
}
}
17
TASKTASK
class MyTask extends DefaultTask{
@TaskAction
void callYourMethodAsYouWant(){
println "Hello"
}
}
18
CONFIGURACIÓN TASKCONFIGURACIÓN TASK
19
CONFIGURACIÓN TASKCONFIGURACIÓN TASK
Identi car propiedades de la task
19
CONFIGURACIÓN TASKCONFIGURACIÓN TASK
Identi car propiedades de la task
Si usas Groovy crea métodos get/set más una
función
19
CONFIGURACIÓN TASKCONFIGURACIÓN TASK
Identi car propiedades de la task
Si usas Groovy crea métodos get/set más una
función
Piensa en el usuario y no te limites a una lista de
propiedades (puedes anidarlas)
19
CONFIGURACIÓN TASKCONFIGURACIÓN TASK
Identi car propiedades de la task
Si usas Groovy crea métodos get/set más una
función
Piensa en el usuario y no te limites a una lista de
propiedades (puedes anidarlas)
Input (un chero de entrada por ejemplo) vs Output
(un directorio de salida)
19
CONFIGURACIÓN TASKCONFIGURACIÓN TASK
Identi car propiedades de la task
Si usas Groovy crea métodos get/set más una
función
Piensa en el usuario y no te limites a una lista de
propiedades (puedes anidarlas)
Input (un chero de entrada por ejemplo) vs Output
(un directorio de salida)
Valores simples, basados en cheros ( le, collections,
etc), anidadas 19
ANOTACIONESANOTACIONES
Anota siempre métodos get para ayudar a Gradle!!
Name Name Name Name
@Input @Output @InputFile @OutputFile
@InputFiles @OutputFiles @InputDirectory @OutputDirectory
@Optional @Internal @Nested @TaskAction
20
TESTTEST
Podemos utilizar JUnit y/o Spock para crear tests!!
plugins {
id 'java-gradle-plugin'
}
dependencies{
// add these
testCompile gradleTestKit()
testCompile group: 'junit', name: 'junit', version: '4.12'
testCompile ("org.spockframework:spock-core:1.1-groovy-2.4")
exclude group: 'org.codehaus.groovy', module: 'groovy-all
exclude group: 'org.hamcrest', module: 'hamcrest-core'
}
}
21
MYTASKSPECMYTASKSPEC
class MyTaskSpec extends Specification{
@Rule
TemporaryFolder testProjectDir
File buildFile
def setup() {
buildFile = testProjectDir.newFile('build.gradle')
buildFile << """
plugins {
id 'TU.PLUGIN.CUALIFICADO'
}"""
}
def "run task"() {
buildFile << 'hello{}'
when:
def result = GradleRunner.create()....build()
then:
22
EXTENSIONEXTENSION
util para con guraciones globales o por defecto.
class MyExtension{
MyExtension(Project project){
myprp = project.objects.property(Integer)
}
Property<Integer> myprp
void useYourImagination(Object b){
myprp.set(b)
}
}
23
PUBLISHPUBLISH
plugins{
id "com.gradle.plugin-publish" version "0.10.0"
}
./gradlew publishPlugins
24
DEMO PARTYDEMO PARTY
Cámaras M-30
25
PURAVIDA GRADLE PLUGINSPURAVIDA GRADLE PLUGINS
26
PURAVIDA GRADLE PLUGINSPURAVIDA GRADLE PLUGINS
Funcionales
26
PURAVIDA GRADLE PLUGINSPURAVIDA GRADLE PLUGINS
Funcionales
Didácticos
26
CHECK-SERVERCHECK-SERVER
Ejecuta la task si una URL devuelve 200 y puedes
descargar el body a chero
id 'com.puravida.gradle.checkserver'
Show me the code!!!
https://puravida-gradle.gitlab.io/check-server
27
SOCIAL NETWORKSOCIAL NETWORK
Comparte el resultado de un build por ejemplo
twitter, telegram, slack
id 'com.puravida.gradle.socialnetwork'
Show me the code!!!
https://puravida-gradle.gitlab.io/social-network
28
GROOGLEGROOGLE
Descarga/Sube cheros de/a tu Drive (por ahora)
id 'com.puravida.gradle.groogle'
Show me the code!!!
https://puravida-gradle.gitlab.io/groogle
29
30

Write gradle plugins escribir y publicar tus plugins de gradle made easy_