Slack

Slack

argocd-notifications 로 Slack 메시지를 보내는 방법입니다. Slack 앱을 만들어 채널에 배포·동기화 상태 등을 알릴 수 있어요.

출처: 문서

본문

incoming webhook 으로 메시지를 보내고 싶다면 webhook 문서의 "Send Slack" 섹션을 사용할 수 있어요.

파라미터 (Parameters)

Slack 알림 서비스 구성에는 다음 설정이 포함됩니다:

| 옵션 | 필수 | 타입 | 설명 | 예시 | | apiURL | False | string | 서버 URL. | https://example.com/api | | channels | False | list[string] | | ["my-channel-1", "my-channel-2"] | | icon | False | string | 앱 아이콘. | :robot_face: 또는 https://example.com/image.png | | insecureSkipVerify | False | bool | | true | | signingSecret | False | string | | 8f742231b10e8888abcd99yyyzzz85a5 | | token | True | string | 앱의 OAuth 액세스 토큰. | «redacted:xox…» | | username | False | string | 앱 사용자 이름. | argocd | | disableUnfurl | False | bool | 메시지에서 슬랙 링크 unfurling 을 비활성화합니다. | true | | maxIdleConns | False | int | 모든 호스트를 통틀어 유휴(keep-alive) 연결의 최대 수. | — | | maxIdleConnsPerHost | False | int | 호스트당 유휴(keep-alive) 연결의 최대 수. | — | | maxConnsPerHost | False | int | 호스트당 총 연결의 최대 수. | — | | idleConnTimeout | False | string | 유휴(keep-alive) 연결이 닫히기 전에 유지될 최대 시간 (예: 90s). | — |

설정 (Configuration)

  • https://api.slack.com/apps?new_app=1 로 Slack 앱을 만듭니다

  • 앱이 만들어지면 OAuth & Permissions 로 이동합니다

  • Scopes > Bot Token Scopes > Add an OAuth Scope 로 갑니다. chat:write 스코프를 추가하세요. Slack 알림 서비스에서 선택적인 username/icon 오버라이드를 쓰려면 chat:write.customize 스코프도 추가합니다.

  • OAuth & Permission > OAuth Tokens for Your Workspace > Install to Workspace

  • 설치가 완료되면 OAuth 토큰을 복사합니다.

  • 이 예시에서는 my_channel 이라는 공개 또는 비공개 채널을 만듭니다

  • 슬랙 봇을 이 채널로 초대해야 채널에 알림을 전달할 수 있어요

  • argocd-notifications-secret secret 에 OAuth 액세스 토큰을 저장합니다

  apiVersion: v1
  kind: Secret
  metadata:
      name: <secret-name>
  stringData:
      slack-token: <OAuth-access-token>

  • argocd-notifications-cm configmap 의 data 섹션에 service 타입 slack 을 정의합니다:
  apiVersion: v1
  kind: ConfigMap
  metadata:
    name: argocd-notifications-cm
  data:
    service.slack: |
      token: $slack-token

  • 특정 argocd 앱에 대해 알림을 활성화하려면 application yaml 파일에 annotation 을 추가합니다. 다음 예시는 on-sync-succeeded 트리거를 사용합니다:
  apiVersion: argoproj.io/v1alpha1
  kind: Application
  metadata:
    annotations:
      notifications.argoproj.io/subscribe.on-sync-succeeded.slack: my_channel

  • 여러 트리거, 여러 대상(destination)과 수신자(recipient)를 가진 annotation
  apiVersion: argoproj.io/v1alpha1
  kind: Application
  metadata:
    annotations:
      notifications.argoproj.io/subscriptions: |
        - trigger: [on-scaling-replica-set, on-rollout-updated, on-rollout-step-completed]
          destinations:
            - service: slack
              recipients: [my-channel-1, my-channel-2]
            - service: email
              recipients: [recipient-1, recipient-2, recipient-3 ]
        - trigger: [on-rollout-aborted, on-analysis-run-failed, on-analysis-run-error]
          destinations:
            - service: slack
              recipients: [my-channel-21, my-channel-22]

템플릿 (Templates)

알림 템플릿은 Slack 메시지 blocks 와 attachments 기능을 활용하도록 커스터마이즈할 수 있습니다.

message blocks 와 attachments 는 slack 필드 아래의 blocksattachments 문자열 필드에 지정할 수 있어요:

template.app-sync-status: |
  message: |
    Application {{.app.metadata.name}} sync is {{.app.status.sync.status}}.
    Application details: {{.context.argocdUrl}}/applications/{{.app.metadata.name}}.
  slack:
    attachments: |
      [{
        "title": "{{.app.metadata.name}}",
        "title_link": "{{.context.argocdUrl}}/applications/{{.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
        }]
      }]

각 메시지에 대해 아이콘과 사용자 이름을 지정하고 싶다면 slack 필드에서 usernameicon 값을 지정할 수 있어요. 아이콘에는 서비스 정의에서처럼 이모지와 이미지 URL 을 지정할 수 있습니다. 템플릿에 usernameicon 을 설정하면, 서비스 정의에 값이 지정돼 있어도 템플릿에서 설정한 값이 사용됩니다.

template.app-sync-status: |
  message: |
    Application {{.app.metadata.name}} sync is {{.app.status.sync.status}}.
    Application details: {{.context.argocdUrl}}/applications/{{.app.metadata.name}}.
  slack:
    username: "testbot"
    icon: https://example.com/image.png
    attachments: |
      [{
        "title": "{{.app.metadata.name}}",
        "title_link": "{{.context.argocdUrl}}/applications/{{.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
        }]
      }]

메시지는 slack 필드 아래의 groupingKey 문자열 필드에 지정할 수 있는 그룹핑 키로 슬랙 스레드에 모을 수 있어요. groupingKey 는 각 템플릿에 걸쳐 사용되며 각 슬랙 채널에서 독립적으로 동작합니다. 여러 애플리케이션이 동시에 또는 자주 갱신될 때, git commit 해시·애플리케이션 이름 등으로 모으면 슬랙 채널의 메시지를 쉽게 읽을 수 있어요. 또한 notifyBroadcast 필드로 특정 템플릿에서 채널로 브로드캐스트할 수도 있습니다.

template.app-sync-status: |
  message: |
    Application {{.app.metadata.name}} sync is {{.app.status.sync.status}}.
    Application details: {{.context.argocdUrl}}/applications/{{.app.metadata.name}}.
  slack:
    attachments: |
      [{
        "title": "{{.app.metadata.name}}",
        "title_link": "{{.context.argocdUrl}}/applications/{{.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
        }]
      }]
    # git commit 해시로 메시지를 스레드에 모음
    groupingKey: "{{.app.status.sync.revision}}"
    notifyBroadcast: false
template.app-sync-failed: |
  message: |
    Application {{.app.metadata.name}} sync is {{.app.status.sync.status}}.
    Application details: {{.context.argocdUrl}}/applications/{{.app.metadata.name}}.
  slack:
    attachments: |
      [{
        "title": "{{.app.metadata.name}}",
        "title_link": "{{.context.argocdUrl}}/applications/{{.app.metadata.name}}",
        "color": "#ff0000",
        "fields": [{
          "title": "Sync Status",
          "value": "{{.app.status.sync.status}}",
          "short": true
        }, {
          "title": "Repository",
          "value": "{{.app.spec.source.repoURL}}",
          "short": true
        }]
      }]
    # git commit 해시로 메시지를 스레드에 모음
    groupingKey: "{{.app.status.sync.revision}}"
    notifyBroadcast: true

메시지는 slack 필드 아래의 deliveryPolicy 문자열 필드에 따라 보내집니다. 가능한 모드는 Post (기본값), PostAndUpdate, Update 입니다. PostAndUpdateUpdate 설정은 groupingKey 가 설정돼 있어야 합니다.

더 알아보기 (Learn more)