koide bdab8f3d8a
All checks were successful
Deploy Docusaurus Site / deploy (push) Successful in 34s
Rewrite: Gitea Webhook AI Review 記事リライト
2026-03-02 02:53:57 +00:00

8.6 KiB
Raw Blame History

sidebar_position, title, description, hide_table_of_contents, displayed_sidebar, image
sidebar_position title description hide_table_of_contents displayed_sidebar image
2 Issue 立てるだけで AI がコードレビュー&修正してくれる仕組みを作った ローカルGiteaにWebhookブリッジを噛ませて、Issue/PRをトリガーにAIエージェントが自動でコードレビュー・修正・pushまでやってくれる環境を構築した話。 false null ./banner.png

Issue 立てるだけで AI がコードレビュー&修正してくれる仕組みを作った

きっかけ

GitHub だと Copilot や GitHub Actions を使って、PR にレビューコメントつけたり自動テスト回したりできるよね。Devin みたいに Issue を投げたら勝手にコード書いてくれるサービスもある。

でもうちの開発環境は ローカルの Gitea。GitHub のエコシステムはそのままじゃ使えない。

「じゃあ同じことをローカルで再現すればいいじゃん」ということで、Gitea の Webhook と OpenClaw の AI エージェントを繋げて、Issue 立てたら AI が勝手にレビューして修正して push してくれる 仕組みを作った。

何ができるようになったか

こんな感じの開発フローが回ってる:

  1. Gitea で Issue を立てる(「この関数のエラーハンドリングがザルだから直して」とか)
  2. Webhook が飛んで、AI エージェントGPT-5.3-codexが起動
  3. リポジトリをクローンして、Issue の内容に沿ってコードレビュー
  4. 修正ブランチを切って、コード修正、push
  5. Issue にコメントで結果報告(ブランチ名、何を直したか、マージ手順)

PR が来た時も同じようにレビューが走る。人間がやるのは Issue を書くことと、最後にマージするかどうか判断するだけ

全体の構成

Gitea (Issue/PR作成)
  │
  │ Webhook (POST /webhook/gitea)
  ▼
gitea-webhook-bridge (Python, port 9876)
  │
  │ openclaw agent --agent codex
  ▼
OpenClaw Codex エージェント (GPT-5.3-codex)
  │
  │ code-review-loop スキル
  ▼
レビュー → 修正 → push → Issue にコメント

登場人物は3つだけ

  • Gitea — セルフホストの Git サーバー
  • Webhook Bridge — Gitea のイベントを受けて AI を起動する Python スクリプト
  • OpenClaw + Codex エージェント — 実際にコードを読んで直す AI

Webhook Bridge の中身

ブリッジ自体はシンプルな Python の HTTP サーバー。Gitea からの Webhook を受けて、OpenClaw の codex エージェントにタスクを投げるだけ。

class WebhookHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        if self.path == "/webhook/gitea":
            return self.handle_gitea_webhook()

    def handle_gitea_webhook(self):
        # 1. 署名検証
        # 2. イベント種別チェック (issues / pull_request / issue_comment)
        # 3. タスク文を組み立て
        # 4. openclaw agent を非同期で起動
        # 5. すぐに 200 OK を返す

対応しているイベント

イベント アクション やること
Issue 作成 opened コードレビュー&修正
Issue コメント created コメントの依頼に対応
PR 作成/更新 opened / reopened / synchronize PR レビュー

Issue へのコメントも拾えるようにしてるから、「ここもう少し直して」みたいな追加指示もそのまま通る。

ボットのコメントは無視する

これ忘れると無限ループになる。AI がコメント → Webhook 発火 → AI がまたコメント → ...

{
  "bot_user": "koide",
  "ignore_comment_users": ["koide"]
}

AI エージェントが使う Gitea アカウント名を ignore_comment_users に入れておけば OK。

Gitea 側の設定

Webhook の登録

リポジトリの Settings → Webhooks → Add Webhook:

  • URL: http://<bridge-host>:9876/webhook/gitea
  • Content Type: application/json
  • Secret: bridge 側の .env と一致させる
  • Trigger: Issues / Pull Request にチェック

プライベート IP への Webhook を許可する

デフォルトだと Gitea はプライベート IP への Webhook をブロックする。ローカル環境では app.ini に以下を追加:

[webhook]
ALLOWED_HOST_LIST = private

これを忘れると Webhook が一切飛ばないから、最初にやっておくこと。

systemd で常駐させる

[Unit]
Description=Gitea Webhook Bridge for OpenClaw
After=network.target

[Service]
Type=simple
User=swallow
WorkingDirectory=/home/swallow/gitea-webhook-bridge
EnvironmentFile=/home/swallow/gitea-webhook-bridge/.env
ExecStart=/usr/bin/python3 bridge.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
sudo systemctl enable --now gitea-webhook-bridge

Restart=always にしてるから、万が一落ちても勝手に復帰する。

ハマったところ

Webhook Bridge の実装

正直、ブリッジ自体も vibe コーディングで AI に作ってもらった。「Gitea の Webhook 受けて OpenClaw のエージェント起動するブリッジ書いて」って投げたらだいたい動くものが出てきた。

ただ、いくつかハマりポイントはあった:

1. EOF で Webhook が失敗する

do_POST 内で例外が出た時に HTTP レスポンスを返さないと、Gitea 側から見ると EOF エラーになる。try/except で囲んで、例外時も必ず 500 を返すようにする。

def do_POST(self):
    try:
        # 処理
    except Exception as e:
        self.send_response(500)
        self.end_headers()

2. PR イベントが無視される

最初 Issue だけ対応して満足してたら、PR のレビューが走らなくて「あれ?」ってなった。pull_request イベントも明示的に受理する必要がある。

3. 署名検証

ローカルネットワークだからいいかと思って最初は省略してたけど、Webhook URL を知ってるだけで叩けちゃう状態はさすがにまずいので追加した。HMAC-SHA256 で検証してる。

AI エージェントの動き

OpenClaw の codex エージェント(うちでは「小出君」と呼んでる)が実際にやってくれることは:

  1. リポジトリを clone
  2. Issue/PR の内容を読んで問題を把握
  3. コードを読んでレビュー
  4. 修正が必要ならブランチを切ってコード修正
  5. push して Issue にコメント

コメントには毎回こういう情報を含めてくれる:

  • 何を修正したか
  • ブランチの切替手順(git fetch && git switch fix/issue-123-xxx
  • 検証コマンド
  • main へのマージ手順

Git に不慣れでも、コメントをコピペすれば OK な状態になってるのが地味にありがたい。

実際の使用感

普段の開発では、ちょっとした修正や改善は Issue を立てるだけで回ってる。人間がやるのは:

  • Issue を書く(日本語で OK
  • 修正結果を確認する
  • マージするかどうか判断する

体感として、コードレビュー+修正の作業時間が 8 割くらい減った。特に「このへん直して」みたいなざっくりした指示でもちゃんとコード読んで対応してくれるのがいい。

もちろん的外れなこともあるけど、その時は Issue にコメントで「そうじゃなくてこうして」って返せばまた対応してくれる。

今後やりたいこと

  • ai-review ラベルが付いた Issue だけ処理する(全 Issue に反応するのは過剰)
  • レビュー結果の品質スコアリング
  • 失敗時の自動リトライと通知

まとめ

GitHub の Copilot や Devin みたいな「AI が開発を手伝ってくれる」体験を、ローカルの Gitea 環境でも再現できた。仕組み自体はシンプルで、Webhook Bridge の Python スクリプト 1 本と、OpenClaw のエージェント設定だけ。

ローカル AI 開発に興味がある人は、まず Issue → AI レビューの一本道から始めてみるといいと思う。それだけでも十分便利。

参考リンク


この記事は2026年3月時点の情報です。