武汉勇远科技
勇远科技微信二维码
微信咨询
扫一扫获取方案
24小时服务热线
177 6259 3139

研发提效:基于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 个人访问令牌

  1. 登录 GitLab,进入 User Settings -> Access Tokens
  2. 创建一个拥有 api 权限的 Token,记录为 GITLAB_API_TOKEN
  3. 在目标项目的 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.pyexecute(f"SELECT * FROM users WHERE id = {user_id}") 存在极高的 SQL 注入风险,请改用参数化查询 execute("SELECT...", (user_id,))
2. main.py 中的 file.open() 忘记调用 close(),或者建议使用 with open(...) 语法以防文件句柄泄漏。

通过引入这种极低成本的 API 脚本,企业不仅能大幅解放高级工程师的时间,更是在代码合入主干前,建立了一道永远不知疲倦、对低级错误零容忍的自动防御长城。