问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

轻松连接 ChatGPT实现代码审查

创作时间:
作者:
@小白创作中心

轻松连接 ChatGPT实现代码审查

引用
1
来源
1.
https://www.cnblogs.com/wintersun/p/18462943

随着人工智能技术的快速发展,将ChatGPT等AI工具集成到软件开发流程中已成为提升开发效率和代码质量的重要手段。本文将详细介绍如何在GitLab平台中实现ChatGPT代码审查功能,通过自动化工具帮助开发者快速发现代码中的潜在问题,提升代码审查的效率和准确性。

概念

你是否希望每个拉取/合并请求(Pull Request/Merge Request)都能先由ChatGPT-4检查,然后再由你检查?你是否希望在同事看到代码修改之前就能得到即时反馈?你是否想检测出谁泄露了机密数据或API密钥,并能标记“罪魁祸首”以便立即纠正?

我们非常清楚,GPT可以很好地生成代码。但事实证明,它也能同样顺利地审查代码!下面将向大家展示实际操作过程(为避免显示过多,部分代码采用了模糊处理)。

流程

准备工作

  1. Gitlab平台:确保已经搭建好Gitlab平台,并且拥有管理员权限。
  2. ChatGPT账号:注册并获取OpenAI API的访问密钥,这是与ChatGPT进行交互的必需凭证。
  3. 开发环境:搭建一个能够处理Web请求的开发环境,用于接收Gitlab的Webhook通知,并调用ChatGPT API进行代码审查。

步骤一

创建了一个测试合并请求,并在其中添加了一个格式略有损坏的JSON文件和明文密码,从而再现了一个安全漏洞:

我们可以看到,人工智能不仅检测到了敏感信息,还将其屏蔽在评论中,并标记我将其删除。

这里还有另一条评论:

与GitLeaks等使用regex和通配符静态执行简单搜索的工具相比,它的分析功能要强大得多。

步骤二

来自前端合并请求的示例(同事的截图),仅突出某些要点:

GPT-4o模型显示了对React的充分了解。每个人都知道这个设计的关键,但他们总是忘记。

或者说,在这里,我就像读了一本书:

我以举出很多例子,但关键是它的建议是有意义的!当然,并不是所有的意见都值得关注,但很大一部分是非常宝贵的。

实施

将介绍如何在短短一小时内用Python编程实现自动审核流程。这段代码应立即添加到CI/CD流程中,以实现最大效果和流程自动化。将其封装到一个CI/CD作业中并在每个MR/PR上执行(只需将来自renovate/dependabot的更改作为例外情况)是再好不过的了。将与您分享带有架构模块的想法,让您像构造函数一样将其拼凑起来。

在GitLab的CI/CD pipeline中,编写一个脚本,它能够:

  • 获取Merge Request中的代码差异(diff)或者变更文件。
  • 将代码发送到ChatGPT进行分析。
  • 获取ChatGPT的反馈,并将其以审查评论的形式提交到合并请求中。

示例流程

stages:
- code_review

code_review:
stage: code_review
script:
# 1. 获取代码变更
- git diff HEAD~1 HEAD > changes.diff
# 2. 使用Python调用OpenAI API发送代码进行审查
- python3 scripts/chatgpt_review.py changes.diff
# 3. 将ChatGPT的反馈添加为MR评论
only:
- merge_requests

让我们开始工作,用Python编写代码:

第一步:连接人工智能模型

我们需要连接到人工智能模型:

import openai

# 设置API密钥
openai.api_key = os.getenv("OPENAI_API_KEY")

def get_code_diff(file_path):
    with open(file_path, 'r') as file:
        return file.read()

def get_chatgpt_review(code_diff):
    response = openai.Completion.create(
        engine="gpt-4", # 使用GPT-4模型
        prompt=f"Review the following code changes:\n\n{code_diff}",
        max_tokens=500,
        temperature=0.5
    )
    return response.choices[0].text.strip()

def main():
    # 获取代码变更
    code_diff = get_code_diff("changes.diff")
    # 请求ChatGPT进行代码审查
    review = get_chatgpt_review(code_diff)
    # 输出审查反馈,后续可以通过GitLab API添加到MR评论中
    print(review)

if __name__ == "__main__":
    main()

是OpenAI的GPT-4o。但我推荐Azure OpenAI

from openai import AzureOpenAI

如果是第一次,请向GPT询问如何操作。

第二步:代码更改和注释

获取代码变更和对这些变更的注释。我们使用的是GitLab,因此将立即提供端点作为示例:

使用MR变更API获取代码变更:/api/v4/projects/{gitlab_project_id}/merge_requests/{gitlab_request_id}/changes?access_raw_diffs=true

使用MR Notes API发表评论:/api/v4/projects/{gitlab_project_id}/merge_requests/{gitlab_request_id}/notes?order_by=created_at&sort=asc

其中:

gitlab_request_id = os.getenv("CI_MERGE_REQUEST_IID")
gitlab_project_id = os.getenv("CI_PROJECT_ID")

为美观起见,需要对GitLab的JSON响应进行解析。

第三步:发送代码供人工智能审查

不要忘了在开头添加一个提示,说明要做什么,并将所有内容放入一个请求中:

review_request=f"{prompt}\n\n{notes}\n\n{changes}"

在提示中,您需要礼貌地要求人工智能根据标准分析您的代码更改--类似这样(与我们使用的相比,这是一个非常简化的版本):

"As a Developer, I want to ask you to perform a GitLab Merge Request review.
Consider previous comments noted below and avoid repeating similar recommendations.
If you spot a recurring issue, skip it.
For security issues or sensitive information leaks, mention the assignee's username with @.
Make your feedback clear, concise, and actionable, with specific improvement recommendations.
Review the code snippet below based on these criteria:
- Syntax and Style: Look for syntax errors and deviations from conventions.
- Performance Optimization: Suggest changes to improve efficiency.
- Security Practices: Check for vulnerabilities and hard-coded secrets (mask half the info).
- Error Handling: Identify unhandled exceptions or errors.
- Code Quality: Look for code smells, unnecessary complexity, or redundant code.
- Bug Detection: Find potential bugs or logical errors."

步骤 4:将回复作为评论发布

只需将收到的回复作为评论发布即可。

为此创建一个名为AI MR review的GitLab PAT令牌,并直接POST到MR notes API:/api/v4/projects/{gitlab_project_id}/merge_requests/{gitlab_request_id}/notes

在获取ChatGPT的反馈后,使用GitLab的API将这些反馈作为合并请求的评论提交。

示例提交评论的请求:

curl --request POST \
--header "PRIVATE-TOKEN: <your_access_token>" \
--data "body=ChatGPT review feedback: $review" \
--url https://gitlab.example.com/api/v4/projects/:id/merge_requests/:mr_iid/notes

优化和扩展

  1. 自定义ChatGPT模型:如果可能的话,可以使用自定义的ChatGPT模型来进行代码审查。这可以通过微调预训练的ChatGPT模型来实现,使其更加适合特定项目的代码审查需求。
  2. 增加审查规则:除了ChatGPT生成的评论和建议外,还可以增加一些自定义的审查规则。例如,可以检查代码是否符合特定的编码规范、是否存在常见的安全漏洞等。
  3. 优化性能:随着项目的不断发展和代码量的增加,代码审查机器人的性能可能会成为瓶颈。因此,需要不断优化代码审查机器人的性能,以提高其处理速度和准确性。

结论

优势

实施此解决方案将为以下方面带来改进

  • DevSecOps: 大幅提高安全性
  • 高级+级别: 现在,查找MR/PR中的错误和不足无需通读代码即可完成,人工智能将为您代劳。
  • 开发/质量保证:您将立即获得令人惊喜的有用评论和建议。
  • 业务: 在输出时获得更好的代码。

缺点

  • 成本: 难以预测;这完全取决于您计划提交多少审查意见以及由哪个模型进行审查。

风险

  • 持续改进: 改进这种工具的想法可能无穷无尽;更多的内容并不总是意味着更好的审核。迭代测试更改需要一些时间。
  • “改进": 可能会变得更懒=),但懒惰是进步的动力,不是吗?

前景

想象一下机会:这将是你的脚本,因此你可以,例如:

  • 从Jira添加任务上下文
  • 为PM创建摘要
  • 编写发布说明/发布变更
  • 搜索漏洞

通过以上步骤,就可以将ChatGPT集成到Gitlab的Merge Request中,实现自动代码审查。这将大大提高代码审查的效率和准确性,同时减轻开发者的负担。让我们把代码写得更好,让生活变得更轻松。欢迎来到人工智能时代,亲爱的同事们!

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号