Memahami konsep Pipeline as Code dengan Jenkinsfile yang tersimpan di repository, membandingkan sintaks Declarative dan Scripted, lalu menulis dan menjalankan pipeline Hello World pertama via SCM checkout.

Di episode 1 kita menutup dengan kesimpulan: kode lebih baik daripada klik. Episode 2 adalah saatnya membuktikan kalimat itu. Kita akan menulis Jenkins Pipeline pertama dalam bentuk file Jenkinsfile — dan di sinilah kalian merasakan perbedaan filosofis dengan Freestyle Project yang dibahas sebelumnya. Semua alur build, mulai dari checkout sampai notifikasi, akan hidup di dalam Git repository sebagai kode yang bisa di-review, diuji, dan di-versioning.
Konsep ini bernama Pipeline as Code, dan ia adalah fondasi dari hampir semua hal yang akan kalian bangun di series ini. Pada episode kali ini kita akan membahas konsepnya, membandingkan dua sintaks — Declarative dan Scripted — lalu membedah anatomi blok Declarative dan menulis pipeline Hello World yang dijalankan langsung dari repository lewat SCM checkout.
Ide utamanya sederhana: definisi pipeline bukan lagi konfigurasi yang tersimpan di database Jenkins, melainkan sebuah file bernama Jenkinsfile yang diletakkan di root direktori repository kalian, bersama kode aplikasi.
Mengapa ini perubahan besar? Karena pipeline menjadi bagian dari codebase:
Dengan satu repository, kalian bahkan bisa memakai Jenkinsfile yang sama untuk diuji di jenkins testing dan dijalankan di jenkins produksi — konfigurasi tidak mungkin "lupa disinkronkan".
Jenkins menyediakan dua sintaks untuk menulis pipeline:
Declarative Pipeline adalah sintaks modern yang diperkenalkan tahun 2017. Ia terstruktur, berbasis blok yang sudah ditentukan, dan sangat mudah dibaca. Strukturnya selalu dimulai dengan kata kunci pipeline dan menggunakan blok seperti stages dan steps.
Scripted Pipeline adalah sintaks asli berbasis Groovy murni. Ia imperatif — ditulis seperti program biasa dengan node { ... }, stage yang dipanggil sebagai method, dan kebebasan penuh untuk menulis loop, exception handling, dan logika programatik apapun.
| Aspek | Declarative | Scripted |
|---|---|---|
| Struktur | Blok deklaratif (pipeline, stages, steps) | Imperatif, Groovy murni |
| Kemudahan baca | Tinggi | Bervariasi |
| Validasi struktural | Ketat, error lebih dini | Longgar |
| Fleksibilitas | Cukup dengan script { } | Tidak terbatas |
| Direkomendasikan? | Ya, standar modern | Hanya saat butuh logika kompleks |
Tip
Aturan emas: default ke Declarative, dan sisipkan script { } saat benar-benar butuh logika Groovy murni di dalamnya. Scripted tetap penting untuk dipahami — khususnya saat kalian membaca Jenkinsfile lama atau menulis Shared Libraries di episode 9 — tapi jarang menjadi pilihan untuk pipeline baru.
Pipeline Declarative tersusun dari blok-blok yang selalu dimulai dengan kata kunci pipeline. Empat blok wajib yang menjadi kerangka dasar:
| Blok | Fungsi |
|---|---|
pipeline | Pembungkus seluruh definisi pipeline |
agent | Menentukan di mana pipeline dieksekusi (node, label, container) |
stages | Wadah berisi satu atau lebih stage |
stage | Satu fase logis dari pipeline (Build, Test, Deploy) |
steps | Perintah-perintah konkret yang dijalankan di dalam stage |
Struktur dasarnya seperti kotak yang bersarang: di dalam pipeline ada agent, lalu stages yang berisi daftar stage, dan setiap stage berisi steps. Kalian bisa membacanya seperti outline: "Pipeline ini jalan di mana saja, dengan fase-fase berikut, dan di fase ini kita melakukan hal ini."
Mari kita tulis pipeline paling sederhana. Buat file bernama Jenkinsfile di repository kalian:
pipeline {
agent any
stages {
stage('Hello') {
steps {
echo 'Hello dari Jenkins Pipeline!'
}
}
}
}Bedah satu per satu:
agent any berarti pipeline boleh dijalankan di executor manapun yang tersedia. Di episode 3 kita akan menggantinya dengan label spesifik (agent dengan label docker-runner) agar pekerjaan terarah ke agent yang tepat.stages mendefinisikan fase-fase. Di sini hanya ada satu stage('Hello').steps berisi langkah eksekusi — dalam hal ini echo yang mencetak pesan ke log build.Saat pipeline ini berjalan, Jenkins akan menampilkan satu stage bernama Hello di UI, dan di bawahnya log berisi pesan yang kita cetak. Ini mungkin terlihat remeh, tapi kerangka inilah yang akan menampung ratusan langkah di pipeline produksi kalian nanti.
Jenkinsfile tidak dijalankan dengan menyalin isinya ke UI — ia diambil langsung dari repository. Cara yang benar:
Jenkinsfile, lalu git push.hello-world, dan pilih tipe Pipeline.Git, isi Repository URL dengan URL repo kalian, dan biarkan Branch Specifier mengarah ke branch utama.Jenkinsfile (nama file di root repository).pipeline {
agent any
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Hello') {
steps {
echo 'Kode berhasil diambil dari repository'
}
}
}
}Perhatikan langkah checkout scm — ini perintah eksplisit untuk mengambil source code ke workspace. Pada pipeline dari SCM, Jenkins otomatis men-checkout saat build dimulai, tapi menyebutkannya sebagai stage eksplisit membuat alur lebih transparan dan memudahkan kalian menambahkan checkout ulang di konfigurasi multi-branch (episode 4).
Important
Saat memilih Pipeline script from SCM, Jenkins membaca Jenkinsfile dari repository — bukan dari field Script yang ada di atasnya. Kedua opsi tersebut saling meniadakan: pakai satu saja. Kesalahan paling umum pemula adalah mengisi Script di UI sementara repository sudah punya Jenkinsfile, dan bingung kenapa perubahan di repo tidak berdampak.
Setelah build selesai, perhatikan beberapa hal di halaman build:
Jika ada sintaks yang salah, pipeline Declarative akan menampilkan error parsing secara jelas di Console Output — salah satu keuntungan sintaks yang terstruktur.
Jenkinsfile (tanpa ekstensi) dan berada di root repo, atau sesuaikan Script Path.*/main atau */master.agent any disalahpahami. Ini berarti "jalankan di mana saja", bukan "jalankan di controller saja" — Jenkins tetap akan memilih executor yang cocok.pipeline (Declarative) tidak bisa bercampur bebas dengan node { } (Scripted) di level teratas — pilih satu sintaks sebagai kerangka.Pada episode 2 ini kalian telah:
Jenkinsfile di dalam repository, bisa di-review dan di-versioning seperti kode biasa.pipeline, agent, stages, stage, dan steps.Inti yang harus kalian bawa: pipeline adalah kode, dan kode itu disimpan di repository. Di episode 3 kita akan memperluas arsitektur ini — menyusun distributed architecture dengan agent-agent yang terpisah, memahami mengapa controller tidak boleh menjalankan build produksi, dan mengkonfigurasi SSH agent, Docker agent, hingga Kubernetes agent. Sampai jumpa di episode 3!