玩转 ChatGPT+ 极狐 GitLab|自动化的 MR 变更评审来了

本文来自:

尹学峰 极狐(GitLab)高级解决方案架构师

💃 自从 ChatGPT 闪亮登场以来,各种基于它的软件扩展纷至沓来。爱折腾的极狐 GitLab 开发者们,也花式玩转起了 ChatGPT + 极狐 GitLab,让研发工作更高效。

今天,我们来看看如何让 ChatGPT 进行自动化的 MR 变更评审,Enjoy~

一、原理说明

如上图所示:

1. 当极狐 GitLab 有代码变更时(创建 MR),通过 webhook 发送事件消息到 ai-code-review App;

2. 当 ai-code-review App 收到消息后,发送 Review Reqeust 到 ChatGPT(调用 ChatGPT 的 API);

3. ChatGPT 将 Code Review 结果以 Review Response 形式返回;

4. ai-code-review 收到 Review Response 后,将内容(Review Comment)发送到极狐 GitLab 的 MR 中。

二、快速上手指南

1. ai-code-review 环境

即上图中紫色机器,需要满足基本条件:

  • 此机器能够访问 api.openai.com
  • 此机器与极狐 GitLab 机器之间网络互相可以访问,或者说彼此可以 ping 通。

1.1 Linux / MacOS / *Unix

Docker 安装

如已经安装 Docker 可忽略此章节。

安装脚本如下:

arduino 复制代码
curl -fsSL https://get.docker.com | bash -s docker

运行程序

使用如下命令。注意,需要修改其中 3 个 Token/License 参数为实际参数:

  • gitlab_private_token: GitLab Token,应具有 Merge Requst 写权限。在生成此 Token 时,建议勾选所有权限;

  • openai_api_key: 需在 OpenAI API Keys 自行申请;

  • acr_license: test 即可。

ini 复制代码
docker run -itd -p 8888:8888 --restart=always --name ai-code-review -e gitlab_private_token="<你的GitLab Token>" -e language="Chinese" -e openai_api_key="<你的OpenAI Token>" -e acr_license="test" \satomic/ai-code-review:20230321

2. 极狐 GitLab Webhook 配置

在极狐 GitLab 中,进行 AI code review 的 group 或 project 配置,以 project 为例,建议使用 group 级别的 webhook,这样 group 内的所有项目的 MR 都会被 AI 审查,无需为每个 project 重复配置,配置方式与 project 相同:

每次合并请求产生及变化时,都会看到发送记录 :

3. ChatGPT 评审效果

Review 效果如下,更多可访问 Public 演示仓库 AI 自动 MR 评审演示

三、定义自己的评审机器人

前文中的自动化评审机器人封装在 docker 镜像中🤖,其角色声明为:

json 复制代码
{    "role": "system",    "content": "你是是一位资深编程专家,负责代码变更的审查工作。需要给出审查建议。在建议的开始需明确对此代码变更给出「拒绝」或「接受」的决定,并且以格式「变更评分:实际的分数」给变更打分,分数区间为0~100分。然后,以精炼的语言、严厉的语气指出存在的问题。如果你觉得必要的情况下,可直接给出修改后的内容。建议中的语句可以使用emoji结尾。你的反馈内容必须使用严谨的markdown格式。"}

复制代码

所以机器人讲话很没有感情,如果想 "注入感情"🎨,则需要定义自己的评审机器人,比如希望是一个傲娇少女👧来评审,参考如下角色声明:

json 复制代码
{    "role": "system",    "content": "你是一个天才小女孩,精通编程工作,性格很傲娇又高傲,负责对前辈的代码变更进行审查,用后辈的态度、活泼轻快的方式的指出存在的问题。使用markdown格式。可以包含emoji。"}

复制代码

按照这样的角色声明,评审的效果是这样:

💁‍♀️下面,基于如下源码创造自己的傲娇评审少女吧~

创建 ai_code_review.py 文件,内容如下:

python 复制代码
# coding=utf-8
import gitlabimport openai
class AICodeReview():        def __init__(self,                 gitlab_private_token,                 project_id,                 merge_request_id,                 openai_api_key,                 gitlab_server_url='https://jihulab.com',                 ):        self.gl = gitlab.Gitlab(            gitlab_server_url,            private_token=gitlab_private_token,            timeout=300,            api_version='4'        )        print('初始化GitLab连接成功')                # project        self.project_id = project_id        self.project = self.gl.projects.get(project_id)        print('找到project')                # mr        self.merge_request_id = merge_request_id        self.merge_request = self.project.mergerequests.get(merge_request_id)        print('找到mr')                # changes        self.changes = self.merge_request.changes()                # openai        openai.api_key = openai_api_key                # comments        self.review_notes = []                # note        self.note = ''                    def ai_code_review(self):                print('开始code review')        for change in self.changes['changes']:            # https://platform.openai.com/docs/guides/chat/introduction            messages = [                {"role": "system",                 "content": "你是是一位资深编程专家,负责代码变更的审查工作。需要给出审查建议。在建议的开始需明确对此代码变更给出「拒绝」或「接受」的决定,并且以格式「变更评分:实际的分数」给变更打分,分数区间为0~100分。然后,以精炼的语言、严厉的语气指出存在的问题。如果你觉得必要的情况下,可直接给出修改后的内容。建议中的语句可以使用emoji结尾。你的反馈内容必须使用严谨的markdown格式。"                 },                {"role": "user",                 "content": f"请review这部分代码变更{change}",                 },            ]
            print('思考中...')            response = openai.ChatCompletion.create(                model="gpt-3.5-turbo",                messages=messages,            )            new_path = change['new_path']            print(f'对 {new_path} review中...')            response_content = response['choices'][0]['message']['content'].replace('\n\n', '\n')            total_tokens = response['usage']['total_tokens']
            review_note = f'# `{new_path}`' + '\n\n'            review_note += f'({total_tokens} tokens) {"AI review 意见如下:" }' + '\n\n'            review_note += response_content                        self.review_notes.append(review_note)
    def comment(self, notice=None):        if notice is None:            review_note = '\n\n---\n\n'.join(self.review_notes)            self.note = {'body': review_note}            self.merge_request.notes.create(self.note)            print('review内容', self.note)            print('review完成')        else:            self.note = {'body': notice}            self.merge_request.notes.create(self.note)            print(notice)

核心函数说明:

  • ai_code_review: 调用 openai.ChatCompletion.create() 方法基于预设 prompt 角色发起一次对话,得到评审结果。

  • comment: 调用 .merge_request.notes.create() 方法追加评审内容到 MR 中。

单次评审的使用方式如下,只要传递对应参数即可。实际使用中,可以在外层封装 HTTP Server,接收 MR 创建/更新的 Webhook 推送的 Json 对象,解析内容并自动进行 AICodeReview 对象的实例化及动作。

xml 复制代码
acr = AICodeReview(    gitlab_server_url=<你的GitLab地址>,    gitlab_private_token=<你的GitLab private_token>,    project_id=<project_id>,    merge_request_id=<merge_request_id>,    openai_api_key=<openai_api_key>,)acr.ai_code_review()acr.comment()

完成了上述内容,你就可以让 ChatGPT 自动来进行 MR 变更评审啦。

相关推荐
xiaoming001811 小时前
Django中使用流式响应,自己也能实现ChatGPT的效果
后端·python·chatgpt·django
企鹅侠客11 小时前
19|Whisper+ChatGPT:请AI代你听播客
人工智能·ai·chatgpt·whisper
量子位1 天前
Scaling Law 首次在自动驾驶赛道被验证!小鹏汽车 CVPR 演讲详解:AI「吃」下 6 亿秒视频后,智能涌现
chatgpt·ai编程
Jet45052 天前
玩转ChatGPT:DeepSeek实战(核酸蛋白序列核对)
人工智能·chatgpt·kimi·deepseek
—Qeyser3 天前
让 Deepseek 写电器电费计算器小程序
ai·chatgpt·小程序·deepseek
明明跟你说过3 天前
FastChat 架构拆解:打造类 ChatGPT 私有化部署解决方案的基石
人工智能·语言模型·chatgpt·openai
Gyoku Mint4 天前
机器学习×第七卷:正则化与过拟合——她开始学会收敛,不再贴得太满
人工智能·python·算法·chatgpt·线性回归·ai编程
总之就是非常可爱4 天前
打造一个支持流式输出的 Vue Markdown 渲染组件
前端·chatgpt·markdown
优弧6 天前
OpenAI o3-Pro震撼登场!性能暴涨价格暴跌,这波操作我服了
chatgpt·openai
人工智能教学实践6 天前
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
人工智能·chatgpt