AI-Codereview-Gitlab:把 GitLab Webhook 接到大模型上做 MR 审查
基于大模型(DeepSeek,OpenAI等)的 GitLab 自动代码审查工具;支持钉钉/企业微信/飞书推送消息和生成日报;支持Docker部署;可视化 Dashboard。
秒懂
- 它是什么?
- 它用 GitLab Webhook 触发大模型审查 diff,把结果写回 MR Note,并推送钉钉、企业微信或飞书。本文梳理它的数据流、部署命令、agentic 模式的真实开销,以及它在什么情况下不该用。
- 适合谁用?
- 适合已经在用 GitLab 做 Merge Request 流程、并且愿意把 diff 交给第三方大模型 API 的团队,尤其是希望审查结果直接落在 MR Note 里、顺带推到钉钉或企业微信的场景。不适合代码不能出内网、又不想自建 Ollama 的团队,也不适合指望它替代人工评审的团队:README 描述的机制是审查 diff 并写回 Note,不是阻断合并。
- 能商用吗?
- 可以。Apache-2.0 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
- 还在维护吗?
- 在维护。仓库最近一次提交在 4 天前。
- 用什么语言写的?
- 主要是 Python(依据 GitHub 的语言统计)。
以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。
开源项目深度解析
它解决的是评审触发时机的问题,不是评审质量问题
大多数团队的代码评审卡在同一个位置:MR 提出来了,人还没看。AI-Codereview-Gitlab 把审查动作挂在 GitLab 的事件上。按 README 的描述,当用户在 GitLab 提交代码(Merge Request 或 Push)时,GitLab 触发 webhook 调用本系统接口,系统调用第三方大模型审查代码,再把结果写回对应的 Merge Request 或 Commit 的 Note。
所以它卖的是时机,不是判断力。评审意见的质量取决于你接的那个模型,项目本身做的是把 diff 取出来、拼成 prompt、发出去、把返回贴回去这一串管道工作。对使用者来说,真正的收益是 MR 打开后几分钟内就有一份可读的意见,而不是等人排期。
目标读者是已经在 GitLab 上跑 MR 流程的中小团队。README 没有给出任何用户规模或性能数据,也没有说明单实例能扛多少并发 webhook,这部分需要自己压。
一次审查的完整数据流:Webhook 进,Note 出
链路是单向的,没有回调确认环节。GitLab 在 Push 或 MR 事件上 POST 到 http://{your-server-ip}:5001/review/webhook,服务端收到后按 SUPPORTED_EXTENSIONS 过滤文件类型,README 明确写着未配置的文件类型不会被审查。默认值是 .java,.py,.php,.yml,.vue,.go,.c,.cpp,.h,.js,.css,.md,.sql,这意味着一个纯 TypeScript 项目如果不动这个配置,审查结果会是空的。
过滤之后是模型调用。LLM_PROVIDER 决定走哪家,README 列出的是 zhipuai、openai、deepseek 和 ollama 四种取值,功能列表里还提到兼容 Anthropic 和通义千问。这里有个文档不一致:供应商枚举以 .env 注释为准更稳妥,接之前先确认你要用的那家在代码里真的有分支。
返回的审查文本被写回 MR 或 Commit 的 Note,同时如果 DINGTALK_ENABLED=1,会往 DINGTALK_WEBHOOK_URL 推一条消息。企业微信和飞书走类似配置,README 把细节指向 doc/faq.md。Dashboard 是另一个进程,streamlit 跑在 5002 端口,读的是审查日志。
部署:两个进程,一份 .env
Docker 路线的命令在 README 里是完整的。git clone 仓库,cp conf/.env.dist conf/.env,编辑 conf/.env,然后 docker-compose up -d。验证方式是访问 http://your-server-ip:5001,看到 The code review server is running. 就算起来了;Dashboard 在 5002,能看到审查日志页面即可。
本地 Python 路线要求 3.10+,pip install -r requirements.txt 之后分两个终端:python api.py 起 API,streamlit run ui.py --server.port=5002 --server.address=0.0.0.0 起 Dashboard。注意 Dashboard 不是 api.py 顺带拉起来的,少起一个进程不会报错,只是 5002 打不开。
GitLab 侧的配置有两个坑。Webhook URL 是 http://{your-server-ip}:5001/review/webhook,Trigger Events 只勾 Push Events 和 Merge Request Events,README 特别标注不要勾其它 Event。Token 的优先级是 .env 里的 GITLAB_ACCESS_TOKEN 优先,没有才用 Webhook 传的 Secret Token。如果两处都配了不同的 token,实际生效的是 .env 那份,排查权限问题时先看这里。另外 README 提醒 GitLab 必须能访问本系统,内网受限时建议把系统部署在外网服务器上,这个建议本身也说明了它默认假设的信任边界。
Review Style 和 Agentic 模式是两套不同的东西
Review Style 是 prompt 层面的开关,README 给了四种:专业型、讽刺型、绅士型、幽默型,各自配了一句示例话术。它改变的是措辞,不改变模型看到多少上下文。想让审查更准,调这个没用。
Agentic Review 是上下文层面的开关,由 REVIEW_STRATEGY 控制。默认值 diff_only 只对 diff 做审查,README 说行为与原版完全一致。设为 agentic 后,LLM 获得工具调用能力,包括 read_file 和沙箱内的 run_command,可以在本地克隆的代码库内自主探索。相关配置项是 REPO_CACHE_DIR(默认 data/repo_cache/)和 AGENT_MAX_ITERATIONS(默认 20)。
这个模式的设计里有一个明确的取舍:任意阶段失败,包括 clone、fetch、LLM 调用或工具调用异常,都会自动降级回 diff_only。好处是不会因为拉代码失败就完全没结果;代价是失败是静默的,你拿到的 review 可能来自降级路径,而 Note 里未必看得出区别。要判断一次审查到底走了哪条路,得去 Dashboard 的日志里翻。
Agentic 模式的账单:磁盘、内存、token、时延
README 把额外开销列得很直白,这是它比多数同类项目诚实的地方。磁盘按项目克隆,单个项目约 10MB 到 2GB,整体建议预留 ≥50GB。内存单次 session 峰值约 500MB。Token 消耗单次 review 平均 5k 到 50k,是 diff_only 的 3 到 10 倍。时延 30 秒到 5 分钟一次 review。
把这几项放在一起看,结论是 agentic 不适合挂在每次 Push 上。Push 事件比 MR 事件频繁得多,一个活跃仓库一天几十次 Push,按 50k token 上限估算,成本会迅速失控,而且 5 分钟的时延意味着 Note 出现时人早就走开了。更合理的用法是只在 MR 事件上开 agentic,或者干脆不开。
沙箱的边界也值得注意。shell 默认只允许读类命令,README 举的例子是 ls、cat、grep、find、git log,防护是命令白名单加黑名单、路径越界检查和 30 秒超时。要放开需要改 AGENT_SHELL_ALLOWLIST 或 AGENT_SHELL_BLOCKLIST。默认配置是保守的,但一旦你为了让它跑测试而放开写权限,隔离就只剩路径检查和超时了。
什么时候它不该出现在你的工具链里
代码不允许出内网,又不打算自建模型,这个组合直接排除它。默认 provider 是 deepseek,走的是外部 API,diff 内容会离开你的网络。Ollama 是本地选项,但 README 没有给出本地模型下的审查质量参考,也没有说明小模型在这种任务上的表现,需要自己试。
第二种情况是把它当合并门禁。README 描述的行为是写 Note 和推消息,没有任何一处提到根据审查结果阻断合并或设置 MR 状态。想要卡住合并得自己在 GitLab 侧另做规则,这个项目不提供。
第三种是单仓库超大或多语言混杂。SUPPORTED_EXTENSIONS 是一份全局列表,README 没有提到按项目覆盖的机制。如果不同仓库需要不同的文件类型范围,得靠部署多实例或者接受统一配置。
最后是把它当人工评审的替代。模型看的是 diff 和(在 agentic 模式下)仓库里的文件,看不到需求背景、上线窗口和历史决策,这些恰恰是人工评审的主要价值。
替代方案:和直接写 GitLab CI 脚本的差别在哪
最直接的替代不是另一个 AI 审查产品,而是在 .gitlab-ci.yml 里加一个 job,用 curl 把 diff 发给模型 API,再把返回写进 MR。这条路完全可行,差别在四件事。
第一是触发方式。CI job 跟着流水线跑,webhook 服务是常驻进程,前者受 runner 可用性影响,后者受服务本身可用性影响。第二是结果落点。CI 脚本要自己处理 GitLab API 的 Note 写入和去重,这个项目已经把这段封装好了。第三是上下文管理。agentic 模式里的仓库克隆、缓存目录、工具调用循环、失败降级,自己写一遍工作量不小。第四是多通道输出。钉钉、企业微信、飞书三种推送加一个 Streamlit Dashboard,属于配套工程,不是核心逻辑。
反过来说,如果你的需求只是每周跑一次全量审查,或者审查对象不是 GitLab,那这个项目的 webhook 模型和 GitLab 专用配置就是多余的。README 里提到的同作者项目 Entire Dashboard 和 Site Guard 也说明这套代码是按单点工具的思路在扩展,不是往平台方向走。
维护成本、许可与需要自己去验的事
许可证是 Apache-2.0。这意味着可以商用、可以改、可以闭源分发,条件是保留版权与许可声明,并对修改过的文件作出说明;Apache-2.0 同时包含专利授权条款。以上是许可证文本的通行含义,具体到你的分发方式该怎么标注,属于法务判断,本文不构成法律意见。
维护节奏上,仓库最近三个版本是 v1.5.1(2026-06-29)、v1.4.3(2026-05-20)和 v1.4.2(2026-03-15),默认分支 main 的最后一次 push 是 2026-07-23。版本之间有间隔,不是每天在动的项目。升级成本主要取决于你改了多少东西:如果只是改 conf/.env,docker-compose up -d 拉新镜像即可;如果动了代码,或者依赖了 data/repo_cache/ 的目录结构,就得看 release note 有没有动这块。
README 里有一处需要自己确认的地方:功能列表写兼容 DeepSeek、ZhipuAI、OpenAI、Anthropic、通义千问和 Ollama,而 .env 注释里 LLM_PROVIDER 只列了 zhipuai、openai、deepseek 和 ollama。接 Anthropic 或通义千问之前,先去代码里确认 provider 分支存在。另外 README 提到有 Pro 版,安装脚本是 curl -fsSL https://raw.githubusercontent.com/sunmh207/AI-Codereview-Gitlab/refs/heads/main/scripts/pro/install.sh | bash,开源版和 Pro 版的功能边界需要对照 doc/pro.md 自己看,本文只覆盖开源仓库的 README 内容。
编辑结论
适合已经在用 GitLab 做 Merge Request 流程、并且愿意把 diff 交给第三方大模型 API 的团队,尤其是希望审查结果直接落在 MR Note 里、顺带推到钉钉或企业微信的场景。不适合代码不能出内网、又不想自建 Ollama 的团队,也不适合指望它替代人工评审的团队:README 描述的机制是审查 diff 并写回 Note,不是阻断合并。上手前先确认三件事:conf/.env 里 SUPPORTED_EXTENSIONS 是否覆盖你们的实际语言,GITLAB_ACCESS_TOKEN 与 Webhook Secret Token 的优先级是否符合预期,以及如果打算开 REVIEW_STRATEGY=agentic,REPO_CACHE_DIR 所在磁盘是否有 README 建议的 ≥50GB 余量。
社区笔记