跳到主要内容基于 AI 的代码审查实践:从脚本到 Gerrit 集成 | 极客日志JavaScriptNode.jsAI
基于 AI 的代码审查实践:从脚本到 Gerrit 集成
综述由AI生成三种利用 AI 进行代码审查的方案:通过 Node.js 脚本调用 OpenAI API 结合 Git pre-commit 钩子实现本地检查;使用现成的 ai-pre-commit-reviewer 插件简化配置;以及在 Gerrit 系统中集成 AI 插件实现自动化审核。重点讲解了脚本编写、Prompt 设计、环境变量配置及 Gerrit 插件部署流程,旨在提升代码质量与安全检测效率。
NodeJser24 浏览 利用 AI 进行代码审查
在日常开发中,我们经常会遇到一些问题,比如代码质量问题、安全问题等。如果我们每次都手动去检查,不仅效率低下,而且容易出错。
我们可以利用 AI 来帮助我们检查代码,这样可以提高我们的效率。
那么,如何利用 AI 来检查代码呢?
1. 使用 JS 脚本
这种方法其实就是写一个简单的脚本,通过调用 OpenAI 的 API,将代码提交给 AI 进行评审。
这里我们需要使用 Node.js 来实现这个功能。利用 git 的 pre-commit hooks,在 git 提交前执行这个脚本。整体流程如下:

接下来我们来具体实现下代码。在项目根目录下新建一个 pre-commit.js 文件,这个文件就是我们的脚本。
1.1 校验暂存区代码
通过 git diff --cached 验证是否存在待提交内容,如果没有改动则直接退出提交。
const { execSync } = require('child_process');
const checkStaged = () => {
try {
const changes = execSync("git diff --cached --name-only").toString().trim();
if (!changes) {
console.log("No staged changes found.");
process.exit(0);
}
} catch (error) {
console.error("Error getting staged changes:", error.message);
process.exit(1);
}
};
1.2 获取差异内容
const getDiff = () => {
try {
const diff = ().();
(!diff) {
.();
process.();
}
diff;
} (error) {
.(, error.);
process.();
}
};
execSync
"git diff --cached"
toString
if
console
log
"No diff content found."
exit
0
return
catch
console
error
"Error getting diff content:"
message
exit
1
1.3 准备 prompt
这里我们需要准备一个 prompt,这个 prompt 就是用来告诉 AI 我们要检查什么内容。
const getPrompt = (diff) => {
return `
你是一名代码审核员,专门负责识别 git 差异中代码的安全问题和质量问题。您的任务是分析 git 差异,并就代码更改引入的任何潜在安全问题或其他重大问题提供详细报告。
这里是代码差异内容:${diff}
请根据以下步骤完成分析:
1. 安全分析:
- 查找由新代码引发的一些潜在的安全漏洞,比如:
a) 注入缺陷(SQL 注入、命令注入等)
b) 认证和授权问题 ...
2. 代码逻辑和语法分析:
- 识别任何可能导致运行时错误的逻辑错误或语法问题,比如:
a) 不正确的控制流程或条件语句
b) 循环使用不当,可能导致无限循环 ...
3. 报告格式:
对于每个发现的问题,需要按照严重等级分为高/中/低。
每个问题返回格式如下:
-[严重等级](高中低)- [问题类型](安全问题/代码质量)
- 问题所在文件名称以及所在行数
- 问题原因 + 解决方案
4. 总结:
在列出所有单独的问题之后,简要总结一下这些变化的总体影响,包括:
- 发现的安全问题数量(按严重程度分类)
- 发现的代码质量问题的数量(按严重性分类)
请现在开始你的分析,并使用指定的格式陈述你的发现。如果没有发现问题,请在报告中明确说明。
输出应该是一个简单的结论,无论是否提交这些更改,都不应该输出完整的报告。但是要包括文件名。并将每行标识的问题分别列出。
如果存在高等级的错误,就需要拒绝提交
回答里的结尾需要单独一行文字 "COMMIT: NO" 或者 "COMMIT: YES" 。这将用来判断是否允许提交
`;
};
1.4 定义一个 AI 执行器
const execCodeReviewer = (text) => {
const apiKey = '';
const apiBaseUrl = '';
const apiUrl = `${apiBaseUrl}/v1/chat/completions`;
return new Promise((resolve, reject) => {
fetch(apiUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${apiKey}`,
},
body: JSON.stringify({
stream: false,
messages: [
{
role: 'user',
content: text,
},
],
}),
})
.then(res => res.json().then(data => resolve(data.choices[0].message.content)))
.catch(err => {
console.error(err);
});
});
};
1.5 结果处理
这里我们需要解析一下结果,提取结果中是否包含 "COMMIT: YES" 关键字,有则允许提交,否则不允许提交并打印结果。
const handleReviewResult = (result) => {
const decision = result.includes("COMMIT: YES") ? "YES" : "NO";
if (decision === 'NO') {
console.log("\nCritical issues found. Please address them before committing.");
console.log(result);
process.exit(1);
}
console.log("\nCommit approved.");
};
1.6 主函数执行整个流程
const main = async () => {
try {
checkStaged();
const diffContent = getDiff();
console.log("Running code review...");
const prompt = getPrompt(diffContent);
const response = await execCodeReviewer(prompt);
handleReviewResult(response);
process.exit(0);
} catch (error) {
console.error("Error:", error.message);
process.exit(1);
}
};
1.7 git hooks 里添加执行该脚本逻辑
进入项目根目录,在这里运行 git bash。打开 pre-commit 钩子文件。
vim .git/hooks/pre-commit
#!/bin/sh
GIT_ROOT=$(git rev-parse --show-toplevel)
node "$GIT_ROOT/pre-commit.js"
exit $?
1.8 测试
我新建了一个 test.js 文件,然后添加如下代码:
const fn = () => {
let num = 0;
for (let i = 0; true; i++) {
num += i;
}
};
然后执行 git add . 然后 git commit -m 'test'。效果如下:
看来还是不错的,有效识别代码中的逻辑缺陷与语法隐患(如无限循环、变量误用等),同时当不满足提交条件后,也是直接终止了 commit。这里面其实比较关键的是 prompt 的内容,ai 评审的效果主要就是取决于它。
2. ai-pre-commit-reviewer 插件
上面我们是通过 js 脚本来实现的,其实也可以通过现成插件来实现。原理和第一个方法是一样的,只不过是插件帮我们封装好了,我们只需要配置下即可。
2.1 安装插件
npm install ai-pre-commit-reviewer --save-dev
2.2 配置文件
baseURL= *** # 模型服务地址
apiKey=*** # 模型服务密钥
language=chinese # 语言
2.3 效果预览
也可以配合 husky 使用,进行语法检查后执行 code review。
3. gerrit + ai-code-review
Gerrit 是由 Google 开发的代码审查管理系统,基于 Git 版本控制系统构建,主要特性包括:
- 强制代码审查机制:所有代码必须通过人工/自动化审查才能合并
- 细粒度权限控制:支持基于项目/分支的访问权限管理
- 在线代码对比:提供可视化差异查看界面(Side-by-Side Diff)
- 插件扩展体系:可通过插件集成 CI/CD、静态分析等工具
其核心功能主要是通过 refs/for/ 推送机制,确保所有代码变更必须通过审核。因此我们可以利用 ai 代替人工去执行代码 review,这样效率也会更高效。
3.1 gerrit 安装与配置
docker pull gerritcodereview/gerrit:latest
3.1.1 配置 ssh 密钥
然后在'settings'页面中选择左侧的"SSH Keys",将复制的公钥内容粘贴进去。添加完成后测试下连接情况。
ssh-p29418 admin@localhost
看到 Welcome to Gerrit Code Review 表示成功。
3.1.2 拉取项目测试
可以在 BROWSE > Repositories 里查看当前项目列表,我这里用 All-Projects 做下测试,理论上是要新建项目的。
git clone "ssh://admin@localhost:29418/All-Projects"
安装 Gerrit 提交钩子 commit-msg(必须!)。Gerrit 依赖 commit-msg 钩子实现以下功能:
- 生成 Change-Id:每个提交头部自动添加唯一标识符,格式示例
Change-Id: I7e5e94b9e6a4d8b8c4f3270a8c6e9d3b1a2f5e7d
- 校验提交规范:确保提交信息符合团队约定格式(如包含任务编号)
- 防止直接推送:强制推送到 refs/for/ 路径而非主分支
cd All-Projects
curl -Lo .git/hooks/commit-msg http://localhost:8080/tools/hooks/commit-msg
chmod +x .git/hooks/commit-msg
git push origin HEAD:refs/for/refs/meta/config
然后在 gerrit 首页可以看到刚刚提交的代码,点击查看详情,可以看到代码审核的流程。
3.2 插件安装和配置
将 ai-code-review 插件克隆到本地。插件详情可参考官方文档。此插件可以使用不同的 AI Chat 服务(例如 ChatGPT 或 OLLAMA)。
git clone https://gerrit.googlesource.com/plugins/ai-code-review
sudo apt update
sudo apt install -y openjdk-21-jdk maven
cd ai-code-review
mvn clean package
当输出 BUILD BUILD SUCCESS 时,表示构建成功。进入目录看下生成的包名。
然后将生成的 jar 包复制到 gerrit 的 plugins 目录下。
docker cp target/ai-code-review-3.11.0.jar gerrit:/var/gerrit/plugins/
然后进入容器内看下插件列表,确认插件已经安装成功。
接着修改配置文件,在 gerrit 的 etc 目录下找到 gerrit.config 文件。但在这之前需要在 Gerrit 中创建一个 AI Code Review 用户,这个席位用于 AI 来使用进行代码评审。
vi var/gerrit/etc/gerrit.config
[plugin "ai-code-review"]
model = deepseek-v3
aiToken = ***
aiDomain = ***
gerritUserName = AIReviewer
aiType = ChatGPT
globalEnable = true
- model(非必填): 使用的模型
- aiToken(必填): AI 模型的密钥
- aiDomain(非必填): 请求地址,默认是 https://api.openai.com
- gerritUserName(必填): AI Code Review 用户的 Gerrit 用户名。我这里创建的用户名为 AIReviewer
- aiType(非必填): AI 类型,默认是 ChatGPT
- globalEnable(非必填): 是否全局启用,默认是 false,表示插件将仅审核指定的仓库。如果不设置为 true 的话。需要添加 enabledProjects 参数,指定要运行的存储库,例如:'project1,project2,project3'。
这些都完成后,重启 gerrit 服务。然后修改下代码,写段明显有问题的代码,重新 commit 并 push 代码,看下 AI 代码评审的效果怎么样。
可以看到 ai 审查代码的效果还是不错的。当然我这里是修改了插件的 prompt,让它用中文生成评论,它默认是用英文回答的。
相关免费在线工具
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- 随机西班牙地址生成器
随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
- Keycode 信息
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
- Escape 与 Native 编解码
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
- JavaScript / HTML 格式化
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online