Aller au contenu
CI/CD & Automatisation medium

Notifications ArgoCD : alerter sur Slack, Teams ou webhook

8 min de lecture

Une synchronisation échoue à 3 h du matin et personne ne le sait avant l'ouverture. Les notifications ArgoCD ferment ce trou : elles préviennent sur Slack, Teams, e-mail ou webhook au moment précis où un événement se produit. Ce guide configure une notification de bout en bout (service, template, trigger, abonnement) avec des sorties réelles capturées sur un cluster k3d (ArgoCD v3.4.5). Public : personnes qui exploitent ArgoCD. Prérequis : ArgoCD installé et une Application déployée.

  • Comprendre les quatre briques : service, template, trigger, abonnement
  • Configurer un service de notification (Slack, webhook)
  • Écrire un template et un trigger corrects (et éviter le piège d'échappement)
  • Abonner une Application à un trigger
  • Vérifier qu'une notification part réellement

Depuis ArgoCD 2.x, le moteur de notifications est intégré à l'installation : un pod argocd-notifications-controller tourne dans le namespace argocd (image quay.io/argoproj/argocd:v3.4.5, la même que le reste). Rien à installer à part. Il lit sa configuration dans deux objets :

  • argocd-notifications-cm (ConfigMap) : services, templates, triggers.
  • argocd-notifications-secret (Secret) : les jetons et identifiants (token Slack, mot de passe SMTP).

Le fonctionnement repose sur quatre briques qui s'enchaînent :

BriqueRôle
ServiceComment envoyer (Slack, Teams, webhook, e-mail)service.<type>.<nom>
TemplateQuoi envoyer (le message)template.<nom>
TriggerQuand envoyer (la condition)trigger.<nom>
AbonnementQui reçoit (quelle Application, quel canal)annotation sur l'Application

Le service décrit le canal. Voici un service webhook générique, puis l'exemple Slack qui est le plus courant en équipe.

apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-notifications-cm
namespace: argocd
data:
service.webhook.echo: |
url: http://mon-recepteur.default.svc.cluster.local:8080/
headers:
- name: Content-Type
value: application/json
service.slack: |
token: $slack-token # référence une clé du Secret argocd-notifications-secret

Le $slack-token ne contient pas le jeton en clair : il pointe vers une clé du Secret. On y met le vrai token :

Fenêtre de terminal
kubectl -n argocd patch secret argocd-notifications-secret \
--type merge -p '{"stringData":{"slack-token":"xoxb-votre-token"}}'

Écrire un template (et éviter le piège d'échappement)

Section intitulée « Écrire un template (et éviter le piège d'échappement) »

Le template définit le corps du message. Pour un webhook JSON, le body doit être du JSON valide, écrit tel quel :

template.app-synced: |
webhook:
echo:
method: POST
body: |
{"texte": "Application {{.app.metadata.name}} synchronisee, revision {{.app.status.sync.revision}}, statut {{.app.status.sync.status}}"}

Les variables {{.app.*}} viennent de l'objet Application : metadata.name, status.sync.revision, status.sync.status, status.health.status, etc.

Le trigger associe une condition à un ou plusieurs templates. La condition est une expression évaluée sur l'Application :

trigger.on-sync-ok: |
- when: app.status.operationState.phase in ['Succeeded']
send: [app-synced]

ArgoCD fournit aussi des triggers prêts à l'emploi qu'il suffit d'activer : on-sync-succeeded, on-sync-failed, on-health-degraded, on-sync-running. En production, on-sync-failed et on-health-degraded sont les deux à brancher en priorité.

Un trigger ne fait rien tant qu'une Application ne s'y abonne pas. L'abonnement est une annotation sur l'Application, de la forme notifications.argoproj.io/subscribe.<trigger>.<service> :

Fenêtre de terminal
kubectl -n argocd annotate app guestbook \
notifications.argoproj.io/subscribe.on-sync-ok.echo=""

Pour Slack, on met le nom du canal en valeur :

Fenêtre de terminal
kubectl -n argocd annotate app guestbook \
notifications.argoproj.io/subscribe.on-sync-failed.slack="equipe-ops"

C'est l'étape qu'on oublie et qui fait perdre des heures. Après avoir configuré et abonné, on déclenche l'événement (une synchro) et on lit les logs du contrôleur. Voici la sortie réelle sur le cluster, une fois la config correcte :

Start processing resource=argocd/guestbook
Trigger 'on-sync-ok' TRIGGERED | templates: [app-synced] resource=argocd/guestbook
Sending notification about condition 'on-sync-ok.[0]...' to '{echo}'
using the configuration in namespace argocd resource=argocd/guestbook

Ces trois lignes prouvent que la chaîne complète fonctionne : la condition est évaluée (TRIGGERED), le template est résolu ([app-synced]) et l'envoi part vers le service (to '{echo}'). Si le service distant est injoignable, une ligne d'erreur suit (request failed: ... connection timed out) : le trigger est bon, c'est le réseau ou l'URL qu'il faut corriger.

Fenêtre de terminal
kubectl -n argocd logs deploy/argocd-notifications-controller --tail=20
SymptômeCause probableSolution
unrecognized character U+005CGuillemets sur-échappés dans le templateÉditer la config dans un fichier YAML (apply -f), JSON sans backslashes
Trigger jamais déclenchéApplication non abonnéeAjouter l'annotation notifications.argoproj.io/subscribe.<trigger>.<service>
TRIGGERED mais rien reçuService distant injoignableVérifier l'URL / le token / le réseau (connection timed out dans les logs)
Token Slack refuséSecret mal référencéVérifier $slack-token dans la CM et la clé dans argocd-notifications-secret
Aucune ligne dans les logsContrôleur pas rechargékubectl -n argocd rollout restart deploy/argocd-notifications-controller
  • Le moteur de notifications est intégré à ArgoCD : le pod argocd-notifications-controller tourne déjà.
  • Quatre briques : service (comment), template (quoi), trigger (quand), abonnement (qui).
  • Les secrets (token Slack, SMTP) vont dans argocd-notifications-secret, jamais dans la ConfigMap.
  • Piège n°1 : éditer la config en ligne de commande sur-échappe les guillemets JSON (U+005C). Passer par un fichier YAML.
  • Piège n°2 : un trigger sans abonnement ne fait rien. L'abonnement est une annotation sur l'Application.
  • Pour valider, lire les logs du contrôleur : Trigger ... TRIGGERED + Sending notification prouvent que la chaîne marche.
  • En production, brancher d'abord on-sync-failed et on-health-degraded.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn