轻松连接 ChatGPT实现代码审查

文摘   2024-10-15 20:29   云南  

 




点击上方蓝字关注我们




 

     人工智能AI时代已经来临。从事 IT 工作的每个人都已经熟悉了我们开发的 “新挚友”--人工智能。

 

概念


 

  • 希望每个拉取/合并请求都先由 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 的反馈,并将其以审查评论的形式提交到合并请求中。

示例流程

# .gitlab-ci.ymlstages:   - code_reviewcode_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

示例Python脚本

import osimport openai     main()# 设置 API 密钥if __name__ == "__main__":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)


是 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.”

 


第四步:将回复作为评论发布


 


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

为此创建一个名为 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中,实现自动代码审查。这将大大提高代码审查的效率和准确性,同时减轻开发者的负担。让我们把代码写得更好,让生活变得更轻松。欢迎来到人工智能时代!


Megadotnet
为您介绍各体系平台的新闻,系统研发相关框架,组件,方法,过程,运维,设计。企业IT与互联网信息系统或产品解决方案。开源项目,项目管理。
 最新文章