多平台代码监控 + AI 代码审阅看板。把你的 GitLab / GitHub / Gitee 仓库活动(谁推了什么、代码库里有什么、最近提交 diff)聚合到一个网页, 并能对任意项目或提交一键发起 AI 代码审阅。
Python + Flask + SQLite,单文件 app.py。内网小团队零运维。
| # | 模块 | 内容 |
|---|---|---|
| ① | 最近推送 | Webhook 实时捕获:谁推了 / 推到哪个分支 / 每次 commit 的 message + 文件增删改 |
| ② | 代码库 | API 轮询同步:项目路径 / 默认分支 / 可见性 / 最后活动 / 平台 |
| ③ | 贡献者提交 | 按贡献者筛选,展开其近 30 天提交,可加载更多 |
| ④ | 代码汇总 | 后台扫描的代码结构:每个项目文件数 / 语言分布 / 扫描时间 |
| ⑤ | 提交扫描 | 实时拉取的提交 diff:增删行 / 变更文件明细,可点开看完整 diff |
| ⑥ | 语言统计 | 全平台聚合的语言(后缀)占比条形图 |
- 平台筛选:导航栏下拉,按 GitLab / GitHub / Gitee 实例过滤所有模块
- 模块内搜索:每个模块卡片头右侧带搜索框(下拉框 + 搜索框二合一), 输入即过滤当前模块;与平台筛选联动共存
- 卡片折叠:点卡片头展开/收起
- Diff 详情弹窗:点提交「详情」看完整逐行 diff(增删行高亮)
- AI 代码审阅:
- 每个项目 / 提交旁有「审阅」按钮,一键绑定上下文并打开 AI 对话面板
- 浮动面板支持多模型切换、多会话历史(本地持久化)、流式输出
- 项目上下文 = 元信息 + 代码结构 + 文件树 + README + 最近提交
- 提交上下文 = 元信息 + 完整 message + 完整 diff
一个 providers.json 配置任意多个实例,自动路由:
| 平台 | 轮询同步 | Webhook 实时 | diff 拉取 |
|---|---|---|---|
| GitLab | ✅ | ✅(X-Gitlab-Token 校验) | ✅ |
| GitHub | ✅ | ✅(HMAC 签名校验) | ✅ |
| Gitee | ✅ | ✅(X-Gitee-Token 校验) | ✅ |
cd gitlab-monitor
pip install -r requirements.txt复制示例并填入你的实例:
cp providers.json.example providers.jsonproviders.json 每个实例一项:
向后兼容:没有
providers.json时,回退读.env里的单个GITLAB_URL/GITLAB_TOKEN/WEBHOOK_SECRET(旧部署不用改)。
在 .env 填 OpenAI 兼容接口:
cp .env.example .env| 变量 | 说明 |
|---|---|
AI_BASE_URL |
OpenAI 兼容接口地址 |
AI_API_KEY |
API key,不填则 AI 审阅不可用 |
AI_MODELS |
模型列表,逗号分隔,看板下拉可切换 |
python app.py
# Running on http://0.0.0.0:5000打开 http://<本机IP>:5000,「代码库」「代码汇总」应已自动同步。
配置 webhook 后,「最近推送」「提交扫描」实时出现。
在各平台对应位置填:
- URL:
http://<monitor内网IP>:5000/webhook - Secret / Token: 与
providers.json里该实例的webhook_secret完全一致 - Trigger: 勾选 Push events
| 平台 | 配置位置 |
|---|---|
| GitLab | 项目 → Settings → Webhooks(或 Admin → System Hooks 全实例) |
| GitHub | 仓库 → Settings → Webhooks |
| Gitee | 仓库 → 管理 → WebHooks |
webhook 是多平台自动路由的:按请求头(
X-Gitlab-Event/X-GitHub-Event/X-Gitee-Event)识别来源,用对应 provider 验签 + 解析。
| 变量 | 默认 | 说明 |
|---|---|---|
AI_BASE_URL |
— | OpenAI 兼容接口地址 |
AI_API_KEY |
— | 不填则 AI 审阅不可用 |
AI_MODELS |
— | 逗号分隔的模型列表 |
PORT |
5000 |
监听端口 |
POLL_MINUTES |
15 |
轮询间隔(项目多可调大) |
DB_PATH |
gitlab_monitor.db |
SQLite 路径 |
VERIFY_SSL |
true |
自签证书设 false |
GITLAB_URL / GITLAB_TOKEN / WEBHOOK_SECRET |
— | 无 providers.json 时的回退单实例配置 |
每项字段:name / platform / api_base / token / webhook_secret / enabled。
| 方法 | 路径 | 用途 |
|---|---|---|
| GET | / |
看板 |
| GET | /health |
健康检查 |
| POST | /webhook |
接收推送(多平台自动路由) |
| GET | /api/events |
推送事件列表 |
| GET | /api/contributors |
贡献者列表 |
| GET | /api/contributors/commits?email=&limit=&offset=&days=30 |
贡献者提交 |
| GET | /api/commits/<sha>/diff |
单个提交完整 diff |
| POST | /api/commits/refresh-diffs |
手动触发拉取最近 diff |
| GET | /api/ai/models |
可用 AI 模型 |
| GET | /api/projects/<id>/context |
项目 AI 上下文 |
| POST | /api/ai/chat |
AI 对话(SSE 流式) |
gitlab-monitor/
├── app.py # 全部逻辑(路由 + providers + 轮询 + AI)
├── templates/dashboard.html # 看板(单文件 HTML/CSS/JS)
├── providers.json.example # 多平台配置示例
├── .env.example # AI 等配置示例
├── requirements.txt
├── Dockerfile / docker-compose.yml
├── DESIGN.md # 链路与设计思路
└── cli_inspect.py # 命令行排查工具
app.py 分块:
| 块 | 职责 |
|---|---|
Provider + GitLab/GitHub/GiteeProvider |
三平台统一抽象:列表 / 提交 / diff / webhook 验签解析 |
webhook() |
多平台路由 + 验签 + store_push() |
poll_loop() / sync_projects() / sync_recent_commits() |
定时拉存量 |
background_file_scanner() / update_code_summary() |
后台扫描代码结构 |
build_project_context() / build_commit_context() |
组装 AI 上下文 |
ai_stream() |
OpenAI 兼容 SSE 流式 |
dashboard() + API 路由 |
看板与前端数据接口 |
数据模型(SQLite):projects / push_events / commits / code_summary,
跨平台用 {platform}:{instance}:{remote_id} 全局 id 避免冲突。
docker compose up -d --build
docker compose logs -f数据落在 ./data/gitlab_monitor.db。providers.json 和 .env
用 volume 或 bind mount 挂进容器。
[Unit]
Description=GitLab Monitor
After=network.target
[Service]
WorkingDirectory=/opt/gitlab-monitor
EnvironmentFile=/opt/gitlab-monitor/.env
ExecStart=/opt/gitlab-monitor/venv/bin/gunicorn -b 0.0.0.0:5000 --workers 2 app:app
Restart=always
[Install]
WantedBy=multi-user.targetproviders.json和.env已在.gitignore,别提交真实 token。- token 只给只读权限(GitLab
read_api、GitHubrepo:read之类),别用 admin token。 webhook_secret必须设,否则任何人都能往/webhook灌假推送事件。- 看板默认无鉴权;暴露在内网以外时,在反代层加 Basic Auth 或限制 IP。
- SQLite 文件定期备份。
见 DESIGN.md。核心:
Webhook 抓增量(谁推了 / 推了什么,实时推)+ API 轮询抓存量(代码库有什么,定时拉),两路落同一个 SQLite, 一个看板合并读。多平台通过 provider 抽象统一,AI 审阅在看板上原地接入。
[ { "name": "company-gitlab", // 实例名(看板显示用) "platform": "gitlab", // gitlab | github | gitee "api_base": "https://gitlab.example.com", "token": "glpat-xxxxxxxxxxxxxxxx", // 只读 token 即可 "webhook_secret": "随机串", // 与平台侧 webhook 配置一致 "enabled": true } ]