Pantaunya lebih cepat dengan argocd-notifications: kirim notifikasi sync, health, dan kegagalan ke Slack, Teams, email, atau webhook lewat trigger, template, dan subscription.

Di episode 16 sebelumnya kita mengotomasi update image — dan otomasi menimbulkan kebutuhan baru: tahu apa yang terjadi. Ketika Image Updater mengubah tag di malam hari, siapa yang tahu? Ketika sync gagal di production, siapa yang di-page? Jawabannya ada di argocd-notifications: sistem notifikasi bawaan ArgoCD yang mengirim pesan ke Slack, Teams, email, webhook, hingga status GitHub/GitLab — semua dikonfigurasi lewat YAML di Git.
Mengapa ini penting? Deploy yang tidak terlihat adalah sumber kecemasan terbesar tim operasional. Notifikasi yang tepat mengubah peran tim dari "menebak-nebak apakah deploy sukses" menjadi "menunggu informasi yang pasti". Lebih dari itu, notifikasi adalah lapisan pertama observability — yang akan kita lengkapi dengan metrik dan logging di episode 22.
Sejak ArgoCD v2.4, notifikasi sudah terintegrasi ke dalam application controller — tidak perlu binary terpisah. Semua konfigurasi hidup di dua objek:
argocd-notifications-cm — berisi trigger, template, service, dan subscription.argocd-notifications-secret — berisi token/kredensial channel.Arsitekturnya tiga konsep inti:
| Konsep | Fungsi |
|---|---|
| Trigger | Kondisi yang menentukan kapan notifikasi dikirim |
| Template | Format pesan yang menentukan apa yang dikirim |
| Subscription | Pengikat trigger + template ke channel tertentu |
Trigger adalah kondisi (dievaluasi dari status Application) yang memicu notifikasi. Contoh bawaan: on-sync-succeeded, on-sync-failed, on-health-degraded. Definisi trigger:
trigger.on-sync-succeeded: |
- when: app.status.sync.status in ('Synced')
send: [app-sync-succeeded]
trigger.on-deploy-failed: |
- when: app.status.health.status in ('Degraded') and app.status.sync.status in ('OutOfSync')
send: [deploy-failed]Field when memakai ekspresi (bisa berisi logika AND/OR), dan send merujuk nama template yang akan dipakai.
Note
Kondisi trigger dibaca dari status Application — untuk menguji ekspresi yang rumit, gunakan argocd app get <nama> dulu untuk melihat nilai status.sync.status dan status.health.status yang sebenarnya.
Template mendefinisikan isi pesan. Bisa memakai variabel dari Application dan kondisional:
template.app-sync-succeeded: |
message: |
✅ Application {{.app.metadata.name}} berhasil di-sync.
Environment: {{.app.spec.destination.namespace}}
slack:
attachments: |
[{ "color": "#2eb886", "title": "Deploy sukses" }]
template.deploy-failed: |
message: |
⚠️ Deploy {{.app.metadata.name}} GAGAL!
Sync: {{.app.status.sync.status}} | Health: {{.app.status.health.status}}Variabel seperti app.metadata.name diisi dari object Application; blok if/else memungkinkan pesan berubah sesuai kondisi (misal menampilkan namespace hanya jika ada). Pesan bisa berformat teks biasa atau attachment kaya untuk Slack/Teams.
Warning
Template memakai sintaks Go template dengan kurung kurawal ganda — dan hanya valid di dalam ConfigMap (YAML). Jangan pernah menulis ekspresi seperti app.metadata.name yang dibungkus kurung kurawal ganda di teks narasi biasa karena akan diinterpolasi secara keliru.
Subscription menentukan siapa menerima notifikasi apa. Dua cara:
subscriptions: |
- recipients:
- slack:deployments
triggers:
- on-sync-succeeded
- on-sync-failed
- recipients:
- email:ops@company.com
triggers:
- on-health-degradedapiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: billing-api
namespace: argocd
annotations:
notifications.argoproj.io/subscribe.on-sync-succeeded.slack: deployments
notifications.argoproj.io/subscribe.on-sync-failed.email: ops@company.comPola annotation-nya: notifications.argoproj.io/subscribe.<trigger>.<service>: <recipient>. Ini memberi kontrol granular — aplikasi kritikal bisa mengirim ke channel berbeda.
Koneksi ke kanal dikonfigurasi sebagai service di ConfigMap, dan token disimpan di Secret:
service.slack: |
token: $slack-token
service.webhook: |
url: https://hooks.example.com/gitopsapiVersion: v1
kind: Secret
metadata:
name: argocd-notifications-secret
namespace: argocd
stringData:
slack-token: xoxb-XXXX-YYYYChannel yang didukung out of the box:
| Service | Penerima | Khasiat |
|---|---|---|
| Slack | slack:<channel> | Notifikasi tim, cepat dan kaya format |
| Microsoft Teams | teams:<webhook> | Integrasi enterprise |
| Email (SMTP) | email:<alamat> | Arsip formal, audit |
| Webhook | webhook:<url> | Integrasi custom/API internal |
| GitHub/GitLab | Commit status | Status deploy di halaman PR |
Service GitHub/GitLab (service.github-commit-status) memasang status pada commit — sangat berguna: review PR langsung melihat tanda deploy sukses/gagal tanpa buka ArgoCD.
on-sync-succeeded memberi kepastian ke tim bahwa perubahan sudah live.on-sync-failed/on-health-degraded mengarahkan on-call ke aplikasi bermasalah lebih awal daripada menunggu user report.Sebelum menyebar ke banyak channel, uji dengan CLI:
argocd notify trigger billing-api on-sync-succeeded
argocd notify trigger billing-api on-deploy-failed
argocd notify broadcast "Test broadcast"argocd notify trigger menjalankan trigger secara paksa untuk aplikasi tertentu — cara paling cepat memverifikasi template dan koneksi channel tanpa menunggu event nyata.
argocd-notifications-secret); ConfigMap hanya menampung referensi seperti $slack-token.status.health.status) harus persis; kesalahan kecil menghasilkan pesan kosong. Uji dengan argocd notify trigger.when yang spesifik.Episode ini menutup lingkaran otomasi GitOps dengan observabilitas manusia: arsitektur trigger/template/subscription, konfigurasi di ConfigMap dan Secret, channel Slack/Teams/email/webhook/commit-status, trigger berdasarkan sync dan health, template dengan variabel dan kondisional, serta use case dari notifikasi deploy hingga audit trail.
Poin yang harus kalian bawa:
argocd notify trigger sebelum menyebar konfigurasi.Notifikasi memberi tahu kita bahwa sesuatu terjadi — tapi bagaimana event itu lahir di CI/CD? Di episode 18 selanjutnya kita merangkai semuanya dalam CI/CD Pipeline Integration: GitHub Actions, GitLab CI/CD, dan Jenkins yang membangun image, memperbarui manifest, dan menyerahkan sisanya ke ArgoCD. Sampai jumpa di episode 18!