🤖

n8n × GitHub × OpenAIで「レポジトリ横断キャッチアップBot」を作った話

に公開

はじめに

この記事は『カンリー Advent Calendar 2025』、12月6日分の記事として執筆しています。


9月にマルチプロダクトを扱うCanlyに転職してから、「他チームはどんなコードを書いてるんだろう?」「どんな変更が日々入っているんだろう?」と気になることが増えました。

ただ、関係するすべてのリポジトリを毎週手動で巡回するのは現実的ではありません。
情報量が多すぎて、見に行くハードルも結構高く、諦めていました。。。

そんな時、同僚が n8n を勧めてくれたのが今回の自動化のきっかけです。

💡 何を実現したかったのか

欲しかったのは、こんな "ウィークリー PR ダイジェスト" でした:

  • 1週間分の PR 情報を自動取得したい
  • 内容をまとめて要約して、キャッチアップを時短したい
  • bot PR と人間の PR を分けて把握したい
  • Slack からすぐ PR に飛べるようにしたい

つまり 他チームの動きを自然にキャッチできる状態を作りたかった んです。
まずは要約を読み、気になった PR やコードは深掘りできるような“入り口”を作りたかった。

🏗️ どうやって解決したか

全体のフローは n8n を中心に組んでいます。

ざっくり書くとこんな流れです:

  1. n8n が週次で起動
  2. GitHub GraphQL API で必要な PR 情報をまとめて取得
  3. OpenAI で PR 内容を"2段階要約"
  4. Slack に読みやすく整形して通知

これだけで 「関連リポジトリの1週間分の情報」を気軽に把握できる環境を作れました。

🔧 技術的工夫

① GitHub GraphQL を採用した理由

最初は n8n 標準の GitHub
ノードを使っていましたが、以下の課題がありました:

  • クローズ済みの PR を自前で弾く必要がある
  • 対象期間(1週間)でフィルタリングするのも自前
  • 結果的に余分な件数を取得しがち

ChatGPT に相談したところ、
「GraphQL の search API を使えば "期間+状態+必要プロパティ" を一発で取れるよ」
と教えてもらい、方針を変更しました。

実際に使っているクエリはこちら:

{
  "query": "{ search(query: \"repo:owner_name/{{ $json.repo_name }} is:pr is:merged merged:>={{ $one_week_ago }} sort:updated-desc\", type: ISSUE, first: 30) { nodes { ... on PullRequest { number title body mergedAt author { login __typename } url } } } }"
}

is:merged + merged:>=
により、欲しい期間だけを厳密に指定できてめちゃくちゃ便利。

② OpenAI 要約は"2段階"にするのが安定した

理由は2つあります:

  • コスト最適化:GPT-5-nano を使いたい
  • 1回で「技術要約+Slack整形」すると精度が落ちる

そのため、

  1. PR 本文の技術的要約
  2. Slack 投稿向けの最終整形

と分けることで、「読みやすい × 安い」アウトプットに落ち着きました。

③ Bot PR と人間の PR を分けて扱う

Renovate などの bot PR と、人間が書いた PR が混ざると
要約がごちゃついて読みにくくなります。

そこで author.__typename を使って bot を判別し、

  • Bot → バージョンアップ系としてまとめる
  • 人間 → 開発内容として扱う

という分離を行いました。

結果として「本当に読むべき PR」だけに集中できるようになりました。

📝 実際に OpenAI に投げている Prompt

この prompt により、Bot PR と Developer PR が自動でグルーピングされ、いい感じに要約された内容にまとまります。

以下の PR データは、すべて 1 つのリポジトリに関するものです。
これらの技術的な変更内容を要約してください。

## 出力形式(JSON)
{
  "repo": "{repo_name}", // n8n 側で渡しているレポジトリ名
  "user_groups": [
    {
      "user_type": "Bot or Developer",
      "summary": [
        "実装内容: ...",
        "使用技術・ライブラリ: ...",
        "今後の影響・参考ポイント: ..."
      ],
      "prs": ["#123", "#130"]
    }
  ]
}

## 要約ルール
- 対象レポジトリは 1 つのみ(複数 PR を含む)
- PR 群を技術的重要度順に 3〜4 行で要約
- user_type ごとにグループ化(Bot / Developer)
- 技術実装、設計変更、新技術導入、ライブラリ更新を中心にまとめる
- 推測は禁止。不明点は「不明」と明記
- user_type は昇順(Bot → Developer)

## 対象データ
{{ PR_DATA }}

{{ PR_DATA }} は n8n 側で成形した PR 情報(JSON)をそのまま渡しています。

📈 Before / After(効果)

Before

  • そもそも「見に行く」という行為をやっていませんでした笑

After

  • 毎朝 Slack を 1 分読むだけ
  • 気になった PR だけリンクから深掘り
  • 開発部内の技術のアンテナをローコストで張れるようになりました

🔚 まとめ

n8n は最初ちょっとハードル高そうに見えましたが、実際に触ってみると
"痒いところに手が届く自動化ツール" でした。

今回の仕組みも、一部を差し替えるだけで

  • Notion の更新履歴
  • Backlog の課題状況
  • Google Calendar のイベント
  • Datadog のエラー

など、いろんな情報源に応用できると思います。

今後は、PR に関連するドメイン知識と組み合わせて、キャッチアップ出来るような仕組みを作っていきたいです。

カンリーテックブログ

Discussion