すべてのプロダクト
Search
ドキュメントセンター

:DingTalkチャットボットを使用してGitOpsアプリケーションの更新に関する通知を受け取る

最終更新日:Nov 14, 2024

GitOpsを使用してアプリケーションをリリースする場合、メールやDingTalkなどの通知サービスを設定して、アプリケーションの更新に関する通知を受信できます。 たとえば、アプリケーションリリースの例外が発生したときに通知を受け取り、できるだけ早い機会に例外をトラブルシューティングできます。 このトピックでは、GitOpsでDingTalk通知を受信する方法について説明します。

背景情報

Argo CD通知機能では、アプリケーション通知を設定するために次の用語が導入されます。

  • トリガー: 通知を送信するようにシステムをトリガーする条件を定義します。

  • テンプレート: 通知の内容を定義します。

  • サブスクリプション: アプリケーションまたはトリガーをサブスクライブし、1つ以上の通知サービスから送信された通知を受信できます。

  • 通知サービス: メール、Slack、GitHub、webhookなど。

DingTalkは、公開されたHTTP webhookを通じてメッセージを受け取ります。 ConfigMapのargocd/argocd-notifications-cmセクションでトリガー、テンプレート、通知サービス、およびサブスクリプションを設定して、DingTalkがアプリケーションの更新に関する通知を自動的に受信できるようにします。

前提条件

ステップ1: DingTalkチャットボットを作成する

DingTalkチャットボットを作成すると、排他的なwebhookが生成されます。 webhookは、Argoワークフローなどの他のサービスに関連付けて通知を受信できます。

  1. DingTalkを開始し、通知を受信するDingTalkグループに移動します。

  2. チャットボットページに移動し、カスタムチャットボットを追加します。

    1. DingTalk グループの右上角にある imageアイコンをクリックします。 次に、表示されるパネルで [ボット] をクリックします。

    2. ロボット管理パネルで、[ロボットの追加] をクリックし、[カスタム] カードをクリックします。 表示されるダイアログボックスで、[追加] をクリックします。

    3. チャットボット名を指定してセキュリティ設定を設定し、[終了] をクリックします。

      少なくとも1つのセキュリティ設定を選択する必要があります。 [追加署名][IPアドレス] のいずれかのセキュリティ設定を選択することを推奨します。

      重要

      DingTalkメッセージを送信するようにワークフローを設定するには、ワークフロークラスターの仮想プライベートクラウド (VPC) にインターネットアクセスがあることを確認します。 これを行うには、ワークフロークラスターのインターネットNATゲートウェイを設定し、チャットボットのIP addressパラメーターでゲートウェイのelastic IPアドレス (EIP) を指定します。

  3. 設定が完了したら、チャットボットのwebhookをコピーして記録します。

手順2: アプリケーション通知の設定

kubectlを使用してフリートインスタンスに接続し、次のコマンドを実行してargocd/argocd-notifications-cmに設定を追加します。

kubectl edit cm argocd-notifications-cm -nargocd

サンプル設定:

説明
  • service.webhook.dingtalkurlを、手順1: DingTalkチャットボットの作成で記録したチャットボットのwebhookに置き換えます。

  • コンテキストargocdUrlをArgo CD Serverのドメイン名に置き換えます。 ドメイン名の取得方法の詳細については、「GitOps Argo CDサーバーのドメイン名の概要」をご参照ください。

  • 各トリガーをカスタマイズする場合は、各トリガーにTemplatesオブジェクトを追加します。

  • 通知コンテンツの色をカスタマイズするには、<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: https://argocd.<your-fleet-id>.<region>.alicontainer.com
  template.app-sync-change: |
    webhook:
      dingtalk:
        method: POST
        body: |
          {
                "msgtype": "markdown",
                "markdown": {
                    "title":"Argo CD application status",
                    "text": "### Argo CD application status\n> - Application name: {{.app.metadata.name}}\n> - Status: {{ .app.status.operationState.phase}}\n> - Time:{{.app.status.operationState.finishedAt}}\n> - Application URL: [Click to access]({{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true) \n"
                }
          }
  template.app-sync-status-unknown: |
    webhook:
      dingtalk:
        method: POST
        body: |
          {
                "msgtype": "markdown",
                "markdown": {
                    "title":"Unknown Argo CD application",
                    "text": "### Unknown Argo CD application\n> - <font color=\"warning\">Application name</font>: {{.app.metadata.name}}\n> - <font color=\"warning\">Application status</font>: {{.app.status.sync.status}}\n> - <font color=\"warning\">Application health status</font>: {{.app.status.health.status}}\n> - <font color=\"warning\">Time</font>: {{.app.status.operationState.startedAt}}\n> - <font color=\"warning\">Application URL</font>: [Click to access the 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 application release failure",
                    "text": "### Argo CD application release failure\n> - <font color=\"danger\">Application name</font>: {{.app.metadata.name}}\n> - <font color=\"danger\">Application status</font>: {{.app.status.operationState.phase}}\n> - <font color=\"danger\">Application health status</font>: {{.app.status.health.status}}\n> - <font color=\"danger\">Time</font>: {{.app.status.operationState.startedAt}}\n> - <font color=\"danger\">Application URL</font>: [Click to access the Argo CD UI]({{.context.argocdUrl}}/applications/{{.app.metadata.name}}?operation=true)"
                }
          }
  trigger.on-deployed: |
    - description: Application is synced and healthy. Triggered once per commit.
      oncePer: app.status.sync.revision
      send: [app-sync-change]
      # trigger condition
      when: app.status.operationState.phase in ['Succeeded'] and app.status.health.status == 'Healthy'
  trigger.on-health-degraded: |
    - description: Application has degraded
      send: [app-sync-change]
      when: app.status.health.status == 'Degraded'
  trigger.on-sync-failed: |
    - description: Application syncing has failed
      send: [app-sync-failed]
      when: app.status.operationState != nil and app.status.operationState.phase in ['Error',
        'Failed']
  trigger.on-sync-status-unknown: |
    - description: Application status is 'Unknown'
      send: [app-sync-status-unknown]
      when: app.status.sync.status == 'Unknown'
  trigger.on-sync-running: |
    - description: Application is being synced
      send: [app-sync-change]
      when: app.status.operationState != nil and app.status.operationState.phase in ['Running']
  trigger.on-sync-succeeded: |
    - description: Application syncing has succeeded
      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]