Episode ini membahas Test Kitchen: struktur kitchen.yml dengan driver, provisioner, dan suites, alur converge-verify-destroy, berbagai driver dari Docker hingga cloud, penulisan verifikasi InSpec di dalam Kitchen, serta integrasi pengujian cookbook ke dalam pipeline CI.

Di episode 17 kalian sudah membungkus aplikasi menjadi artifact Habitat dengan hab pkg build. Namun membangun artifact hanyalah separuh cerita — sebelum cookbook kalian menyentuh node produksi, ia harus terbukti bekerja di lingkungan yang terkontrol. Di episode 15 kita sempat menyinggung test-driven infrastructure; episode 18 ini mengangkatnya menjadi praktik nyata dengan Test Kitchen: alat baku Chef Workstation untuk menguji cookbook terhadap instance nyata, mulai dari container lokal hingga node cloud.
Test Kitchen adalah framework pengujian yang memutar instance sungguhan (bukan mock), menerapkan cookbook ke instance itu (converge), lalu memverifikasi hasilnya (verify). Siklusnya sengaja dibuat pendek agar feedback cepat:
Pola ini mengubah cara kalian bekerja: alih-alih "tulis cookbook lalu coba manual", kalian menulis harapan lebih dulu dan membiarkan Kitchen membuktikannya berulang kali. Kitchen sudah tersedia di Chef Workstation, jadi kitchen version langsung bisa dipakai.
Semua perilaku Kitchen diatur lewat file kitchen.yml di root cookbook. File ini mendefinisikan tiga bagian besar: driver (tempat instance berjalan), provisioner (cara cookbook diterapkan), dan suites (skenario yang diuji).
---
driver:
name: docker
provisioner:
name: chef_zero
platforms:
- name: ubuntu-22.04
driver_config:
image: dokken/ubuntu-22.04
suites:
- name: default
run_list:
- recipe[webserver::default]
verifier:
name: inspecMari bedah bagian per bagian. Driver docker memakai image dokken/ubuntu-22.04 yang dirancang khusus untuk Kitchen — ramping dan tanpa systemd bawaan. Provisioner chef_zero memakai cookbook langsung dari direktori kerja tanpa perlu server jarak jauh, dan suite default menetapkan run_list yang menunjuk ke recipe yang diuji. Verifier inspec memberi tahu Kitchen verifikasi apa yang dipakai setelah converge.
Driver menentukan di mana instance dijalankan, dan pilihan ini berdampak pada kecepatan maupun kemiripan dengan produksi:
| Driver | Kecepatan | Kemiripan produksi | Kasus penggunaan |
|---|---|---|---|
| Docker | Sangat cepat | Rendah-menengah | Testing harian, CI |
| Vagrant | Sedang | Sedang | VM lokal dengan VirtualBox/VMware |
| Cloud (AWS, GCP, Azure) | Lambat | Tinggi | Release candidate, golden image |
Note
Container Docker tidak menjalankan systemd, sehingga resource service tidak bisa dikelola seperti di node penuh. Untuk cookbook yang mengelola service, gunakan image dokken yang menyertakan supervisor, atau pindah ke driver Vagrant untuk verifikasi yang lebih realistis.
Ubah driver cukup dengan mengganti nilai driver.name dan menyesuaikan driver_config. Untuk cloud, Kitchen memakai plugin seperti kitchen-ec2 yang membaca kredensial dari environment — kredensial tidak boleh ditulis di kitchen.yml.
Perintah utama Kitchen mengikuti siklus dasar. Untuk mencontohkan, mari jalankan instance dan menerapkan cookbook:
kitchen create
kitchen converge webserver-default
kitchen listkitchen list menampilkan state semua instance (created, converged, atau destroyed). Setelah converge, verifikasi dengan InSpec. Jika verifikasi gagal, perbaiki cookbook dan jalankan kitchen converge && kitchen verify lagi — iterasi ini adalah denyut nadi pengembangan berbasis test. Setelah puas, bersihkan lingkungan:
kitchen destroyUntuk satu putaran penuh dalam satu perintah, gunakan kitchen test yang menjalankan create, converge, verify, dan destroy secara berurutan — persis alur yang diinginkan CI.
Verifikasi ditulis sebagai profil InSpec sederhana di direktori test/integration/<nama-suite>/. Resource InSpec bekerja deklaratif: describe memeriksa suatu properti dan it menegaskan ekspektasinya.
describe package('nginx') do
it { should be_installed }
end
describe service('nginx') do
it { should be_enabled }
it { should be_running }
end
describe port(80) do
it { should be_listening }
end
describe file('/etc/nginx/nginx.conf') do
it { should exist }
it { should be_owned_by 'root' }
endVerifikasi ini membaca fakta langsung dari instance hasil converge — bukan dari janji di cookbook. Jika recipe hanya memasang paket tanpa menyalakan service, verifikasi should be_running akan gagal dan memaksa kalian memperbaikinya. Itulah tujuan sebenarnya: harapan ditulis lebih dulu, kode dipaksa memenuhinya.
Tip
Beri nama suite sesuai skenario, bukan sekadar "default": nginx-basic, php-fpm-hardened, atau app-multinode. Nama suite menentukan nama instance dan direktori verifikasi, sehingga skenario yang berbeda tidak saling menimpa.
Kekuatan penuh Kitchen muncul saat ia berjalan otomatis di CI: setiap pull request yang mengubah cookbook diuji terhadap instance nyata sebelum di-review. Dengan driver Docker, tidak perlu mesin khusus — runner cukup menjalankan perintah standar.
name: test-cookbook
on:
pull_request:
jobs:
kitchen:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Chef Workstation
run: |
curl -L https://omnitruck.chef.io/install.sh | sudo bash -s -- -P chef-workstation
- name: Test Kitchen
run: kitchen testUntuk Jenkins, polanya sama — job dijalankan oleh agent dengan Docker dan Chef Workstation terpasang, lalu mengeksekusi kitchen test sebagai langkah terakhir. Kunci sukses di CI: pastikan kitchen.yml tidak bergantung pada path lokal, dan beri image Docker yang eksplisit agar deterministik.
Episode 18 menutup siklus pengembangan dengan Test Kitchen sebagai jembatan antara penulisan dan pembuktian: kitchen.yml sebagai kontrak tiga bagian, driver sebagai pilihan medan tempur, alur converge-verify-destroy sebagai ritme kerja, verifikasi InSpec sebagai hakim, dan CI sebagai penjaga permanen.
Inti yang harus dibawa pulang:
Di episode 19 kita akan berpindah dari "bagaimana menguji" ke "bagaimana mengoperasikan": performance & troubleshooting — menganalisis chef-client run, penjadwalan dengan systemd timer atau cron, caching, dan solusi untuk masalah-masalah umum di lapangan. Sampai jumpa!