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-secretsecret 에 OAuth 액세스 토큰을 저장합니다
apiVersion: v1
kind: Secret
metadata:
name: <secret-name>
stringData:
slack-token: <OAuth-access-token>
argocd-notifications-cmconfigmap 의 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 필드 아래의 blocks 와 attachments 문자열 필드에 지정할 수 있어요:
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 필드에서 username 과 icon 값을 지정할 수 있어요. 아이콘에는 서비스 정의에서처럼 이모지와 이미지 URL 을 지정할 수 있습니다. 템플릿에 username 과 icon 을 설정하면, 서비스 정의에 값이 지정돼 있어도 템플릿에서 설정한 값이 사용됩니다.
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 입니다. PostAndUpdate 와 Update 설정은 groupingKey 가 설정돼 있어야 합니다.
더 알아보기 (Learn more)
- incomming webhook 으로 Slack 에 보내기: webhook 서비스 문서
- 알림 템플릿·트리거: templates, triggers