Kendalikan lifecycle deployment dengan Resource Hooks: hook PreSync untuk migrasi database, PostSync untuk smoke test, SyncFail untuk rollback, dan pengaturan urutan eksekusinya.

Di episode 12 sebelumnya kita mengamankan secret agar bisa hidup di GitOps. Tapi ada pertanyaan yang menggantung sejak awal seri: bagaimana menjalankan aksi tambahan di sekitar proses sync? Aplikasi yang melakukan migrasi database sebelum rilis, smoke test setelah deploy, atau backup sebelum perubahan besar — semua itu butuh eksekusi terkoordinasi, bukan sekadar "apply manifest". Pada episode ini kita membahas Resource Hooks: mekanisme ArgoCD untuk menjalankan job di titik-titik tertentu dari siklus hidup sync.
Mengapa ini penting? Deployment yang baik bukan hanya menaruh gambar yang benar, tapi juga menangani efek sampingnya: skema database, verifikasi kesehatan, pemberitahuan, hingga pemulihan saat gagal. Hooks adalah cara ArgoCD menyuntikkan logika tersebut tanpa meninggalkan paradigma GitOps — semua hook hidup di Git sebagai manifest biasa.
Setiap sync ArgoCD berjalan dalam lima fase berurutan:
| Fase | Posisi | Contoh pemakaian |
|---|---|---|
| PreSync | Sebelum resource utama | Migrasi DB, backup, validasi |
| Sync | Resource utama di-deploy | Deployment, Service, ConfigMap |
| PostSync | Setelah resource utama | Smoke test, notifikasi, inisialisasi cache |
| SyncFail | Hanya saat fase di atas gagal | Rollback, alert |
| Skip | Hook gagal → seluruh sync dibatalkan | Gate kondisi tertentu |
Hook adalah resource (biasanya Job) yang ditandai dengan annotation khusus. ArgoCD menjalankannya di fase yang sesuai, dan sync hanya lanjut ke fase berikutnya jika semua hook pada fase tersebut sukses.
Cara paling umum membuat hook adalah Kubernetes Job dengan annotation hook:
apiVersion: batch/v1
kind: Job
metadata:
name: db-migrate
namespace: billing-prod
annotations:
argocd.argoproj.io/hook: PreSync
argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
spec:
template:
spec:
restartPolicy: Never
containers:
- name: migrate
image: ghcr.io/devnull/billing-api:1.2.0
command: ["bundle", "exec", "rails", "db:migrate"]Saat sync dimulai, ArgoCD melihat annotation argocd.argoproj.io/hook: PreSync dan menjalankan job ini sebelum me-deploy resource utama. Jika job selesai dengan exit code 0, sync berlanjut; jika gagal, sync dihentikan di fase PreSync.
Karena hook hanya dibutuhkan saat sync, ArgoCD perlu tahu kapan harus membersihkannya. Annotation argocd.argoproj.io/hook-delete-policy mengatur ini:
| Policy | Efek |
|---|---|
BeforeHookCreation | Hapus hook dari sync sebelumnya sebelum hook baru dibuat |
HookSucceeded | Hapus hook setelah berhasil |
HookFailed | Hapus hook setelah gagal |
Kombinasi dipisah koma, misal HookSucceeded, HookFailed — hook dibersihkan apa pun hasilnya.
Pola paling klasik: jalankan migrasi sebelum Deployment baru naik, sehingga schema dan aplikasi berubah dalam satu operasi atomik. Job db-migrate di atas adalah contohnya.
Untuk perubahan berisiko, jalankan hook PreSync yang mem-backup database atau volume ke penyimpanan terpisah — jadi ada jaring pengaman sebelum manifest baru diterapkan.
Setelah deploy selesai, jalankan hook PostSync yang memanggil endpoint aplikasi dan memverifikasi respons — misalnya mengecek GET /health mengembalikan 200:
apiVersion: batch/v1
kind: Job
metadata:
name: smoke-test
namespace: billing-prod
annotations:
argocd.argoproj.io/hook: PostSync
argocd.argoproj.io/hook-delete-policy: HookSucceeded
spec:
template:
spec:
restartPolicy: Never
containers:
- name: check
image: curlimages/curl:latest
command: ["curl", "-f", "https://api.billing.example.com/health"]Hook bisa menjadi ujung tombak alerting sederhana — misalnya hook SyncFail yang mengirim pesan ke chat, meskipun untuk kebutuhan ini notifikasi ArgoCD (episode 17) biasanya lebih rapi.
Jika sync gagal, hook SyncFail bisa mengeksekusi aksi pemulihan — misalnya menonaktifkan traffic, atau menjalankan skrip rollback dari image versi sebelumnya.
Warning
Hooks berjalan dalam konteks namespace destination, bukan di cluster tempat ArgoCD berada — kecuali untuk hook yang menargetkan resource level cluster. Pastikan image dan permission job tersedia di cluster tujuan.
Hook (dan semua resource) bisa diberi annotation argocd.argoproj.io/sync-wave untuk mengatur urutan eksekusi:
apiVersion: batch/v1
kind: Job
metadata:
name: db-migrate
annotations:
argocd.argoproj.io/hook: PreSync
argocd.argoproj.io/sync-wave: "1"Aturannya: resource dengan wave lebih kecil dijalankan lebih dulu; resource dengan wave sama dijalankan berurutan untuk hooks dan boleh paralel untuk resource sync biasa. Contoh nyata: migrasi DB (wave -1) sebelum Deployment (wave 0), lalu smoke test (wave 2). Urutan di dalam satu wave untuk hooks mengikuti urutan di manifest.
Tip
Gunakan wave negatif untuk pekerjaan yang harus mendahului semuanya (misal -1 untuk migrasi, -2 untuk backup) dan wave positif untuk yang harus menyusul (smoke test). Dengan begitu default resource tanpa annotation (wave 0) tidak perlu diubah.
Ketika hook gagal, cek status dan log-nya:
argocd app get billing --show-operation
kubectl get jobs -n billing-prod -l app.kubernetes.io/part-of=billing
kubectl logs job/db-migrate -n billing-prod --tail=100
kubectl describe job/db-migrate -n billing-prodargocd app get billing --show-operation menampilkan hasil tiap fase hook; jika sebuah hook tertahan, kubectl describe job biasanya langsung menunjukkan penyebabnya (image tidak ada, restart, permission). Jika hook meninggalkan Job lama karena policy yang salah, bersihkan manual dengan kubectl delete job --all -n billing-prod.
hook-delete-policy, Job dan Pod-nya menumpuk di namespace. Selalu tetapkan policy.BeforeHookCreation, job migrasi dari sync sebelumnya bisa jalan lagi dan gagal. Kombinasikan dengan policy yang tepat.Episode ini melengkapi pemahaman siklus hidup sync: lima fase (PreSync, Sync, PostSync, SyncFail, Skip), implementasi hook berbasis Job dengan annotation argocd.argoproj.io/hook, kebijakan penghapusan hook, use case migrasi DB, smoke test, backup, notifikasi, dan rollback, pengaturan urutan dengan sync wave, serta cara debugging saat hook bermasalah.
Poin yang harus kalian bawa:
argocd.argoproj.io/hook-delete-policy mencegah Job menumpuk.argocd app get --show-operation dan kubectl logs.Ada kalanya kita tidak ingin sync terjadi — misalnya jam maintenance atau masa freeze rilis. Di episode 14 selanjutnya kita membahas Sync Windows & Scheduling: window allow/deny berbasis cron, maintenance window, change freeze, dan override manual untuk emergency deployment. Sampai jumpa di episode 14!