一个基于 Go + React 的 Gitea PR 代码审查 Bot。
当前版本是 MVP:
- 接收 Gitea PR webhook
- 校验 webhook HMAC 签名
- 按 PR head commit 去重
- 将 review job 存入 PostgreSQL
- Worker 拉取 PR changed files 和 diff
- 调用 OpenAI-compatible Responses API 生成结构化 review 和 findings
- 回写 Gitea commit status
- 回写 PR summary comment
- 可选回写 PR inline comments
- React Admin 查看 job 状态、findings 和 retry 操作
当前版本暂不做仓库配置文件。
.
├── main.go # Go 后端入口
├── internal/ # 后端内部包
│ ├── config # 环境变量配置
│ ├── db # PostgreSQL 连接和 schema
│ ├── gitea # Gitea API client
│ ├── jobs # job store
│ ├── review # mock / OpenAI reviewer
│ ├── server # HTTP server
│ ├── webhook # Gitea webhook 验签和解析
│ └── worker # 异步 review worker
├── web/ # React Admin
├── docker-compose.yml
├── Dockerfile
├── .env.example
└── DESIGN.md
建议新建一个专用 Gitea bot 用户,然后在 Gitea Web UI 里创建 access token。
Token 至少需要能:
- 读取仓库
- 读取 Pull Request
- 读取 PR changed files / diff
- 创建 PR comment
- 创建 commit status
Gitea 里通常在:
Settings -> Applications -> Generate New Token
创建后保存 token,首次进入 Admin 安装向导时填写。
自己生成一个随机字符串,例如:
reviewbot-dev-secret-please-change
这个值要同时填到:
- Admin 安装向导/系统配置里的
Webhook Secret - Gitea 仓库 webhook 的 Secret
如果你只是先验证链路,可以先不填 OPENAI_API_KEY。
不填时:
- Bot 会正常接收 webhook
- Worker 会尝试拉 PR files / diff
- Review 阶段使用 mock reviewer
- 不会调用外部模型
如果要验证真实 AI review,需要在 Admin 安装向导/系统配置里填写 OpenAI API Key、OpenAI Base URL 和 Review Model。
注意:Review Model 必须是你账号实际可用的模型名。
在项目根目录复制示例配置:
cp .env.example .env然后编辑 .env。
最小可用配置示例:
PORT=8080
DATABASE_URL=postgres://reviewbot:reviewbot@localhost:5432/reviewbot?sslmode=disable
SESSION_SECRET=本地使用数据库/admin 时也需要填写;生产必须填写长随机字符串Gitea、AI、review 策略等运行期配置在首次打开 Admin 时通过安装向导写入数据库,后续也可以在网页里修改。
如果使用 Docker Compose,DATABASE_URL 在 compose 里会自动设置为容器内地址:
postgres://reviewbot:reviewbot@postgres:5432/reviewbot?sslmode=disable所以本地 .env 里即使写了 localhost,docker-compose.yml 里的配置也会覆盖它。
在项目根目录运行:
docker compose --env-file .env up --build启动后服务地址:
Go API: http://localhost:8080
Healthz: http://localhost:8080/healthz
React Admin: http://localhost:5173
PostgreSQL: localhost:5432
验证后端健康检查:
curl http://localhost:8080/healthz期望返回:
{"status":"ok"}进入测试仓库的 webhook 配置页面,新增 webhook。
Webhook URL:
http://你的机器地址:8080/webhooks/gitea
如果 Gitea 和 bot 在同一台机器上,可以根据网络环境使用:
http://host.docker.internal:8080/webhooks/gitea
或你的局域网 IP:
http://192.168.x.x:8080/webhooks/gitea
Content Type:
application/json
Secret:
和 Admin 系统配置里的 Webhook Secret 完全一致
事件选择:
Pull Request
需要覆盖的场景:
- PR opened
- PR synchronized / push 新 commit
- PR reopened / edited,可选
- 启动服务:
docker compose --env-file .env up --build- 打开 React Admin:
http://localhost:5173
首次访问会进入安装向导,创建管理员账号,并填写 Gitea、AI 和 review 策略配置。
-
在 Gitea 测试仓库创建一个 PR。
-
观察后端日志,应该看到类似:
queued review job
processing review job
completed review job
- React Admin 应该出现一条 job,状态最终变成:
succeeded
- Gitea PR 页面应该出现:
- commit status:
code-review-bot/review - 一条 bot summary comment
通常是 secret 不一致。
检查:
- Admin 系统配置里的 Webhook Secret
- Gitea webhook 页面里的 Secret
- 修改网页配置后是否保存成功
重启:
docker compose --env-file .env up --build可能还没有 webhook 入队。
检查后端健康:
curl http://localhost:8080/healthz检查容器日志:
docker compose logs -f api通常是 worker 无法处理任务。
检查 Admin 系统配置:
- Gitea Base URL 必须填写
- Gitea Token 必须填写
- 数据库和 api 日志是否正常
看 React Admin 的错误字段,或者查看日志:
docker compose logs -f api常见原因:
- Gitea token 权限不足
GITEA_BASE_URL不正确- Bot 无法访问 Gitea
- Gitea API 路径和当前 Gitea 版本不兼容
- 模型 API key 或模型名不正确
可以正常启动。
Worker 会使用 mock reviewer,不会调用模型。适合先验证 webhook、队列、Gitea status/comment 回写链路。
远程 Gitea 必须能访问你的 bot 地址。
如果 bot 在本机,可以用:
- 公网服务器
- 内网穿透
- VPN
- frp
- cloudflared
- ngrok
把本机 8080 暴露给 Gitea。
后端测试:
go test ./...前端安装依赖:
npm install --prefix web前端构建:
npm run build --prefix web校验 Docker Compose:
docker compose config当前版本还有这些能力未完成或待增强:
- 更精确的 diff 行号映射
- finding 去重
- summary comment 更新而不是每次新增
- stale head sha 二次检查
- 仓库白名单
- secret 加密存储、检测和脱敏
.gitea-review-bot.yml- PR comment commands
- 多管理员和权限管理
- 成本统计
- 质量评估集
建议先用测试仓库验证闭环,确认稳定后再进入更细的 inline review 和质量治理阶段。