Templates

Templates

알림 템플릿을 작성해 알림 내용을 생성하는 방법입니다. Go 의 html/template 패키지를 사용하므로 커스터마이즈 폭이 넓고, 하나의 템플릿을 여러 트리거가 재사용할 수 있어요.

출처: 문서

본문

알림 템플릿은 알림 내용을 생성하는 데 사용되며 argocd-notifications-cm ConfigMap 에서 구성합니다. 템플릿은 html/template golang 패키지를 활용하며 알림 메시지를 커스터마이즈할 수 있게 해줍니다. 템플릿은 재사용할 수 있게 설계되어 여러 트리거가 참조할 수 있어요.

아래 템플릿은 사용자에게 애플리케이션 동기화 상태를 알리는 데 사용됩니다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-notifications-cm
data:
  template.my-custom-template-slack-template: |
    message: |
      Application {{.app.metadata.name}} sync is {{.app.status.sync.status}}.
      Application details: {{.context.argocdUrl}}/applications/{{.app.metadata.name}}.

각 템플릿은 다음 필드에 접근할 수 있습니다:

  • app - 애플리케이션 오브젝트를 담습니다.

  • appProject - 애플리케이션에 연결된 AppProject 오브젝트를 담습니다. RBAC 역할·정책, 소스 리포지토리 제한, 대상 클러스터 제한 같은 프로젝트 수준의 세부 정보에 접근할 수 있게 해줍니다.

  • context - 사용자 정의 문자열 맵이며 어떤 문자열 키와 값도 포함할 수 있습니다.

  • secrets - argocd-notifications-secret 에 저장된 민감한 데이터에 접근할 수 있게 해줍니다

  • serviceType - 알림 서비스 타입 이름("slack" 이나 "email" 등) 을 담습니다. 이 필드로 서비스별 필드를 조건부로 렌더링할 수 있어요.

  • recipient - 수신자 이름을 담습니다.

사용자 정의 context 정의 (Defining user-defined context)

모든 알림 템플릿 간에 공유할 컨텍스트를 정의하려면 최상위 YAML 문서에 키-값 쌍을 설정하면 되고, 이를 템플릿 안에서 이렇게 사용할 수 있어요:

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-notifications-cm
data:
  context: |
    region: east
    environmentName: staging

  template.a-slack-template-with-context: |
    message: "Something happened in {{ .context.environmentName }} in the {{ .context.region }} data center!"

템플릿에서 AppProject 정보 사용 (Using AppProject information in templates)

템플릿은 appProject 변수를 사용해 Application 에 연결된 AppProject 에 접근할 수 있습니다. RBAC 정책, 소스 리포지토리, 대상 클러스터 같은 프로젝트 수준 정보를 알림에 포함하는 데 유용해요.

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-notifications-cm
data:
  template.app-project-info: |
    message: |
      Application {{.app.metadata.name}} belongs to project {{.appProject.metadata.name}}.
      Project description: {{.appProject.spec.description}}
      Allowed source repositories: {{range .appProject.spec.sourceRepos}}{{.}} {{end}}

  template.app-rbac-policies: |
    message: |
      Application: {{.app.metadata.name}}
      Project: {{.appProject.metadata.name}}
      RBAC Roles:
      {{range .appProject.spec.roles}}
      - Role: {{.name}}
        Policies: {{range .policies}}{{.}} {{end}}
      {{end}}

알림 템플릿에서 secrets 정의·사용 (Defining and using secrets within notification templates)

일부 알림 서비스 사용 사례는 템플릿 안에서 secret 을 사용해야 합니다. 이는 템플릿 안에서 사용 가능한 secrets 데이터 변수로 구현할 수 있어요.

다음 argocd-notifications-secret 이 있다고 가정합니다:

apiVersion: v1
kind: Secret
metadata:
  name: argocd-notifications-secret
stringData:
  sampleWebhookToken: secret-token
type: Opaque

정의된 sampleWebhookToken 을 템플릿에서 이렇게 사용할 수 있어요:

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-notifications-cm
data:
  template.trigger-webhook: |
      webhook:
        sample-webhook:
          method: POST
          path: 'webhook/endpoint/with/auth'
          body: 'token={{ .secrets.sampleWebhookToken }}&variables[APP_SOURCE_PATH]={{ .app.spec.source.path }}

알림 서비스별 필드 (Notification Service Specific Fields)

템플릿 정의의 message 필드는 어떤 알림 서비스에 대해서도 기본 알림을 만들 수 있게 해줍니다. 알림 서비스별 필드를 활용하면 복잡한 알림을 만들 수 있어요. 예를 들어 서비스별 필드로 Slack 은 blocks 와 attachments, Email 은 subject, Webhook 은 URL 경로와 body 를 추가할 수 있습니다. 자세한 내용은 해당 서비스 문서를 참고하세요.

시간대 변경 (Change the timezone)

알림에서 시간 값을 서식화할 때 사용하는 시간대를 바꾸려면 "로컬 시간대 구성" 섹션을 참고하세요.

함수 (Functions)

템플릿은 Sprig 패키지의 함수 같은 내장 함수 집합에 접근할 수 있습니다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-notifications-cm
data:
  template.my-custom-template-slack-template: |
    message: "Author: {{(call .repo.GetCommitMetadata .app.status.sync.revision).Author}}"

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)