Skip to content

yavon007/code-review-bot

Repository files navigation

Gitea PR Code Review Bot

一个基于 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

1. 准备 Gitea Bot Token

建议新建一个专用 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 安装向导时填写。

2. 准备 Webhook Secret

自己生成一个随机字符串,例如:

reviewbot-dev-secret-please-change

这个值要同时填到:

  1. Admin 安装向导/系统配置里的 Webhook Secret
  2. Gitea 仓库 webhook 的 Secret

3. 准备模型配置

如果你只是先验证链路,可以先不填 OPENAI_API_KEY

不填时:

  • Bot 会正常接收 webhook
  • Worker 会尝试拉 PR files / diff
  • Review 阶段使用 mock reviewer
  • 不会调用外部模型

如果要验证真实 AI review,需要在 Admin 安装向导/系统配置里填写 OpenAI API KeyOpenAI Base URLReview Model

注意:Review Model 必须是你账号实际可用的模型名。

4. 创建 .env

在项目根目录复制示例配置:

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 里的配置也会覆盖它。

5. 启动服务

在项目根目录运行:

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"}

6. 配置 Gitea Webhook

进入测试仓库的 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,可选

7. 验证流程

  1. 启动服务:
docker compose --env-file .env up --build
  1. 打开 React Admin:
http://localhost:5173

首次访问会进入安装向导,创建管理员账号,并填写 Gitea、AI 和 review 策略配置。

  1. 在 Gitea 测试仓库创建一个 PR。

  2. 观察后端日志,应该看到类似:

queued review job
processing review job
completed review job
  1. React Admin 应该出现一条 job,状态最终变成:
succeeded
  1. Gitea PR 页面应该出现:
  • commit status:code-review-bot/review
  • 一条 bot summary comment

8. 常见问题

Webhook 返回 401 invalid signature

通常是 secret 不一致。

检查:

  • Admin 系统配置里的 Webhook Secret
  • Gitea webhook 页面里的 Secret
  • 修改网页配置后是否保存成功

重启:

docker compose --env-file .env up --build

React Admin 为空

可能还没有 webhook 入队。

检查后端健康:

curl http://localhost:8080/healthz

检查容器日志:

docker compose logs -f api

Job 卡在 queued

通常是 worker 无法处理任务。

检查 Admin 系统配置:

  • Gitea Base URL 必须填写
  • Gitea Token 必须填写
  • 数据库和 api 日志是否正常

Job 变成 errored

看 React Admin 的错误字段,或者查看日志:

docker compose logs -f api

常见原因:

  • Gitea token 权限不足
  • GITEA_BASE_URL 不正确
  • Bot 无法访问 Gitea
  • Gitea API 路径和当前 Gitea 版本不兼容
  • 模型 API key 或模型名不正确

没有 OpenAI API Key 会怎样?

可以正常启动。

Worker 会使用 mock reviewer,不会调用模型。适合先验证 webhook、队列、Gitea status/comment 回写链路。

Gitea 是远程服务器,本机 bot 收不到 webhook

远程 Gitea 必须能访问你的 bot 地址。

如果 bot 在本机,可以用:

  • 公网服务器
  • 内网穿透
  • VPN
  • frp
  • cloudflared
  • ngrok

把本机 8080 暴露给 Gitea。

9. 本地开发命令

后端测试:

go test ./...

前端安装依赖:

npm install --prefix web

前端构建:

npm run build --prefix web

校验 Docker Compose:

docker compose config

10. 当前限制

当前版本还有这些能力未完成或待增强:

  • 更精确的 diff 行号映射
  • finding 去重
  • summary comment 更新而不是每次新增
  • stale head sha 二次检查
  • 仓库白名单
  • secret 加密存储、检测和脱敏
  • .gitea-review-bot.yml
  • PR comment commands
  • 多管理员和权限管理
  • 成本统计
  • 质量评估集

建议先用测试仓库验证闭环,确认稳定后再进入更细的 inline review 和质量治理阶段。

About

一个基于 Go + React 的 Gitea PR 代码审查 Bot

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors