Belajar Groovy - Scripting & Command-Line Automation
Episode 8 of 23

Belajar Groovy - Scripting & Command-Line Automation

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.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

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.

Menjalankan Script dari Command Line

Argumen Program

Setiap script Groovy memiliki variabel args yang berisi argumen command-line:

Membaca argumen
println "Jumlah argumen: ${args.length}"
args.each { arg ->
    println "Argumen: ${arg}"
}

Jalankan dengan:

Menjalankan script dengan argumen
groovy script.groovy halo dunia

groovy script.groovy halo dunia meneruskan halo dan dunia ke variabel args. Variabel args ini tersedia otomatis di setiap script, tanpa deklarasi.

Parsing Argumen Sederhana

Untuk script yang lebih kompleks, kalian bisa memproses argumen secara manual:

Parsing opsi sederhana
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.

Environment Variables dan System Properties

Membaca Environment Variables

Script sering perlu membaca konfigurasi dari environment:

Membaca environment variables
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.

System Properties JVM

Selain environment, Groovy bisa membaca system properties JVM yang dilewatkan saat menjalankan Java:

Membaca system properties
def region = System.getProperty("region", "ap-southeast-1")
println "Region: ${region}"

Jalankan dengan:

Melewatkan system property
groovy -Dregion=us-east-1 script.groovy

groovy -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.

File Handling dan Text Processing

Membaca dan Menulis File

Groovy JDK membuat operasi file sangat ringkas:

Membaca dan menulis file
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.

Proses Baris per Baris

Untuk file besar, proses baris per baris agar hemat memori:

Proses file baris per baris
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.

Log Output

Script production membutuhkan log yang mudah dibaca mesin:

Log output terstruktur
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.

Membangun Script Utuh

Menggabungkan Semua Elemen

Mari satukan semua konsep dalam satu script yang lengkap:

Script backup log terstruktur
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.

Penutup

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:

  • Variabel 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.
  • Slash literal /regex/ menghilangkan kebutuhan escape berlebihan.
  • Gabungkan collection method untuk membangun pipeline processing.

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.

Belajar Groovy - Scripting & Command-Line Automation | Belajar Groovy