研发提效:基于GitLab CI与大模型API的自动化Code Review实战
1. 背景与企业痛点
在敏捷开发流程中,Code Review (代码审查) 是保证代码质量的核心环节。然而,在中小型研发团队中,往往面临以下痛点:
1. 人工 Review 极其耗时:高级工程师每天被海量的 Merge Request (MR) 淹没,严重影响自身的业务开发。
2. Review 流于形式:为了赶进度,很多 Review 变成了单纯的“LGTM (Looks Good To Me)”,导致明显的逻辑错误、SQL 注入、内存泄漏被带入生产环境。
本文将演示如何利用极少量的 Python 脚本,结合 GitLab CI/CD Pipeline,在每次开发提交 MR 时,自动拉取代码 diff,并调用大语言模型(如 ChatGPT / 本地 Qwen2)的 API,实现毫秒级的自动代码审查并在 MR 下方自动发表评论。
2. 架构设计与前期准备
- GitLab CI/CD: 利用 GitLab Runner 执行审查脚本。
- Python 脚本: 调用 GitLab API 获取当前 MR 的 Diff 文本,组装 Prompt 发送给大模型。
- 大模型 API: 任何兼容 OpenAI 格式的 API 接口(如私有部署的 vLLM/Ollama,或者第三方的 DeepSeek/百川 API)。
2.1 获取 GitLab 个人访问令牌
- 登录 GitLab,进入
User Settings->Access Tokens。 - 创建一个拥有
api权限的 Token,记录为GITLAB_API_TOKEN。 - 在目标项目的
Settings->CI/CD->Variables中,将此 Token 以及大模型 API Key 存入环境变量。
3. 编写核心 Python 审查脚本
在项目根目录下创建一个 .gitlab/scripts/llm_reviewer.py 文件:
#!/usr/bin/env python3
import os
import requests
import json
GITLAB_URL = os.environ.get("CI_SERVER_URL")
PROJECT_ID = os.environ.get("CI_PROJECT_ID")
MR_IID = os.environ.get("CI_MERGE_REQUEST_IID")
GITLAB_TOKEN = os.environ.get("GITLAB_API_TOKEN")
LLM_API_URL = "https://api.deepseek.com/v1/chat/completions" # 兼容OpenAI格式
LLM_API_KEY = os.environ.get("LLM_API_KEY")
def get_mr_diff():
url = f"{GITLAB_URL}/api/v4/projects/{PROJECT_ID}/merge_requests/{MR_IID}/changes"
headers = {"PRIVATE-TOKEN": GITLAB_TOKEN}
res = requests.get(url, headers=headers).json()
diffs = []
for change in res.get('changes', []):
diffs.append(f"File: {change['new_path']}nDiff:n{change['diff']}")
return "nn".join(diffs)
def ask_llm_for_review(diff_text):
prompt = f"""你是一个资深的主任工程师,请审查以下代码的 Diff 变更。
请重点检查:1. 潜在的空指针异常;2. 数据库SQL注入风险;3. 内存泄漏风险;4. 变量命名是否符合 PEP8 规范。
如果没发现重大问题,请回复"✅ AI 审查通过"。否则请用 Markdown 格式列出优化建议。
n代码 Diff:n{diff_text[:3000]}""" # 限制长度避免Token超限
headers = {
"Authorization": f"Bearer {LLM_API_KEY}",
"Content-Type": "application/json"
}
payload = {
"model": "deepseek-coder",
"messages": [{"role": "user", "content": prompt}],
"temperature": 0.2
}
res = requests.post(LLM_API_URL, headers=headers, json=payload).json()
return res['choices'][0]['message']['content']
def post_comment_to_mr(comment):
url = f"{GITLAB_URL}/api/v4/projects/{PROJECT_ID}/merge_requests/{MR_IID}/notes"
headers = {"PRIVATE-TOKEN": GITLAB_TOKEN}
requests.post(url, headers=headers, data={"body": f"🤖 **AI 自动代码审查报告**nn{comment}"})
if __name__ == "__main__":
if not MR_IID:
print("Not a Merge Request. Skipping.")
exit(0)
diff = get_mr_diff()
if diff:
review_result = ask_llm_for_review(diff)
post_comment_to_mr(review_result)
4. 编写 GitLab CI 管道配置
在项目根目录编辑 .gitlab-ci.yml,使得每次创建或更新 Merge Request 时自动触发审查:
stages:
- test
- review
ai_code_review:
stage: review
image: python:3.9-slim
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
before_script:
- pip install requests
script:
- python .gitlab/scripts/llm_reviewer.py
5. 效果演示与总结
提交 MR 后,只需等待几秒钟,CI 流水线就会跑完。随后,大模型化身“资深老兵”,会自动在 MR 的讨论区发表评论:
🤖 AI 自动代码审查报告
⚠️ 发现潜在问题:
1.src/db.py中execute(f"SELECT * FROM users WHERE id = {user_id}")存在极高的 SQL 注入风险,请改用参数化查询execute("SELECT...", (user_id,))。
2.main.py中的file.open()忘记调用close(),或者建议使用with open(...)语法以防文件句柄泄漏。
通过引入这种极低成本的 API 脚本,企业不仅能大幅解放高级工程师的时间,更是在代码合入主干前,建立了一道永远不知疲倦、对低级错误零容忍的自动防御长城。