Menulis script otomasi CI/CD menggunakan Bash sering kali rentan error ketika logika pipeline bertambah kompleks, terutama saat memanipulasi struktur data seperti JSON atau YAML. Sebaliknya, runtime seperti Python atau Node.js memerlukan setup environment, virtual environment, dan dependensi eksternal yang memperlambat execution time di runner. Babashka menjawab masalah ini: runtime native berbasis GraalVM untuk subset Clojure dengan startup sub-milidetik, standard library bawaan lengkap, dan kapabilitas REPL (Read-Eval-Print Loop).
Mengapa Menggunakan Babashka untuk Pipeline CI/CD?
Babashka menggabungkan portabilitas script shell dengan keandalan bahasa fungsional. Standard library Babashka menyertakan parsing JSON (cheshire.core), file system utilities (babashka.fs), process execution (babashka.process), dan HTTP client (babashka.http-client) secara out-of-the-box tanpa langkah kompilasi atau download package terpisah.
Perbandingan loop feedback pengembangan pipeline:
- Bash: Feedback loop lambat untuk struktur kompleks. Debugging array atau parsing nested JSON mengandalkan tool eksternal seperti
jqdengan sintaksis terpisah. Kesalahan baru terdeteksi saat script dieksekusi menyeluruh. - Python: Memiliki ekosistem kuat, namun memerlukan isolasi dependensi (
venv,pip install) di dalam container runner yang menambah overhead waktu eksekusi CI/CD. - Babashka (REPL-Driven): Feedback instan. Setiap fungsi validasi, parsing artifact, atau network call dapat dievaluasi langsung per ekspresi di REPL lokal tanpa restart proses atau menjalankan ulang seluruh alur runner.
Konfigurasi Lingkungan: bb.edn dan Tooling REPL
File bb.edn berfungsi sebagai konfigurasi project, dependency manager, dan task runner terintegrasi. Buat struktur direktori berikut:
.
├── .bb
├── bb.edn
└── scripts
└── ci.cljIsi file bb.edn:
{:paths ["scripts"]
:tasks
{:init (require '[ci :as ci])
validate-artifact {:doc "Validasi manifest artifact build sebelum deployment"
:task (ci/validate-manifest "dist/manifest.json")}
deploy {:doc "Deploy artifact jika validasi lolos"
:task (do (run 'validate-artifact)
(println "Deploying to production..."))}}}Menghubungkan Editor ke Babashka REPL
Mulai nREPL server Babashka dari terminal:
bb --nrepl-server 1667Hubungkan editor Anda (seperti Neovim dengan Conjure, VS Code dengan Calva, atau Emacs dengan CIDER) ke port 1667. Sekarang, Anda dapat mengevaluasi kode Clojure baris demi baris langsung di dalam file scripts/ci.clj.
Scripting Otomasi: Parsing JSON dan Validasi Artifact
Contoh implementasi script validasi build artifact di scripts/ci.clj. Script ini membaca artifact JSON, memvalidasi metadata build, dan menghentikan alur via exit code non-nol jika kondisi deployment tidak terpenuhi.
(ns ci
(:require [babashka.fs :as fs]
[cheshire.core :as json]))
(defn read-manifest [file-path]
(if (fs/exists? file-path)
(json/parse-string (slurp file-path) true)
(throw (ex-info "Manifest file tidak ditemukan" {:path file-path}))))
(defn valid-build? [{:keys [status version commit]}]
(and (= status "success")
(string? version)
(not (empty? version))
(= 40 (count commit))))
(defn validate-manifest [file-path]
(try
(let [manifest (read-manifest file-path)]
(if (valid-build? manifest)
(do
(println (str "[OK] Artifact valid untuk commit: " (:commit manifest)))
(System/exit 0))
(do
(binding [*out* *err*]
(println "[ERROR] Artifact gagal validasi kriteria integritas"))
(System/exit 1))))
(catch Exception e
(binding [*out* *err*]
(println (str "[FATAL] " (ex-message e))))
(System/exit 1))))Dengan REPL terhubung, Anda cukup mengevaluasi blok (valid-build? {:status "success" :version "1.0.0" :commit "a4b8c..."}) secara interaktif di editor untuk menguji branch logic tanpa perlu memicu shell eksternal.
Integrasi pada GitHub Actions Pipeline
Untuk menjalankan task runner Babashka pada runner GitHub Actions, gunakan setup action resmi setup-babashka.
name: CI Pipeline
on:
push:
branches: [main]
jobs:
validate-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Setup Babashka
uses: turtlequeue/setup-babashka@v1.5.0
with:
babashka-version: 1.3.190
- name: Run Build Artifact Validation
run: bb validate-artifactTrade-offs dan Pertimbangan
- Startup Time: Startup instan (~0.005 detik) dibandingkan JVM Clojure konvensional (~1-3 detik) atau Python (~0.05-0.1 detik).
- Clojure JVM vs Babashka: Babashka adalah interpreter GraalVM native; tidak semua library Clojure berbasis Java interop dapat dimuat dinamis jika kelas Java tersebut tidak dikompilasi ke dalam binary Babashka. Gunakan standard library bawaan (Pods, HTTP client, Process, Transit).
- Adopsi Tim: Sintaksis Lisp/Clojure memerlukan penyesuaian bagi tim yang terbiasa dengan scripting imperatif seperti Bash atau Python procedural.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!