项目成果演示
[图片:代码审查结果示例]
基于 GitLab CI/CD 流水线与 DeepSeek 大语言模型实现自动化代码审查。通过配置 GitLab Runner 运行 Python 脚本,在合并请求触发时自动获取代码差异并调用 DeepSeek API 进行分析,最终将审查意见以评论形式发布回 MR 页面。该方案旨在降低人工审查成本,提升代码质量与团队效率,支持自定义 Prompt 以适应不同技术栈需求。

[图片:代码审查结果示例]
本方案旨在解决手动代码审查(Code Review)耗时耗力、标准不一的问题。通过利用 GitLab 自带的 CI/CD 功能,在开发者创建合并请求(Merge Request, MR)时自动触发一个流水线任务。该任务会提取 MR 中的代码变更,调用 DeepSeek API 模型进行分析,并将 AI 生成的审查意见以评论的形式自动发布回 MR 页面,从而为人工审查提供有价值的参考,提升代码质量和团队效率。
进入需要集成此功能的 GitLab 项目:
在项目代码库的根目录下,创建以下两个文件:
import os
import requests
import json
# --- 1. 从 CI/CD 环境变量中获取配置 ---
GITLAB_API_URL = os.environ.get("CI_API_V4_URL")
PROJECT_ID = os.environ.get("CI_PROJECT_ID")
MR_IID = os.environ.get("CI_MERGE_REQUEST_IID")
GITLAB_TOKEN = os.environ.get("GITLAB_ACCESS_TOKEN")
DEEPSEEK_API_KEY = os.environ.get("DEEPSEEK_API_KEY")
def check_env_vars():
"""检查所有必要的环境变量是否存在"""
if not all([GITLAB_API_URL, PROJECT_ID, MR_IID, GITLAB_TOKEN, DEEPSEEK_API_KEY]):
print("Error: Missing one or more required environment variables.")
exit(1)
# --- 2. 与 GitLab API 交互 (无变动) ---
def get_mr_changes():
url = f"{GITLAB_API_URL}/projects/{PROJECT_ID}/merge_requests/{MR_IID}/changes"
headers = {"PRIVATE-TOKEN": GITLAB_TOKEN}
try:
response = requests.get(url, headers=headers, timeout=20)
response.raise_for_status()
changes = response.json().get('changes', [])
return "\n".join([change['diff'] for change in changes])
except requests.exceptions.RequestException as e:
print(f"Error fetching MR changes from GitLab: {e}")
return None
def post_review_to_gitlab(comment):
url = f"{GITLAB_API_URL}/projects/{PROJECT_ID}/merge_requests/{MR_IID}/notes"
headers = {"PRIVATE-TOKEN": GITLAB_TOKEN}
body = f"🤖 **AI Code Review (DeepSeek)** 报告:\n\n---\n\n{comment}"
data = {"body": body}
try:
response = requests.post(url, headers=headers, data=data, timeout=20)
response.raise_for_status()
print("Successfully posted AI review comment to GitLab MR.")
except requests.exceptions.RequestException as e:
print(f"Error posting comment to GitLab: {e}")
# --- 3. 调用 DeepSeek API 进行审查 (核心替换部分) ---
def call_deepseek_api(code_diff):
"""调用 DeepSeek API 对代码 diff 进行审查"""
api_url = "https://api.deepseek.com/chat/completions"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {DEEPSEEK_API_KEY}"
}
# Prompt 保持不变,但可以针对 Coder 模型进行微调
prompt = f"""你是一名世界级的软件工程师和代码审查专家,对代码质量有近乎完美的苛刻要求。请严格、细致地审查以下代码变更(diff格式)。
你的任务是:
1. **识别潜在的 Bug**:比如空指针、逻辑错误、边界条件问题。
2. **发现性能问题**:比如不必要的循环、低效的算法。
3. **检查代码风格和可读性**:是否遵循通用编码规范,命名是否清晰,注释是否必要。
4. **识别安全漏洞**:比如 SQL 注入、跨站脚本等。
5. **提出具体的改进建议**:对于每一个发现的问题,请提供清晰的解释,并给出'修改前'和'修改后'的代码片段对比,以便开发者能直接采纳你的建议。
请以清晰的 Markdown 格式返回你的审查意见。如果发现多个问题,请用列表形式呈现。
如果代码质量很高,没有发现任何问题,请回复 "代码质量非常高,未发现明显问题。LGTM! 👍"。
以下是需要审查的代码变更:
```diff
{code_diff}
```"""
payload = {
"model": "deepseek-coder",
"messages": [{"role": "user", "content": prompt}],
"temperature": 0.1,
"max_tokens": 4096,
"stream": False
}
try:
response = requests.post(api_url, headers=headers, data=json.dumps(payload), timeout=60)
response.raise_for_status()
result = response.json()
review_content = result['choices'][0]['message']['content']
return review_content
except requests.exceptions.RequestException as e:
detailed_error_message = f"**错误:请求 DeepSeek API 失败。**\n\n**详情:**\n```\n{str(e)}\n```"
print(f"Error calling DeepSeek API: {e}")
return detailed_error_message
except (KeyError, IndexError) as e:
detailed_error_message = f"**错误:解析 DeepSeek API 响应失败。**\n\n**详情:**\n```\n{str(e)}\n```\n**原始响应:**\n```\n{response.text}\n```"
print(f"Error parsing DeepSeek response: {e}")
return detailed_error_message
# --- 4. 主执行逻辑 (调用新函数) ---
if __name__ == "__main__":
check_env_vars()
print("Starting AI Code Review process with DeepSeek...")
diff_content = get_mr_changes()
if not diff_content or not diff_content.strip():
print("No code changes found in this MR. Exiting.")
exit(0)
print("Fetching review from DeepSeek AI...")
review_result = call_deepseek_api(diff_content)
if review_result:
post_review_to_gitlab(review_result)
else:
post_review_to_gitlab("从 DeepSeek AI 未获取到有效的审查结果。")
exit(1)
stages:
- review
.python-base:
image: python:3.9-slim
before_script:
- pip install requests
ai_code_review:
extends: .python-base
stage: review
script:
- python ai_review.py
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
[图片:MR 评论示例]
可以点击 MR 页面的 "Pipelines" 标签页,查看 ai_code_review job 的运行状态和日志。
[图片:Pipeline 日志示例]
创建 MR 后,GitLab 会自动启动一个新的流水线。
[图片:流水线触发示例]
ai_review.py 脚本中的 prompt 是整个系统的核心。可以根据团队的技术栈(如 Java, Go, Frontend)和编码规范,对 Prompt 进行深度定制,以获得更精准的审查结果。
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online