Episode ini membahas pengembangan plugin dan extension dengan Groovy: membuat plugin Gradle dan plugin aplikasi Groovy, packaging dan publishing artifact, reuse di build ecosystem, serta berkontribusi ke community plugins dan reusable scripts.

Setelah kalian mahir menulis script dan DSL, langkah berikutnya adalah mengemas pengetahuan itu menjadi plugin yang bisa dipakai ulang banyak orang. Plugin adalah cara Groovy mendistribusikan ekstensi secara terstruktur.
Episode 18 membahas pembuatan plugin Gradle, extension untuk aplikasi Groovy, packaging dan publishing, serta berkontribusi ke community plugins dan reusable scripts.
build.gradle
settings.gradle
src/main/groovy/com/example/GreetingPlugin.groovy
src/main/resources/META-INF/gradle-plugins/com.example.greeting.propertiesFile properties menghubungkan nama plugin dengan class implementasi. Ini adalah kontrak yang dibaca Gradle saat plugin diterapkan.
package com.example
import org.gradle.api.Plugin
import org.gradle.api.Project
class GreetingPlugin implements Plugin<Project> {
void apply(Project project) {
project.tasks.register("hello") {
doLast {
println "Halo dari ${project.name}"
}
}
}
}class GreetingPlugin implements Plugin<Project> adalah kontrak dasar semua plugin Gradle. project.tasks.register("hello") membuat task baru yang muncul saat plugin diterapkan — kini project lain cukup menerapkan plugin ini untuk mendapatkan task hello.
implementation-class=com.example.GreetingPluginimplementation-class=com.example.GreetingPlugin menghubungkan nama plugin com.example.greeting dengan class implementasi. implementation-class=com.example.GreetingPlugin adalah satu-satunya konten yang dibutuhkan file properties tersebut.
class NotifikasiExtension {
String kanal = "slack"
int retry = 3
}class NotifikasiExtension mendefinisikan opsi konfigurasi dengan nilai default. String kanal = "slack" memberi nilai awal sehingga pengguna yang tidak mengatur apa pun tetap mendapat perilaku wajar.
project.extensions.create("notifikasi", NotifikasiExtension)
project.tasks.register("kirimNotifikasi") {
doLast {
def config = project.extensions.notifikasi
println "Mengirim ke ${config.kanal} dengan retry ${config.retry}"
}
}project.extensions.create("notifikasi", NotifikasiExtension) mendaftarkan extension yang bisa diakses pengguna. project.extensions.notifikasi membaca konfigurasi dari dalam task, sehingga opsi yang diatur pengguna langsung berdampak.
gradle jarplugins {
id "java-gradle-plugin"
id "maven-publish"
}
publishing {
publications {
pluginMaven(MavenPublication) {
from components.java
}
}
}plugins { id "java-gradle-plugin" } menambahkan dukungan plugin Gradle, dan id "maven-publish" menambahkan publishing. pluginMaven(MavenPublication) mendefinisikan publikasi yang kemudian dijalankan dengan gradle publishToMavenLocal.
plugins {
id "com.example.greeting" version "1.0.0"
}id "com.example.greeting" version "1.0.0" menerapkan plugin beserta versinya. id "com.example.greeting" version "1.0.0" adalah pola yang sama dengan plugin Gradle terkenal yang selama ini kalian gunakan.
def sambut(String nama) {
"Halo, ${nama}"
}Simpan sebagai lib/sambutan.groovy, lalu gunakan dari script utama:
evaluate(new File("lib/sambutan.groovy"))
println sambut("Arman")evaluate(new File("lib/sambutan.groovy")) mengeksekusi script lain dan membuat method-nya tersedia. evaluate(new File("lib/sambutan.groovy")) adalah cara sederhana berbagi kode antar script sebelum di-upgrade menjadi library resmi.
Banyak plugin dan script Groovy yang open-source. Untuk berkontribusi:
good first issue.Plugin publik memerlukan standar tinggi:
Episode 18 mengajarkan cara mengemas kode Groovy menjadi aset yang bisa dibagikan: plugin Gradle, extension API, packaging dan publishing, reusable scripts, serta kontribusi ke ekosistem open-source.
Inti yang harus dibawa pulang:
Plugin<Project>.maven-publish mendistribusikan plugin sebagai artifact.plugins { id ... version }.evaluate berbagi kode antar script Groovy.Di episode 19 selanjutnya kita akan membahas operational readiness dan runbooks — menyiapkan runbook untuk deployment dan incident response, metrik operasional, logging dan runtime observability, serta upgrade path dan compatibility check untuk versi Groovy dan JVM.