实现一个AI Code Review项目,欢迎试用

avatar
前端工程师

一、前言

项目已经重构成Golang,完整版本已可用,欢迎🌟

开发中由于代码Review占用时间太长,一些潜在的Bug没有办法发现,所以开发了代码Review工具,现在分享给你:github.com/monto-fe/co… 欢迎🌟。

如果你使用gitlab也可以进行私有化部署,帮助你发现潜在的代码Bug。

项目需要达到两个目的:

  • 能尽可能的发现BUG
  • 能改动最少,方便快速安装部署

二、项目原理

【第一版本已更新】通过检测提交的Merge信息对代码进行Review

image.png

【待实现】AI检测方式

image.png

【待实现】通过关联需求和多项目Merge来进行代码Review image.png

三、项目开发

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)

在对应项目中:

SettingsWebhooks

添加如下地址:

http://192.168.1.1:9000/v1/webhook/merge

✅ 如果 GitLab 支持 Group Webhook,推荐在 Group 层级统一配置。

勾选事件类型:Merge request events

提交 Merge Request 时将自动触发 AI 审查。

Webhook 配置示意

Webhook配置

2. 效果展示

推送Gitlab 评论 image.png

推动企业微信机器人

企业微信截图_aaed96d4-5ce7-4e88-b5c8-06076dfc3b52.png

五、问题解决

  1. 减少推送频率
    • 只针对部分情况进行检测,比如create merge和update merge的时候,其他情况不再重复推送。
  2. 环境变量传参问题:
    • 通过.env文件 => docker-compose.yml => project读取。
  3. backend启动时mysql未启动问题
    • 通过设置服务延时启动来解决。