点击上方蓝字关注我们
人工智能AI时代已经来临。从事 IT 工作的每个人都已经熟悉了我们开发的 “新挚友”--人工智能。
概念
你希望每个拉取/合并请求都先由 ChatGPT-4 检查,然后再由您检查吗?
你想在同事看到代码修改之前就得到即时反馈吗?
想不想检测出谁泄露了机密数据或 API 密钥,并能标记 “罪魁祸首 ”以便立即纠正?
我们非常清楚,GPT 可以很好地生成代码。......但事实证明,它也能同样顺利地审查代码!下面将向大家展示实际操作过程(为避免显示过多,部分代码采用了模糊处理)。
流程
准备工作
Gitlab平台:确保已经搭建好Gitlab平台,并且拥有管理员权限。
ChatGPT账号:注册并获取OpenAI API的访问密钥,这是与ChatGPT进行交互的必需凭证。
开发环境:搭建一个能够处理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.yml
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
示例Python脚本
import os
import 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}"
在提示中,您需要礼貌地要求人工智能根据标准分析您的代码更改--类似这样(与我们使用的相比,这是一个非常简化的版本)提示词:
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
优化和扩展
自定义ChatGPT模型:如果可能的话,可以使用自定义的ChatGPT模型来进行代码审查。这可以通过微调预训练的ChatGPT模型来实现,使其更加适合特定项目的代码审查需求。
增加审查规则:除了ChatGPT生成的评论和建议外,还可以增加一些自定义的审查规则。例如,可以检查代码是否符合特定的编码规范、是否存在常见的安全漏洞等。
优化性能:随着项目的不断发展和代码量的增加,代码审查机器人的性能可能会成为瓶颈。因此,需要不断优化代码审查机器人的性能,以提高其处理速度和准确性。
结论
优势
实施此解决方案将为以下方面带来改进
DevSecOps: 大幅提高安全性
高级+级别:现在,查找 MR/PR 中的错误和不足无需通读代码即可完成,人工智能将为您代劳。
开发/质量保证:您将立即获得令人惊喜的有用评论和建议。
业务:在输出时获得更好的代码。
缺点
成本:难以预测;这完全取决于您计划提交多少审查意见以及由哪个模型进行审查。
风险
持续改进:改进这种工具的想法可能无穷无尽;更多的内容并不总是意味着更好的审核。迭代测试更改需要一些时间。
“改进":可能会变得更懒=),但懒惰是进步的动力,不是吗?
前景
想象一下机会:这将是你的脚本,因此你可以,例如:
从 Jira 添加任务上下文
为 PM 创建摘要
编写发布说明/发布变更
搜索漏洞
通过以上步骤,就可以将ChatGPT集成到Gitlab的Merge Request中,实现自动代码审查。这将大大提高代码审查的效率和准确性,同时减轻开发者的负担。让我们把代码写得更好,让生活变得更轻松。欢迎来到人工智能时代!