Skip to main content

ArgoCD Notifications v1 Slack Config

argocd-notificationsv1.0.0がリリースされて ConfigMap が若干変わったのでメモ

このエントリーをはてなブックマークに追加
日付 内容
2020-01-26 v1.0.1 の内容で公開
2020-03-11 v1.0.2 の内容で更新

さて

v0.x to v1.0を見るとわかるがそれなりに破壊的変更があった。
ソースコードレベルでは一部しか見ていないので全部の変更についてはここには書かないし、Slackでしか使ってないのでそこだけ書く。

ちなみに v0.x の設定はdeprecatedなだけでまだ使える。

v0.xのSlackの設定

まずは今までどうやって書いていたかを書く。

ConfigMap

ビルトインとしていくつかのトリガーが存在したのでそれを有効にする。

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-notifications-cm
data:
  config.yaml: |
    triggers:
    - name: on-sync-status-unknown
      enabled: true
    - name: on-sync-failed
      enabled: true
    - name: on-sync-running
      enabled: true
    - name: on-sync-succeeded
      enabled: true
    - name: on-health-degraded
      enabled: true    

annotations

下記のようなアノテーションをつけると通知された。

metadata:
  annotations:
    recipients.argocd-notifications.argoproj.io: slack:my-channel

v1.0.0のSlackの設定

まずは提供されているマニフェストを適用する。
v1.0.0 からは2種類提供されるようになっていてcontrollercatalogである。

controllercontroller で、catalog は通知する内容のテンプレート等が書かれている。
これを適用したら ConfigMapannotations を追加する。

ConfigMap

同様の動作をさせるための ConfigMap の書き方は下記のようになる。
argocd-notifications-cm は既に存在するので defaultTriggers を追加する。

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-notifications-cm
data:
  defaultTriggers: |
    - on-deployed
    - on-health-degraded
    - on-sync-failed
    - on-sync-running
    - on-sync-status-unknown
    - on-sync-succeeded    

annotations (v1.0.2)

v1.0.2 以降で同様の動作をさせるための annotations の書き方は下記のようになる。
improve annotation iterate #159がマージされたので下記のような書き方ができる。

metadata:
  annotations:
    notifications.argoproj.io/subscribe.slack: my-channel

annotations (v1.0.1)

これは古い情報だがメモとして残しておく。
. が2つ続いてるのは意味がわからないと思うが、v1.0.1 以前ではこうする必要がある。

metadata:
  annotations:
    notifications.argoproj.io/subscribe..slack: my-channel

なぜこの書き方をするのか

アノテーションを舐める処理はpkg/subscriptions/annotations.go#L32-L55でやっているのだがここには問題がある。

ここでは変数として triggerservice が重要になる。
trigger は何を起因に通知を飛ばすか、serviceslack 等が入る。

上に書いた例でいうと trigger には空文字、service には slack が入る。
pkg/subscriptions/annotations.go#L112-L115 に書いてあるのだが、trigger に空文字が入ることで引数として渡された defaultTriggers を使うことができる。
この defaultTriggers には先ほど ConfigMap に書いていた値が入ってくる。

さて問題点だがこの if 文は必ず通るので trigger を空文字にするためにはこのような書き方をする必要がある。

parts := strings.Split(k[len(prefix):], ".")
trigger := parts[0]
service := ""
if len(parts) >= 1 {
	service = parts[1]
} else {
	service = parts[0]
	trigger = ""
}