--- sidebar_position: 2 title: Issue 立てるだけで AI がコードレビュー&修正してくれる仕組みを作った description: ローカルGiteaにWebhookブリッジを噛ませて、Issue/PRをトリガーにAIエージェントが自動でコードレビュー・修正・pushまでやってくれる環境を構築した話。 hide_table_of_contents: false displayed_sidebar: null image: ./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 エージェントにタスクを投げるだけ。 ```python title="bridge.py(抜粋)" 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 がまたコメント → ... ```json title="config.json" { "bot_user": "koide", "ignore_comment_users": ["koide"] } ``` :::note "koide" は Codex エージェントの愛称「小出君」から。Codex → コデ → 小出(こいで)。個人名じゃないよ。 ::: AI エージェントが使う Gitea アカウント名を `ignore_comment_users` に入れておけば OK。 ## Gitea 側の設定 ### Webhook の登録 リポジトリの Settings → Webhooks → Add Webhook: - **URL**: `http://:9876/webhook/gitea` - **Content Type**: `application/json` - **Secret**: bridge 側の `.env` と一致させる - **Trigger**: Issues / Pull Request にチェック ### プライベート IP への Webhook を許可する デフォルトだと Gitea はプライベート IP への Webhook をブロックする。ローカル環境では `app.ini` に以下を追加: ```ini title="app.ini" [webhook] ALLOWED_HOST_LIST = private ``` これを忘れると Webhook が一切飛ばないから、最初にやっておくこと。 ## systemd で常駐させる ```ini title="/etc/systemd/system/gitea-webhook-bridge.service" [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 ``` ```bash 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` を返すようにする。 ```python 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 レビューの一本道から始めてみるといいと思う。それだけでも十分便利。 ## 参考リンク - [Gitea 公式ドキュメント](https://docs.gitea.com/) - [OpenClaw](https://github.com/openclaw/openclaw) --- *この記事は2026年3月時点の情報です。*