Published on

Argo CD Notification으로 간단하게 Slack 알림 보내기

Authors
  • avatar
    Name
    Jay
    Twitter

2024.05.15 Updated

Argo CD Notification프로젝트가 ArgoCD에 merge되었다. 따라서 ArgoCD를 설치하면 Notification Controller가 같이 실행된다. cli도 아같이 통합되었다. 따라서 template을 통해서 Slack message를 보낼 때, 아래와 같이 실행할 수 있다.

argocd admin notifications \
template notify app-deployed-custom ${argocd_app_name} \
--recipient slack:${channel_name}

ArgoCD Image Updater를 통해서 Container Repository에 새로운 Image가 추가되었을 때, 자동으로 Argocd Application를 Sync하여 배포 할 수 있다. ArgoCD를 Kustomize와 ArgoCD Image Updater를 같이 사용할 때는 ArgoCD CD Notification의 trigger 기본 조건의 revision 값을 사용할 수 없다. ArgoCD Image Updater를 사용하면 revision은 유지되고, Kustomize로 Image만 변경된다.

trigger.on-deployed: |
  - description: Application is synced and healthy. Triggered once per commit.
    oncePer: app.status.sync.revision
    send:
    - app-deployed-custom
    when: app.status.operationState.phase in ['Succeeded'] and app.status.health.status == 'Healthy'

따라서 oncePer 조건을 아래와 같이 Kustomize의 값을 참조하여 작성할 수 있다. ArgoCD Image Updater가 업데이트하는 값을 참조하여 알림을 보내게 된다.

oncePer: app.status.operationState?.syncResult?.source?.kustomize?.images

Slack Permission

Bot Token Scopes에서 Bot User로 보내기 위해서 chat:write.public permission도 같이 부여 한다.

argocd notification slack permission

그리고 아래처럼 Bot User Oauth Token을 사용하여, App이 채널에 message를 보낼 수 있도록 한다.

argocd notification slack token

Kubernetes 설치

Argo CD notifcation controller을 아래처럼 설치한다.

kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj-labs/argocd-notifications/release-1.0/manifests/install.yaml

그리고 아래처럼 ConfigMap을 설치한다. argocd-notifications-cm ConfigMap에 알림을 보낸 message template들이 설정된다.

kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj-labs/argocd-notifications/release-1.0/catalog/install.yaml

위에서 설정한 Bot User Oauth Token<auth-token>에 넣어서 생성한다.

apiVersion: v1
kind: Secret
metadata:
  name: argocd-notifications-secret
stringData:
  slack-token: <auth-token>

그리고 이미 ConfigMap이 만들어져 있기 때문에, patch를 통해서 slack 설정을 추가한다.

kubectl patch cm argocd-notifications-cm -n argocd --type merge -p '{"data": {"service.slack": "{ token: $slack-token }" }}'

마지막으로 이미 ArgoCD에서 만들어진 App에 notification을 적용하고 싶으면, Annotation을 추가하면 된다. 아래처럼 ArgoCD CRD를 확인할 수 있다.

$ kubectl get app

NAME           SYNC STATUS   HEALTH STATUS
sample         Synced        Healthy

sync가 성공적으로 되었을 때, Slack notification을 보내고 싶으면 아래와 같이 annotation을 넣으면 된다.

kubectl patch app sample -p '{"metadata": {"annotations": {"notifications.argoproj.io/subscribe.on-sync-succeeded.slack":"channel_name"}}}' --type merge

이제 Argo CD에서 해당 Application에서 Sync가 성공적으로 진행되면 해당 슬랙 채널로 메세지가 가게 된다.

CLI

argocd-notification binary로 CLI를 제공한다. Kubernetes container에서 아래와 같이 명령어로 사용할 수 있다. 이렇게 applicaion_name에 Argo CD application 이름을 설정하고, channel_name은 보내고 싶은 채널을 적으면 테스트로 메세지를 보내볼 수 있다. 위의 과정에서 슬랙 메세지가 정상적으로 오지 않으면 이 CLI로 요청해서 slack에서 어떤 응답이 오는지 확인하여 디버깅 할 수 있다. channel_name@slack_username으로 보내면 user conversation에 메세지를 보내서 확인할 수 있다.

kubectl exec -it argocd-notifications-controller-5d78489bc8-fkb2x -- /app/argocd-notifications template notify app-deployed application_name --recipient slack:channel_name

Custom Template

Slack에 오는 message의 내용과 format을 변경하고 싶으면, 아래와 같이 내가 정의한 template를 argocd-notifications-cm ConfigMap에 추가하면 된다.

template.app-deployed-custom: |
  message: |
      {{if eq .app.metadata.name "sample"}}[test]{{end}}{{.app.metadata.name}} 정상적으로 배포가 완료되엇습니다.
  slack:
    attachments: |
      [{
        "title": "{{ .app.metadata.name}}",
        "color": "#18be52",
        "fields": [
        {
          "title": "Sync Status",
          "value": "{{.app.status.sync.status}}",
          "short": true
        },
        {
          "title": "Repository",
          "value": "{{.app.spec.source.repoURL}}",
          "short": true
        },
        {
          "title": "Revision",
          "value": "{{.app.status.sync.revision}}",
          "short": true
        }
        {{range $index, $c := .app.status.conditions}}
        {{if not $index}},{{end}}
        {{if $index}},{{end}}
        {
          "title": "{{$c.type}}",
          "value": "{{$c.message}}",
          "short": true
        }
        {{end}}
        ]
      }]

CLI를 통해서 내가 변경한 슬랙 메세지 template이 어떻게 보이는지 확인하고

kubectl exec -it argocd-notifications-controller-5d78489bc8-fkb2x -- /app/argocd-notifications template notify app-deployed-custom application_name --recipient slack:channel_name

그리고 마지막으로 trigger 조건에서 내가 만든 app-deployed-custom을 사용하도록 수정한다.

trigger.on-deployed: |
  - description: Application is synced and healthy. Triggered once per commit.
    oncePer: app.status.sync.revision
    send:
    - app-deployed-custom
    when: app.status.operationState.phase in ['Succeeded'] and app.status.health.status == 'Healthy'

이제 ArgoCD에서 새로운 revision으로 sync가 맞았을 때 슬랙 알림이 가게 된다.