GitOps を使用してアプリケーションをリリースする場合、メールや DingTalk などの通知サービスを構成して、アプリケーションの更新に関する通知を受信できます。たとえば、アプリケーションのリリース例外が発生した場合に通知を受信できます。このトピックでは、GitOps で DingTalk 通知を受信する方法について説明します。
背景情報
Argo CD Notifications 機能では、アプリケーション通知を構成するために次の用語が導入されています。
トリガー: システムが通知を送信するトリガーとなる条件を定義します。
テンプレート: 通知の内容を定義します。
サブスクリプション: アプリケーションまたはトリガーをサブスクライブし、1 つ以上の通知サービスから送信された通知を受信できます。
通知サービス: メール、Slack、GitHub、Webhook など。
DingTalk は、公開された HTTP Webhook を介してメッセージを受信します。 ConfigMap の argocd/argocd-notifications-cm セクションでトリガー、テンプレート、通知サービス、およびサブスクリプションを構成して、DingTalk がアプリケーション更新の通知を自動的に受信できるようにすることができます。
前提条件
フリート管理 機能が有効になっていること。
ACK One コンソール でフリートインスタンスの kubeconfig ファイルを取得し、kubectl クライアントがフリートインスタンスに接続されていること。詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
ステップ 1: DingTalk チャットボットを作成する
DingTalk チャットボットを作成すると、専用の Webhook が生成されます。 Webhook は、Argo Workflows などの他のサービスに関連付けて、通知を受信できます。
DingTalk を起動し、通知を受信する DingTalk グループに移動します。
チャットボットページに移動し、カスタムチャットボットを追加します。
DingTalk グループの右上隅にある
アイコンをクリックします。次に、表示されるパネルで [ボット] をクリックします。[ロボット管理] パネルで、[ロボットを追加] をクリックし、[カスタム] カードをクリックします。表示されるダイアログボックスで、[追加] をクリックします。
[チャットボット名] を指定し、[セキュリティ設定] を構成して、[完了] をクリックします。
少なくとも 1 つのセキュリティ設定を選択する必要があります。次のセキュリティ設定のうち少なくとも 1 つを選択することをお勧めします: [追加署名] および [IP アドレス]。
重要ワークフローが DingTalk メッセージを送信するように構成するには、ワークフロークラスターの仮想プライベートクラウド (VPC) がインターネットにアクセスできることを確認してください。これを行うには、ワークフロークラスターのインターネット NAT ゲートウェイを構成し、チャットボットの [IP アドレス] パラメーターにゲートウェイの Elastic IP アドレス (EIP) を指定します。
構成が完了したら、チャットボットの Webhook をコピーして記録します。
ステップ 2: アプリケーション通知を構成する
kubectl を使用してフリートインスタンスに接続し、次のコマンドを実行して argocd/argocd-notifications-cm に設定を追加します。
kubectl edit cm argocd-notifications-cm -n argocd構成例:
service.webhook.dingtalkのurlを、ステップ 1: DingTalk チャットボットを作成する で記録したチャットボットの Webhook に置き換えます。contextのargocdUrlを Argo CD サーバーのロードバランサーの IP アドレスに置き換えます。ロードバランサーの IP アドレスを取得するには、kubectl get svc -nargocd argocd-server -ojsonpath='{.status.loadBalancer.ingress[0].ip}'コマンドを実行します。各トリガーをカスタマイズする場合は、トリガーごとにテンプレートオブジェクトを追加します。
通知コンテンツの色をカスタマイズするには、
<font color=>xxxx</font>を指定します。
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-notifications-cm
namespace: argocd
data:
service.webhook.dingtalk: |
url: https://oapi.dingtalk.com/robot/send?access_token=535a56d**********
headers:
- name: Content-Type
value: application/json
context: |
argocdUrl: <argocd server lb ip>
template.app-sync-change: |
webhook:
dingtalk:
method: POST
body: |
{
"msgtype": "markdown",
"markdown": {
"title":"Argo CD アプリケーションステータス",
"text": "### Argo CD アプリケーションステータス\n> - アプリケーション名: {{.app.metadata.name}}\n> - ステータス: {{ .app.status.operationState.phase}}\n> - 時刻:{{.app.status.operationState.finishedAt}}\n> - アプリケーション URL: [アクセスするにはクリック]({{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true) \n"
}
}
template.app-sync-status-unknown: |
webhook:
dingtalk:
method: POST
body: |
{
"msgtype": "markdown",
"markdown": {
"title":"不明な Argo CD アプリケーション",
"text": "### 不明な Argo CD アプリケーション\n> - <font color=\"warning\">アプリケーション名</font>: {{.app.metadata.name}}\n> - <font color=\"warning\">アプリケーションステータス</font>: {{.app.status.sync.status}}\n> - <font color=\"warning\">アプリケーションヘルスステータス</font>: {{.app.status.health.status}}\n> - <font color=\"warning\">時刻</font>: {{.app.status.operationState.startedAt}}\n> - <font color=\"warning\">アプリケーション URL</font>: [Argo CD UI にアクセスするにはクリック]({{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true)"
}
}
template.app-sync-failed: |
webhook:
dingtalk:
method: POST
body: |
{
"msgtype": "markdown",
"markdown": {
"title":"Argo CD アプリケーションリリース失敗",
"text": "### Argo CD アプリケーションリリース失敗\n> - <font color=\"danger\">アプリケーション名</font>: {{.app.metadata.name}}\n> - <font color=\"danger\">アプリケーションステータス</font>: {{.app.status.operationState.phase}}\n> - <font color=\"danger\">アプリケーションヘルスステータス</font>: {{.app.status.health.status}}\n> - <font color=\"danger\">時刻</font>: {{.app.status.operationState.startedAt}}\n> - <font color=\"danger\">アプリケーション URL</font>: [Argo CD UI にアクセスするにはクリック]({{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true)"
}
}
trigger.on-deployed: |
- description: アプリケーションは同期され、正常です。コミットごとに 1 回トリガーされます。
oncePer: app.status.sync.revision
send: [app-sync-change]
# トリガー条件
when: app.status.operationState.phase in ['Succeeded'] and app.status.health.status == 'Healthy'
trigger.on-health-degraded: |
- description: アプリケーションがデグレードしました
send: [app-sync-change]
when: app.status.health.status == 'Degraded'
trigger.on-sync-failed: |
- description: アプリケーションの同期に失敗しました
send: [app-sync-failed]
when: app.status.operationState != nil and app.status.operationState.phase in ['Error',
'Failed']
trigger.on-sync-status-unknown: |
- description: アプリケーションステータスは「不明」です
send: [app-sync-status-unknown]
when: app.status.sync.status == 'Unknown'
trigger.on-sync-running: |
- description: アプリケーションは同期中です
send: [app-sync-change]
when: app.status.operationState != nil and app.status.operationState.phase in ['Running']
trigger.on-sync-succeeded: |
- description: アプリケーションの同期に成功しました
send: [app-sync-change]
when: app.status.operationState != nil and app.status.operationState.phase in ['Succeeded']
subscriptions: |
- recipients: [dingtalk]
triggers: [on-sync-failed, on-sync-succeeded, on-sync-status-unknown,on-deployed]