一、前言
项目已经重构成Golang,完整版本已可用,欢迎🌟
开发中由于代码Review占用时间太长,一些潜在的Bug没有办法发现,所以开发了代码Review工具,现在分享给你:github.com/monto-fe/co… 欢迎🌟。
如果你使用gitlab也可以进行私有化部署,帮助你发现潜在的代码Bug。
项目需要达到两个目的:
- 能尽可能的发现BUG
- 能改动最少,方便快速安装部署
二、项目原理
【第一版本已更新】通过检测提交的Merge信息对代码进行Review
【待实现】AI检测方式
【待实现】通过关联需求和多项目Merge来进行代码Review
三、项目开发
1. 环境依赖和技术选型
- docker compose > 2.0
- Mysql 8.0或MariaDB 10.5
- React和TS
2. 缓存Gitlab Token对应的项目Id
在实际使用的过程中发现,用户可能录入不止一个Token。因此为了在用户提交merge时对应到具体的Token,需要提前检索对应的项目进行匹配
private async fetchProjectIds(token: string, gitlabAPI: string): Promise<string[]> {
const projectIds: string[] = [];
let page = 1;
const perPage = 100;
while (true) {
const res = await axios.get(`${gitlabAPI}/v4/projects`, {
headers: { 'PRIVATE-TOKEN': token },
params: { per_page: perPage, page },
});
if (Array.isArray(res.data) && res.data.length) {
const ids = res.data.map((proj: any) => String(proj.id));
projectIds.push(...ids);
if (res.data.length < perPage) break;
page += 1;
} else {
break;
}
}
return projectIds;
}
Gitlab接口每次只能拉取100条,所以需要循环拉取
3. 缓存AI Token
当前AI模型的能力不同,我们目前支持的公司内部的AI,需要提供更多的AI选择,这里通过数据库配置,预留了当前能力
public async loadConfig() {
const configRow = await DB.AIConfig.findOne({
where: { is_active: true },
order: [['update_time', 'DESC']]
});
if (!configRow) {
console.warn('No active AI config found, using fallback or skipping initialization.');
return;
}
this.config = {
name: configRow.name,
apiKey: configRow.api_key,
apiUrl: configRow.api_url,
model: configRow.model
};
}
4. 读取merge的diff信息
我们主要对提交merge的diff信息进行审核,这一步通过接口读取。
const response = await axios.get(`${gitlabAPI}/v4/projects/${projectId}/merge_requests/${mergeRequestId}/changes`, {
headers: {
'PRIVATE-TOKEN': gitlabToken
}
});
5. 预置AI提示词
这里内置提示词进行检测,后续需要调整为自定义配置,方便优化提示词
请检查以下代码差异(diff),确保其符合以下原则:
${rule}
要求基于描述信息和逻辑判断分析出diff中疑似Bug的地方,用Markdown格式输出(若没有可输出:未发现Bug):
输出格式:
- 不符合的代码行号 | 违反的原则 | 修改建议
代码信息:
合并请求标题:${title}
描述: ${description || '无描述'}
提交人: ${author_name}
查看合并请求: ${web_url}
代码差异:${diff.map((change:any) => `文件: ${change.new_path}\n差异:\n${change.diff}`).join('\n')}
请按照上述要求进行检查并输出结果。
`
6. 推送Gitlab Comments
将生成的检测信息作为commit的评论信息推送到gitlab仓库
const response = await axios.post(`${gitlabAPI}/v4/projects/${projectId}/merge_requests/${mergeRequestId}/notes`,
{
body: comment, // 这里是 AI 的检查结果
},
{
headers: {
'PRIVATE-TOKEN': gitlabToken,
'Content-Type': 'application/json',
}
}
);
7. 实现快速的部署
.
├── frontend/ # 前端项目目录
│ ├── src/ # 源代码目录
│ ├── public/ # 静态资源目录
│ ├── node_modules/ # 依赖包目录
│ ├── .husky/ # Git hooks 配置
│ └── [配置文件] # 各种配置文件
│
├── backend/ # 后端项目目录
│ ├── src/ # 源代码目录
│ ├── swagger/ # API 文档目录
│ ├── node_modules/ # 依赖包目录
│ ├── .husky/ # Git hooks 配置
│ └── [配置文件] # 各种配置文件
│
├── mysql/ # MySQL 相关配置
├── images/ # 图片资源目录
├── .env # 配置文件
├── docker-compose.yml # 用自有数据库启动
├── docker-compose.mysql.yml # 启动docker mysql数据库
└── docker-compose.mariadb.yml # 启动docker mariadb数据库
为了实现快速部署,对项目中的变量进行了抽离,详细配置如下:
# 部署机器IP
IP=192.168.1.1
# CONSOLE
CONSOLE_PORT=9003
# API
NODE_ENV=production
API_PORT=9000
# 数据库支持:mysql | mariadb
DB_TYPE=mysql
# 使用自有数据库,这里改为您对应的数据库信息
DB_HOST=192.168.1.1
DB_PORT=3306
DB_USER=root
DB_PASSWORD=mysql123456
DB_DATABASE=ucode_review
这样部署的时候只需要更新部署的IP地址和数据库配置,即可拉起服务。
四、项目应用
1. 配置流程
在浏览器中访问:
🌐 地址:http://192.168.1.1:9003 🔐 默认账号密码:admin / 12345678
控制台示意图
首次登录请配置以下内容:
- ✅ AI 模型 Key(支持主流模型)
- ✅ GitLab Token(需具备完整权限)
- ✅ 企业微信机器人(可选)
配置 Webhook(GitLab)
在对应项目中:
Settings➜Webhooks
添加如下地址:
http://192.168.1.1:9000/v1/webhook/merge
✅ 如果 GitLab 支持 Group Webhook,推荐在 Group 层级统一配置。
勾选事件类型:Merge request events
提交 Merge Request 时将自动触发 AI 审查。
Webhook 配置示意
2. 效果展示
推送Gitlab 评论
推动企业微信机器人
五、问题解决
- 减少推送频率
- 只针对部分情况进行检测,比如create merge和update merge的时候,其他情况不再重复推送。
- 环境变量传参问题:
- 通过.env文件 => docker-compose.yml => project读取。
- backend启动时mysql未启动问题
- 通过设置服务延时启动来解决。