Skip to main content




ArgoCD is a declarative, GitOps continuous delivery tool for Kubernetes. You can use ArgoCD to drive insights into values such as:

  • Deploys


Notification webhooks

To send Cortex information about syncs in ArgoCD, you can use ArgoCD notification Webhooks to call the Cortex flexible deploy REST endpoint.

Here is an example of what a argocd-notifications-cm config map may look like:

apiVersion: v1
kind: ConfigMap
context: |
service.webhook.cortex-webhook: |
- name: Content-Type
value: application/json
- name: Accept
value: application/json
- name: Authorization
value: Bearer $token
subscriptions: |
- recipients:
- cortex-webhook
- on-sync-succeeded |
method: POST
path: /api/v1/catalog/{{}}/deploys
body: |
{ "customData": { "Sync Status": "{{.app.status.sync.status}}","Sync Details": "{{.context.argocdUrl}}/applications/{{}}?operation=true" },
"environment": "{{}}",
"sha": "{{.app.status.operationState.operation.sync.revision}}",
"timestamp": "{{.app.status.operationState.finishedAt}}",
"title": "Sync by ArgoCD",
"type": "DEPLOY"
trigger.on-sync-succeeded: |
- send:
- app-sync-succeeded
when: app.status.operationState.phase in ['Succeeded']

The above example assumes your ArgoCD application's name matches the x-cortex-tag. In this case, each application in ArgoCD can subscribe to the same trigger.

If your application name doesn't match the x-cortex-tag, add a value/pair to the info section of the Application manifest. Then, instead of using in the url, use[0].value.

Subscribing application to webhooks

The last step is to subscribe your application to the webhook. You do this by adding a label annotation in the Application spec in the following format:<trigger-name>.<webhook-name>: ""

For example, if we want to subscribe an application to the example webhook above, our Application yaml may look something like this:

kind: Application
annotations: ""


Ensure the Cortex API Key is encoded correctly

Make sure the encoded Cortex API Key does not contain an extra line. Use a tool like to ensure your encoded key does not contain an extra line.

Check the ArgoCD logs

The notification webhook is managed by the argocd-notifications-controller which will have a pod running in your ArgoCD namespace.

Assuming the ArgoCD is running in the argocd namepsace, run the following command to get the list of pods:

kubectl get pods -n argocd

This will return a list of pods similar to the ones listed below:

NAME                                                READY   STATUS    RESTARTS   AGE
argocd-application-controller-0 1/1 Running 0 108d
argocd-applicationset-controller-69f96ccf5b-5jnpv 1/1 Running 0 108d
argocd-dex-server-5dff9c5998-j29zd 1/1 Running 0 80d
argocd-notifications-controller-6cd988b564-sql55 1/1 Running 0 107d
argocd-redis-54c687db9d-kdxwj 1/1 Running 0 80d
argocd-repo-server-6c6f8859c7-mrwll 1/1 Running 0 108d
argocd-server-b77b48886-s2mtg 1/1 Running 0 80d

In this example, the pod managing the webhook notifications is argocd-notifications-controller-6cd988b564-sql55. To get the logs, run the following command:

kubectl logs argocd-notifications-controller-6cd988b564-sql55 -n argocd

If your trigger was successful, you should seem something similar to this:

time="2023-07-19T02:41:13Z" level=info msg="Start processing" app=argocd/app-direct
time="2023-07-19T02:41:13Z" level=info msg="Trigger on-sync-succeeded result: [{[0].zxM90Et6k4Elb1-fHdjtDJq0xR0 [app-sync-succeeded] true}]" app=argocd/app-direct
time="2023-07-19T02:41:13Z" level=info msg="Notification about condition 'on-sync-succeeded.[0].zxM90Et6k4Elb1-fHdjtDJq0xR0' already sent to '{cortex-webhook }'" app=argocd/app-direct
time="2023-07-19T02:41:13Z" level=info msg="Processing completed" app=argocd/app-direct