DifyでGitLabのMRをAIレビューする

Tips

はじめに

コードレビューは開発フローの中で重要な工程ですが、小規模チームや個人開発では十分な時間を確保しにくい場面があります。今回はDifyとGitLabを組み合わせることで、LLMを使ったコードレビューを自動化する構成を試してみました。

Dify内でGitLabのREST APIを呼び出し、MRの差分を取得してLLMにレビューさせる仕組みです。バックエンドのコードを書かずにDifyのビジュアルエディタだけで完結できるため、AIとの連携を手軽に試せるのが特徴です。

なぜDifyとGitLabを組み合わせるのか

GitLab CIや専用のコードレビューツール(例: CodeRabbit)を使う方法もありますが、以下の点でDifyを選ぶ利点があります。

  • コーディング不要: DifyのHTTPリクエストブロックとLLMブロックをつなぐだけで動く
  • モデルを自由に切り替えられる: OpenAIはもちろん、Ollamaのローカルモデルにも簡単に変更できる
  • 既存のDify環境を再利用できる: 別のワークフローと組み合わせて拡張しやすい

GitLab REST APIの raw_diffs エンドポイントを使うことで、MRのUnified diff形式の差分テキストをそのままLLMに渡せます。

手順

GitLabの準備

  1. GitLabのプロジェクトを作成します
  2. devブランチを作成します
  3. devブランチに簡単なFlaskアプリを作成してプッシュします
# app.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

if __name__ == "__main__":
    app.run()
  1. mainブランチへのMRを作成します
  2. 以下の情報を控えておきます
    • プロジェクトID: プロジェクトのトップページ > 三点リーダーから確認できます
    • MRのIID: MRのURL末尾の数値(例: /merge_requests/11
  3. パーソナルアクセストークンをread_api権限で作成します
    • 「ユーザー設定」→「パーソナルアクセストークン」から発行します

Difyでアプリを作成する

Difyのスタジオから新規アプリ(チャットボット)を作成します。

ユーザー入力の設定

「スタート」ブロックのユーザー入力に以下の2項目を追加します。

変数名 説明
projectId テキスト GitLabのプロジェクトID
mergeRequestIid テキスト MRのIID

環境変数の設定

アプリの環境変数に以下を追加します。

変数名
PRIVATE_TOKEN Secret 発行したパーソナルアクセストークン

HTTPリクエストブロックの追加

HTTPリクエストブロックを追加し、以下のように設定します。

  • メソッド: GET

  • URL: Difyの変数参照構文でprojectIdmergeRequestIidをURLに埋め込みます。

    https://gitlab.com/api/v4/projects/{{projectId}}/merge_requests/{{mergeRequestIid}}/raw_diffs

    ヘッダー:
    | キー | 値 | |—|—| | PRIVATE-TOKEN | PRIVATE_TOKEN |

このAPIは指定したMRのUnified diff形式の差分テキストを返します。

参考: https://docs.gitlab.com/api/merge_requests/#show-merge-request-raw-diffs

LLMブロックの設定

LLMブロックを追加し、以下のように設定します。

システムプロンプト(例):

あなたは優秀なコードレビュアーです。
提供されたコードの差分(diff)を分析し、以下の観点でレビューコメントを日本語で提供してください。

- バグや潜在的な問題点
- セキュリティ上の懸念
- コードの可読性・保守性
- パフォーマンス上の改善点
- 良い点のフィードバック

ユーザーメッセージ:

HTTPリクエストブロックの出力bodyを変数として設定します。

以下のdiffをレビューしてください:

/body

全体のフロー

スタートブロック → HTTPリクエストブロック(GitLab API呼び出し)→ LLMブロック(差分をレビュー)という3ステップのシンプルな構成です。

動作確認

プレビュー画面からprojectIdmergeRequestIidを入力して送信します。 実際に試してみると、LLMがdiffを解析して以下のようなレビューコメントを返してくれました。

## コードレビュー結果

### 良い点
- Flask アプリの基本構造が正しく実装されています
- エントリポイントの条件分岐(if __name__ == "__main__")が適切です

### 改善提案
- セキュリティ: Flask の開発サーバーは本番環境での使用には適していません。
  本番環境では gunicorn や uWSGI などのWSGIサーバーを使用してください。
- エラーハンドリング: 現状、エラー処理が実装されていません。
  404ハンドラーなどの追加を検討してください。

差分の内容に応じた具体的なフィードバックが得られるため、レビューの観点もれを防ぐ補助ツールとして活用できます。

まとめ

DifyとGitLabを連携させることで、AIを活用したコードレビューが可能になります。

実際に動かしてみた感想として、細かいバグや書き方の改善点の指摘は精度が高い一方、プロジェクト全体のアーキテクチャに関するコメントは追加のコンテキスト(ファイル構造や設計方針)が必要になる場面もありました。まずはCIでの静的解析と組み合わせて補助的に使うのがよさそうです。

また、今回は簡単にするためにREST APIを直接呼び出しましたが、MCPサーバーなどを用意しておくとより柔軟にアプリが構築できると思います。次は複数ファイルの差分を分割してコンテキスト長を調整する仕組みも試してみたいと考えています。

コメント

タイトルとURLをコピーしました