Episode ini membawa kalian ke dunia scripting Groovy untuk otomasi tugas: parsing argumen command-line, membaca environment variables, file handling, text processing, dan pengelolaan log output. Kalian akan membangun script CLI yang siap dipakai di production.

Groovy lahir untuk scripting, dan episode ini adalah wujud paling langsung dari tujuan tersebut. Kalian akan belajar menulis script yang bisa dijalankan dari terminal untuk mengotomasi tugas berulang — dari memproses file hingga mengecek kondisi sistem.
Episode 8 membahas parsing argumen command-line, membaca environment variables, file handling, text processing, dan log output. Setelah episode ini, kalian akan membuat script CLI yang rapi dan siap dipakai di production.
Setiap script Groovy memiliki variabel args yang berisi argumen command-line:
println "Jumlah argumen: ${args.length}"
args.each { arg ->
println "Argumen: ${arg}"
}Jalankan dengan:
groovy script.groovy halo duniagroovy script.groovy halo dunia meneruskan halo dan dunia ke variabel args. Variabel args ini tersedia otomatis di setiap script, tanpa deklarasi.
Untuk script yang lebih kompleks, kalian bisa memproses argumen secara manual:
def mode = "dev"
def nama = "Teman"
for (i in 0..<args.length) {
if (args[i] == "--mode" && i + 1 < args.length) {
mode = args[i + 1]
} else if (args[i] == "--nama") {
nama = args[i + 1]
}
}
println "Mode: ${mode}, Nama: ${nama}"for (i in 0..<args.length) mengiterasi argumen dan mengecek flag. Pola manual ini cukup untuk script kecil; untuk parsing opsi yang matang, kalian bisa memakai library commons-cli dari Apache.
Script sering perlu membaca konfigurasi dari environment:
def home = System.getenv("HOME")
println "Home directory: ${home}"
def apiKey = System.getenv("API_KEY") ?: "tidak-ada"
println "API key tersedia: ${apiKey != "tidak-ada"}"System.getenv("HOME") membaca variabel environment. Operator Elvis ?: memberikan nilai default saat variabel tidak diset, sehingga script tidak crash karena environment yang berbeda.
Selain environment, Groovy bisa membaca system properties JVM yang dilewatkan saat menjalankan Java:
def region = System.getProperty("region", "ap-southeast-1")
println "Region: ${region}"Jalankan dengan:
groovy -Dregion=us-east-1 script.groovygroovy -Dregion=us-east-1 script.groovy melewatkan system property region, dan System.getProperty("region", "ap-southeast-1") membacanya dengan fallback default. Dua sumber konfigurasi ini — environment dan property — akan kalian kelola lebih lanjut di episode 14.
Groovy JDK membuat operasi file sangat ringkas:
def input = new File("/tmp/sumber.txt")
def output = new File("/tmp/hasil.txt")
output.text = input.text.toUpperCase()
println "Isi asli: ${input.text}"
println "Isi hasil: ${output.text}"input.text membaca seluruh isi file sebagai string, dan output.text = ... menulis sekaligus. input.text.toUpperCase() menggabungkan enhancement string dengan operasi file dalam satu baris.
Untuk file besar, proses baris per baris agar hemat memori:
new File("/tmp/log.txt").eachLine { baris, nomor ->
if (baris.contains("ERROR")) {
println "${nomor}: ${baris}"
}
}new File("/tmp/log.txt").eachLine { baris, nomor -> ... } mengiterasi setiap baris dengan nomornya, dan hanya mencetak baris yang mengandung ERROR. Pola ini ideal untuk memfilter log atau data terstruktur.
Untuk pencocokan yang lebih rumit, Groovy mendukung regex dengan slash literal, misalnya /(?i)error\s+\d+/, sehingga tidak perlu escape backslash berlebihan seperti di Java.
Script production membutuhkan log yang mudah dibaca mesin:
def log(String level, String pesan) {
def waktu = new Date().format("yyyy-MM-dd HH:mm:ss")
println "${waktu} [${level}] ${pesan}"
}
log("INFO", "Script dimulai")
log("WARN", "Cache belum ada, memuat ulang")
log("ERROR", "Gagal menghubungi API")new Date().format("yyyy-MM-dd HH:mm:ss") menambahkan timestamp, dan log("INFO", "...") menghasilkan baris log yang konsisten. Format seperti ini mudah diparsing oleh tool observability yang akan kita bahas di episode 19.
Mari satukan semua konsep dalam satu script yang lengkap:
def folder = System.getenv("LOG_DIR") ?: "/tmp/logs"
def pola = /\.log$/
def totalError = 0
new File(folder).listFiles().findAll { it.name ==~ pola }.each { file ->
def errors = file.text.readLines().findAll { it.contains("ERROR") }
totalError += errors.size()
println "${file.name}: ${errors.size()} error"
}
println "Total error: ${totalError}"new File(folder).listFiles().findAll { it.name ==~ pola } menemukan semua file .log di direktori, lalu menghitung baris ERROR di tiap file. Script ini menunjukkan bagaimana file handling, regex, environment, dan collection bekerja bersama dalam satu program utuh.
Episode 8 membuat kalian produktif sebagai script writer: membaca argumen dengan args, membaca environment variables dan system properties, memproses file dan teks, serta menulis log yang terstruktur.
Inti yang harus dibawa pulang:
args berisi argumen command-line secara otomatis.System.getenv membaca environment; System.getProperty membaca property JVM.file.text membaca dan menulis seluruh isi file.eachLine memproses file besar baris per baris tanpa boros memori./regex/ menghilangkan kebutuhan escape berlebihan.Di episode 9 selanjutnya kita akan membahas DSL dan domain-specific language — prinsip pembuatan DSL di Groovy, builder style DSL, konfigurasi deklaratif, serta contoh DSL untuk deployment dan testing.