🦀

Mattermost/GitLab/n8nで作るマージリクエストレビューの自動化

に公開

Mattermost/GitLab/n8nで作るマージリクエストレビューの自動化

はじめに

世の中は、GitHub×Claude CodeによるIDEを利用した開発に移行してきていますが、
JTCでの受託開発や、顧客先常駐の開発では、生成AIの活用が始まったばかりで、
まだまだCursorやClaude Codeの利用までは辿り着いてません。

閉塞環境下でMattermostによるコミュニケーション、GitLabによるコード管理を実施してる場合に、
n8n×AI(LLM,SLM問わず)で少し自動化を図るための設定記載しています。

前提条件

  • Mattermost/GitLab/n8nがインストールされている前提です。インストール方法の説明はありません。

最終イメージ

  1. Mattermost

    GitLabのイベント通知が届き、集約して表示されます。その中には、LLMによるレビュー結果も含まれます。

  2. GitLab

マージリクエストのコメント欄に、LLMによるレビュー結果が表示されます。

アーキテクチャ図

以下にアーキテクチャ図を記載します。

特に、OpenAIである必要はありません、Claude Sonnet等の別のLLMでも、Ollamaでも構いません。

以下のような流れで動かします。

  1. IDE等でGitLabにマージリクエストを発行
  2. GitLabが、Mattermostと、n8nにマージリクエストが発行されたことを通知
  3. n8nがGitLabからマージリクエストの内容を取得
  4. OpenAI等のLLMを使って、Diffの内容をレビューし、、レビューコメントを作成
  5. n8nがGitLabのマージリクエストにレビューコメントを追加
  6. n8nがMattermostにレビューコメントを通知

では、一つずつ設定方法を記載していきます。
ホスト名/ポート番号は環境に合わせて適宜読み替えて下さい。


Mattermostの設定

1. 内向けWebhook

内向けWebhookは外部のサードパーティからMattermostのチャネルに投稿するための
エンドポイントを追加します。

  1. 「システムコンソール」->「統合管理機能」で「内向きのウェブフックを有効にする」が有効になっていることを確認して下さい。

  2. 「統合機能」->「統合機能」->「内向けのウェブフック」で設定を新規に追加してください。

  3. 追加が終わると、以下のようにURLが払い出されます。
    URLを控えておいて下さい。

2.APIのためのトークン発行

MattermostのAPIは有効化されていますが、アクセスする際にトークンによる認証があります。
トークンを発行します。

  1. 「プロファイル」->「セキュリティ」->「セキュリティの設定」でパーソナルアクセストークンを追加してください。
    トークンは、次回以降表示されないので必ず控えて下さい。

3. アクセス元IPアドレスの許可

  1. 画面から変更できないので、設定ファイル「mattermost/config/config.json」を探して開いて下さい。
  2. AllowedUntrustedInternalConnectionsの項目に、許可するIPアドレスを設定して下さい。
    AllowedUntrustedInternalConnections:"192.168.56.0/24"
    
  3. 設定後、Mattermostを再起動してください。

GitLabの設定

1. インテグレーション

インテグレーションは、GitLabから外部のサードパーティに通知するための仕組みです。
Webhookに比べ、通知の内容を選択していくことで設定することができます。

  1. 「設定」->「インテグレーション」から「Mattermost通知」を有効にしてください。

  2. 通知設定の詳細で、通知(トリガー)の発生条件と、発行先のMattermostのチャネルを選択して下さい。

  3. 通知先の設定を行います。「Webhook」に、Mattermostの内向けWebhookで発行されたURLを設定してください。

2. Webhook

現在、インテグレーションにはn8nが未対応なので、n8nへの通知をWebhookを利用して行います。

  1. 「設定」->「Webhook」から「新しいWebhookを追加」してください。
  2. 設定画面で、「URL」にn8nのURLの設定と、通知するトリガーを選択して下さい。
    注意 順番が前後しますが、n8nのワークフロー設定の説明で、URLの記載をします。n8nのワークフロー作成後に本設定を行って下さい。

3.API

次に、n8nからプロジェクト(リポジトリ)の操作をAPIを通じて行うには、アクセストークンによる認証があります。
トークンを発行します。

  1. 「設定」->「アクセストークン」から「新しいトークンを追加」してください。
  2. トークンの名称と、権限を設定して下さい。トークンは、次回以降表示されないので必ず控えて置いて下さい。

n8nのワークフロー

n8nで以下のワークフローを作成します。

以下のような流れで動作します。
(動作の流れ)

  1. GitLabからのマージリクエストをWebhookで待ち受けます。
  2. 届いたマージリクエスト(JSON)の情報を元に、GitLabに対してマージリクエストのDiff情報を取得します。
  3. 取得したDiff情報を元にLLMでレビューを行い、レビューコメントを作成します。
  4. レビューコメントをMattermostに通知します。
  5. 並行して、GitLabのマージリクエストのコメント欄にも記載します。

以下で、ワークフローの各ノードの設定情報を説明します。

1. Webhookの設定

HTTP MethodをPOSTに、Pathに適当な名前を設定して下さい。Pathを変更するとURLが変化します。
注意 ここに記載されているURLをGitLabのWebhookに設定して下さい。

2. GitLab Diff Requestの設定

指定したURLに対してREST-APIでアクセスします。Method/URL/Headersを設定します。

URLには、以下のように設定して下さい。

http://localhost:8929/api/v4/projects/{{ encodeURIComponent($json.body.project.path_with_namespace) }}/merge_requests/{{ $json.body.object_attributes.iid }}/raw_diffs

Webhookで通知されてきたマージリクエストの情報から「プロジェクトのオーナ名」、「プロジェクト名」、「マージリクエストのID」を元に、
GitLabに対してマージリクエストのdiffの内容を取得するURLを生成して発行します。

JSONには、GitLabで発行したアクセストークンを設定してください。

TIPS:前のノード「Webhook」を動作させると、json項目をドラッグアンドドロップで設定できるので楽に設定できます。

3. AI Agentの設定

以下のように、プロンプトを設定します。変更内容には、前のノードで取得したDiffの内容が埋め込まるようにしています。

TIPS: プロンプトの内容は、適宜見直して下さい。出力フォーマットも指定すると良いでしょう。

4. OpenAI Chat Modelの設定

OpenAIを選択していますが、他のLLMでも構いません。
認証情報(API KEY)と、モデルを選択してください。

5. Mattermostの設定

Mattermostへの通知設定を行います。

認証情報として、Mattermostで発行したアクセストークンと、URLを設定してください。

その他、リーソースや、チャンネル名を設定し、Messageには前のノードのLLMの出力(=レビューコメント)を通知するように設定します。

6. GitLab Notes Write

GitLabのマージリクエストのコメント欄に、LLMのレビューコメントを発行します。

URLには、以下のように設定して下さい。

http://localhost:8929/api/v4/projects/{{ $('Webhook').item.json.body.project.id }}/merge_requests/{{ $('Webhook').item.json.body.object_attributes.iid }}/notes

Webhookで通知されてきたマージリクエストの情報から「プロジェクトのID」、「マージリクエストのID」を元に、
GitLabに対してマージリクエストのコメント欄のURLを生成します。
Headersへのアクセストークンの設定と、BodyへのLLMのレビューコメントの設定を行います。


おわりに

以上ですべての設定が終わりました。お疲れ様でした。
3つのツールを利用するため設定が長いですが、これで自動的にマージリクエストに対するLLMのレビューの実行と、イベントの集中管理できるので、LLMのレビュー後に、最終判断を人が行うような運用ができるかと思います。
(IDE上で事前にLLMによるレビューも受けられますが、最後の砦として・エビデンスを残す等の用途で利用するとよいかもしれません。)

以下の通り、まだまだ改善の余地はあるので、運用しながらn8nのワークフローを見直すとよいかと思います。

改善案:

  • AI AgentにMCP Serverを接続して外部ドキュメントを参照させる
  • 言語毎に専用のAI Agentを用意する
  • diffではなく、ファイル全体を取得してレビューさせる

以上閉塞環境でMattermost/GitLab/n8nで遊ぼうでした。(タイトル変わってる・・)

おまけ(その1):Mattermostで外部ウェブフックの活用

記述していませんが、Mattermostで外部ウェブフックの設定、n8nでの別のWebhookの設定を行うと、
例えば、「n8nレビューして」とMattermostでコメント打つと、自動的にn8nでのレビューを動かすようなことも実現できます。
Claude Code Actionのように、IssueからLLMに通知して実装まで完了させたいものです。

おまけ(その2):n8nのGUIの日本語化

n8nのキャプチャーが日本語化されてる?と思われた方、はい、日本語化しています。
以下のGithubで公開されている「n8n 日本語化プロジェクト」を適用してみてください。
エディタ部分だけですが、日本語化されるので、n8nへの利用抵抗が減ります。

https://github.com/nemumusito/n8n-i18n-japanese

Discussion