Triggers
Triggers
알림을 보낼 조건을 정의하는 트리거 설정 방법입니다. 조건(condition)과 템플릿 참조로 구성되며, 조건 평가는 antonmedv/expr 엔진이 담당해요.
출처: 문서
본문
트리거는 알림을 보내야 할 조건을 정의합니다. 정의에는 이름, 조건, 알림 템플릿 참조가 포함됩니다. 조건은 알림을 보내야 하면 true 를 반환하는 술어(predicate) 표현식입니다. 트리거 조건 평가는 antonmedv/expr 엔진이 담당합니다. 조건 언어 문법은 language-definition.md 에 설명되어 있어요.
트리거는 argocd-notifications-cm ConfigMap 에서 구성합니다. 예를 들어 다음 트리거는 애플리케이션 동기화 상태가 Unknown 으로 바뀌면 app-sync-status 템플릿을 사용해 알림을 보냅니다:
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-notifications-cm
data:
trigger.on-sync-status-unknown: |
- when: app.status.sync.status == 'Unknown' # trigger condition
send: [app-sync-status, github-commit-status] # template names
각 조건은 여러 템플릿을 사용할 수 있습니다. 보통 각 템플릿은 서비스별 알림 부분을 생성하는 역할을 합니다. 위 예시에서 app-sync-status 템플릿은 email 과 Slack 알림을 만드는 방법을 "알고" 있고, github-commit-status 는 GitHub webhook 용 payload 를 생성하는 방법을 압니다.
조건 묶음 (Conditions Bundles)
트리거는 보통 관리자가 관리하며 언제, 어떤 알림을 보낼지에 대한 정보를 캡슐화합니다. 최종 사용자는 트리거를 구독하고 알림 대상을 지정하기만 하면 됩니다. 사용자 경험을 개선하기 위해 트리거는 여러 조건을 포함할 수 있고 각 조건마다 다른 템플릿 집합을 사용할 수 있어요. 예를 들어 다음 트리거는 sync 상태 연산의 모든 단계를 커버하고 각 경우에 다른 템플릿을 사용합니다:
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-notifications-cm
data:
trigger.sync-operation-change: |
- when: app.status?.operationState.phase in ['Succeeded']
send: [github-commit-status]
- when: app.status?.operationState.phase in ['Running']
send: [github-commit-status]
- when: app.status?.operationState.phase in ['Error', 'Failed']
send: [app-sync-failed, github-commit-status]
선택적 매니페스트 섹션·필드 접근 (Accessing Optional Manifest Sections and Fields)
위 트리거 예시에서 Application 의 status.operationState 섹션에 접근하는 데 ?. (옵셔널 체이닝) 연산자가 사용되는 점에 주목하세요. 이 섹션은 선택 사항이며, 연산이 시작되었지만 Application Controller 가 아직 시작하지 않은 경우에는 존재하지 않습니다.
?. 연산자를 쓰지 않으면 status.operationState 가 nil 로 해석되고 app.status.operationState.phase 표현식 평가가 실패합니다. app.status?.operationState.phase 표현식은 app.status.operationState != nil ? app.status.operationState.phase : nil 과 동일해요.
같은 알림을 너무 자주 보내지 않기 (Avoid Sending Same Notification Too Often)
어떤 경우 트리거 조건이 "깜빡이는(flapping)" 상황이 될 수 있습니다. 아래 예시가 그 문제를 보여줍니다. 이 트리거는 Argo CD 애플리케이션이 성공적으로 동기화되고 healthy 할 때 한 번 알림을 생성하도록 되어 있습니다. 하지만 애플리케이션 health 상태가 간헐적으로 Progressing 으로 바뀌었다가 다시 Healthy 로 돌아와 트리거가 불필요하게 여러 알림을 생성할 수 있어요. oncePer 필드는 해당 애플리케이션 필드가 변경될 때만 알림을 생성하도록 트리거를 구성합니다. 아래 예시의 on-deployed 트리거는 배포 리포지토리의 관찰된 Git revision 당 한 번만 알림을 보냅니다.
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-notifications-cm
data:
# Optional 'oncePer' property ensures that notification is sent only once per specified field value
# E.g. following is triggered once per sync revision
trigger.on-deployed: |
when: app.status?.operationState.phase in ['Succeeded'] and app.status.health.status == 'Healthy'
oncePer: app.status.sync.revision
send: [app-sync-succeeded]
Mono Repo 사용
하나의 저장소로 여러 애플리케이션을 동기화할 때 oncePer: app.status.sync.revision 필드가 커밋마다 알림을 트리거합니다. 모노 리포의 경우 oncePer: app.status?.operationState.syncResult.revision 구문을 사용하는 게 더 나은 접근입니다. 이렇게 하면 특정 Application 의 revision 에 대해서만 알림이 보내집니다.
oncePer
oncePer 필드는 다음과 같이 지원됩니다.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
annotations:
example.com/version: v0.1
oncePer: app.metadata.annotations["example.com/version"]
기본 트리거 (Default Triggers)
어노테이션에 개별 트리거를 지정하는 대신 defaultTriggers 필드를 사용할 수 있어요.
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-notifications-cm
data:
# Holds list of triggers that are used by default if trigger is not specified explicitly in the subscription
defaultTriggers: |
- on-sync-status-unknown
defaultTriggers.mattermost: |
- on-sync-running
- on-sync-succeeded
defaultTriggers 를 사용하려면 어노테이션을 다음과 같이 지정합니다. 이 예시에서 slack 은 on-sync-status-unknown 일 때 보내지고, mattermost 는 on-sync-running 과 on-sync-succeeded 일 때 보내집니다.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
annotations:
notifications.argoproj.io/subscribe.slack: my-channel
notifications.argoproj.io/subscribe.mattermost: my-mattermost-channel
함수 (Functions)
트리거는 내장 함수 집합에 접근할 수 있습니다.
예시:
when: time.Now().Sub(time.Parse(app.status?.operationState.startedAt)).Minutes() >= 5
time
시간 관련 함수.
로컬 시간대 구성 (Configuring the local timezone)
time 함수는 알림 템플릿과 트리거 양쪽에서 모두 사용할 수 있습니다.
.Local() 을 사용해 시간 값을 로컬 시간으로 변환할 때, Argo CD Notifications 는 argocd-notifications-controller 컨테이너에 구성된 로컬 시간대를 사용합니다.
이 시간대는 argocd-notifications-controller 컨테이너에 TZ 환경 변수를 설정해 구성할 수 있어요:
apiVersion: apps/v1
kind: Deployment
metadata:
name: argocd-notifications-controller
spec:
template:
spec:
containers:
- name: argocd-notifications-controller
env:
- name: TZ
value: Asia/Tokyo
예를 들어 알림 템플릿이 구성된 로컬 시간대로 애플리케이션 타임스탬프를 서식화할 수 있습니다:
{{ (call .time.Parse .app.status.operationState.startedAt).Local.Format "2006-01-02T15:04:05Z07:00" }}
time.Now() Time
Golang 내장 time.Now 함수를 실행합니다. Golang Time 인스턴스를 반환합니다.
time.Parse(val string) Time
지정된 문자열을 RFC3339 레이아웃으로 파싱합니다. Golang Time 인스턴스를 반환합니다.
시간 관련 상수.
Durations
time.Nanosecond = 1
time.Microsecond = 1000 * Nanosecond
time.Millisecond = 1000 * Microsecond
time.Second = 1000 * Millisecond
time.Minute = 60 * Second
time.Hour = 60 * Minute
Timestamps
시간 인스턴스를 문자열로 서식화할 때 사용합니다 (예: time.Now().Format(time.RFC3339)).
time.Layout = "01/02 03:04:05PM '06 -0700" // The reference time, in numerical order.
time.ANSIC = "Mon Jan _2 15:04:05 2006"
time.UnixDate = "Mon Jan _2 15:04:05 MST 2006"
time.RubyDate = "Mon Jan 02 15:04:05 -0700 2006"
time.RFC822 = "02 Jan 06 15:04 MST"
time.RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
time.RFC850 = "Monday, 02-Jan-06 15:04:05 MST"
time.RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST"
time.RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
time.RFC3339 = "2006-01-02T15:04:05Z07:00"
time.RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
time.Kitchen = "3:04PM"
// Handy time stamps.
time.Stamp = "Jan _2 15:04:05"
time.StampMilli = "Jan _2 15:04:05.000"
time.StampMicro = "Jan _2 15:04:05.000000"
time.StampNano = "Jan _2 15:04:05.000000000"
strings
문자열 관련 함수.
strings.ReplaceAll() string
Golang 내장 strings.ReplaceAll 함수를 실행합니다.
strings.ToUpper() string
Golang 내장 strings.ToUpper 함수를 실행합니다.
strings.ToLower() string
Golang 내장 strings.ToLower 함수를 실행합니다.
sync
sync.GetInfoItem(app map, name string) string
Argo CD App sync 연산에 저장된 주어진 이름의 info 항목 값을 반환합니다.
repo
Application 소스 리포지토리에 대한 추가 정보를 제공하는 함수.
repo.RepoURLToHTTPS(url string) string
주어진 GIT URL 을 HTTPs 형식으로 변환합니다.
repo.FullNameByRepoURL(url string) string
리포지토리 URL 의 전체 이름 (<owner>/<repoName>) 을 반환합니다. 현재는 Github, GitLab, Bitbucket 만 지원합니다.
repo.QueryEscape(s string) string
QueryEscape 는 문자열을 이스케이프해 URL 안에 안전하게 넣을 수 있게 합니다.
예시:
/projects/{{ call .repo.QueryEscape (call .repo.FullNameByRepoURL .app.status.RepoURL) }}/merge_requests
repo.GetCommitMetadata(sha string) CommitMetadata
커밋 메타데이터를 반환합니다. 커밋은 애플리케이션 소스 리포지토리에 속해야 합니다. CommitMetadata 필드:
-
Message string커밋 메시지 -
Author string- 커밋 작성자 -
Date time.Time- 커밋 생성 날짜 -
Tags []string- 연결된 태그
repo.GetAppDetails() AppDetail
애플리케이션 상세 정보를 반환합니다. AppDetail 필드:
-
Type string- AppDetail 타입 -
Helm HelmAppSpec- Helm 상세 정보 -
필드:
-
Name string -
ValueFiles []string -
Parameters []*v1alpha1.HelmParameter -
Values string -
FileParameters []*v1alpha1.HelmFileParameter -
메서드:
-
GetParameterValueByName(Name string)Parameters 필드에서 이름으로 값을 가져옵니다 -
GetFileParameterPathByName(Name string)FileParameters 필드에서 이름으로 경로를 가져옵니다 -
Kustomize *apiclient.KustomizeAppSpec- Kustomize 상세 정보 -
Directory *apiclient.DirectoryAppSpec- Directory 상세 정보
더 알아보기 (Learn more)
- 템플릿 구성: templates
- 기본 트리거 카탈로그: notifications catalog