GitOpsを使用してアプリケーションをリリースする場合、メールやDingTalkなどの通知サービスを設定して、アプリケーションの更新に関する通知を受信できます。 たとえば、アプリケーションリリースの例外が発生したときに通知を受け取り、できるだけ早い機会に例外をトラブルシューティングできます。 このトピックでは、GitOpsでDingTalk通知を受信する方法について説明します。
背景情報
Argo CD通知機能では、アプリケーション通知を設定するために次の用語が導入されます。
トリガー: 通知を送信するようにシステムをトリガーする条件を定義します。
テンプレート: 通知の内容を定義します。
サブスクリプション: アプリケーションまたはトリガーをサブスクライブし、1つ以上の通知サービスから送信された通知を受信できます。
通知サービス: メール、Slack、GitHub、webhookなど。
DingTalkは、公開されたHTTP webhookを通じてメッセージを受け取ります。 ConfigMapのargocd/argocd-notifications-cm
セクションでトリガー、テンプレート、通知サービス、およびサブスクリプションを設定して、DingTalkがアプリケーションの更新に関する通知を自動的に受信できるようにします。
前提条件
フリート管理機能が有効になっています。 詳細については、「マルチクラスター管理の有効化」をご参照ください。
フリートインスタンスのkubeconfigファイルはACK Oneコンソールで取得され、kubectlクライアントはフリートインスタンスに接続されています。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
ステップ1: DingTalkチャットボットを作成する
DingTalkチャットボットを作成すると、排他的なwebhookが生成されます。 webhookは、Argoワークフローなどの他のサービスに関連付けて通知を受信できます。
DingTalkを開始し、通知を受信するDingTalkグループに移動します。
チャットボットページに移動し、カスタムチャットボットを追加します。
DingTalk グループの右上角にある アイコンをクリックします。 次に、表示されるパネルで [ボット] をクリックします。
ロボット管理パネルで、[ロボットの追加] をクリックし、[カスタム] カードをクリックします。 表示されるダイアログボックスで、[追加] をクリックします。
チャットボット名を指定してセキュリティ設定を設定し、[終了] をクリックします。
少なくとも1つのセキュリティ設定を選択する必要があります。 [追加署名] と [IPアドレス] のいずれかのセキュリティ設定を選択することを推奨します。
重要DingTalkメッセージを送信するようにワークフローを設定するには、ワークフロークラスターの仮想プライベートクラウド (VPC) にインターネットアクセスがあることを確認します。 これを行うには、ワークフロークラスターのインターネットNATゲートウェイを設定し、チャットボットのIP addressパラメーターでゲートウェイのelastic IPアドレス (EIP) を指定します。
設定が完了したら、チャットボットのwebhookをコピーして記録します。
手順2: アプリケーション通知の設定
kubectlを使用してフリートインスタンスに接続し、次のコマンドを実行してargocd/argocd-notifications-cm
に設定を追加します。
kubectl edit cm argocd-notifications-cm -nargocd
サンプル設定:
service.webhook.dingtalk
のurl
を、手順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]