8.7 KiB
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 してくれる 仕組みを作った。
何ができるようになったか
こんな感じの開発フローが回ってる:
- Gitea で Issue を立てる(「この関数のエラーハンドリングがザルだから直して」とか)
- Webhook が飛んで、AI エージェント(GPT-5.3-codex)が起動
- リポジトリをクローンして、Issue の内容に沿ってコードレビュー
- 修正ブランチを切って、コード修正、push
- 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 エージェントが実際にやってくれることは:
:::note うちでは Codex エージェントを「小出君」と呼んでる。Codex → コデ → 小出(こいで)という愛称。個人名じゃないよ。 :::
- リポジトリを clone
- Issue/PR の内容を読んで問題を把握
- コードを読んでレビュー
- 修正が必要ならブランチを切ってコード修正
- 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月時点の情報です。