掘金 人工智能 05月16日 11:13
AI 代码审核
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文介绍了如何利用AI进行代码审查,以提高开发效率和代码质量。主要通过三种方法实现:使用JS脚本调用OpenAI API进行代码评审、利用ai-pre-commit-reviewer插件进行代码提交前的自动审查,以及结合Gerrit代码审查管理系统,使用AI代替人工执行代码审查。文章详细阐述了每种方法的实现步骤、配置过程和效果,旨在帮助开发者更高效地发现代码中的潜在问题。

💡**JS脚本实现AI代码审查**:通过Node.js脚本调用OpenAI API,利用git的pre-commit hooks在代码提交前进行评审。该方法涉及校验暂存区代码、获取差异内容、准备prompt、定义AI执行器以及处理结果等步骤,关键在于prompt的内容,直接影响AI评审效果。

📦**ai-pre-commit-reviewer插件简化流程**:推荐使用现成的ai-pre-commit-reviewer插件,该插件封装了AI代码审查的流程,开发者只需进行简单的配置即可实现代码提交前的自动审查。安装插件后,配置.env文件,设置模型服务地址、密钥和语言,即可预览审查效果。

⚙️**Gerrit集成AI代码审查提升效率**:结合Gerrit代码审查管理系统,利用AI代替人工执行代码review,实现更高效的代码审查。通过安装和配置Gerrit,并集成ai-code-review插件,可以实现代码提交后的自动AI审查,有效发现代码中的潜在问题。

ai-code-review

  在日常开发中,我们经常会遇到一些问题,比如代码质量问题、安全问题等。如果我们每次都手动去检查,不仅效率低下,而且容易出错。  所以我们可以利用 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 = execSync("git diff --cached").toString();    if (!diff) {      console.log("No diff content found.");      process.exit(0);    }    return diff;  } catch (error) {    console.error("Error getting diff content:", error.message);    process.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 执行器

  这里我用 chatgpt 实现的,具体代码如下:

const execCodeReviewer = (text) => {  const apiKey = ''  const apiBaseUrl = ''  const translateUrl = `${apiBaseUrl}/v1/chat/completions`  return new Promise((resolve, reject) => {    fetch(translateUrl, {      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(details);    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 reseponse = await execCodeReviewer(prompt);    handleReviewResult(reseponse)    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/shGIT_ROOT=$(git rev-parse --show-toplevel)node "$GIT_ROOT/pre-commit.js" exit $?

保存退出后,我们就可以使用 git 做下测试。

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 脚本来实现的,其实也可以通过现成插件来实现。原理和第一个方法是一样的,只不过是插件帮我们封装好了,我们只需要配置下即可。插件地址,欢迎大家star。

2.1 安装插件

npm install ai-pre-commit-reviewer --save-dev#安装完成后执行npx add-ai-review #添加执行逻辑到git pre-commit钩子中

2.2 配置文件

  插件安装完成后,新建一个.env 文件

baseURL= *** #模型服务地址apiKey=*** #模型服务密钥language=chinese #语言

2.3 效果预览

  也可以配合husky使用,进行语法检查后执行code review。

  我这里也是更推荐大家使用这个,简单易上手。

3. gerrit + ai-code-review

  Gerrit 是由 Google 开发的代码审查管理系统,基于 Git 版本控制系统构建,主要特性包括:

  其核心功能主要是通过 refs/for/ 推送机制,确保所有代码变更必须通过审核。因此我们可以利用 ai 代替人工去执行代码 review,这样效率也会更高效。

2.1 gerrit 安装与配置

# 执行以下命令docker pull gerritcodereview/gerrit:latest

  安装完后可以看下容器列表

  没问题后启动服务,然后在浏览器中访问 http://localhost:8080/ 就可以看到gerrit首页

2.1.1 配置 ssh 密钥
ssh-keygen -t ed25519 -C "your_email@example.com"# 直接按3次回车(不要设置密码)cat ~/.ssh/id_ed25519.pub  # 复制输出的内容

  然后在 "settings" 页面中选择左侧的"SSH Keys",将复制的公钥内容粘贴进去。添加完成后测试下连接情况。

ssh -p 29418 admin@localhost  # 输入yes接受指纹

  看到 Welcome to Gerrit Code Review 表示成功

2.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-Projectscurl -Lo .git/hooks/commit-msg http://localhost:8080/tools/hooks/commit-msgchmod +x .git/hooks/commit-msg

  然后新建个js文件,写点代码并提交。

git push origin HEAD:refs/for/refs/meta/config # 提交到 refs/meta/config 分支

  然后在gerrit首页可以看到刚刚提交的代码,点击查看详情,可以看到代码审核的流程。

2.2 插件安装和配置

  将 ai-code-review 插件克隆到本地。插件详情可参考官方文档。此插件可以使用不同的 AI Chat 服务(例如 ChatGPT 或 OLLAMA)

git clone https://gerrit.googlesource.com/plugins/ai-code-review

  安装 Java 和构建工具

sudo apt updatesudo apt install -y openjdk-21-jdk maven  # 官方文档说 11 就行,但是我实际上跑了后发现需要 JDK 21+

  进去项目目录构建 JAR 包

cd ai-code-reviewmvn clean package

  当输出BUILD BUILD SUCCESS时,表示构建成功。进入目录看下生成的包名。

  然后将生成的jar包复制到 gerrit 的 plugins 目录下

# 我这里容器名为 gerrit,JAR 文件在 target/ 目录docker cp target/ai-code-review-3.11.0.jar gerrit:/var/gerrit/plugins/

  然后进入容器内看下插件列表,确认插件已经安装成功

  也可以在 gerrit 网页端查看插件启动情况

  接着修改配置文件,在 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                       。

  更多字段配置参考官方文档

  这些都完成后,重启 gerrit 服务。然后修改下代码,写段明显有问题的代码,重新 commit 并 push 代码,看下 AI 代码评审的效果怎么样。

  可以看到 ai 审查代码的效果还是不错的。当然我这里是修改了插件的prompt,让它用中文生成评论,它默认是用英文回答的。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

AI代码审查 代码质量 开发效率 Gerrit pre-commit hook
相关文章