PR提交自动触发AI审查,结果贴到评论区:我的代码审查流水线搭建实录

我们团队只有两个人,每周大约合入 15-20 个 PR。之前全靠人工审查,一个 300 行的 PR 至少花 15 分钟。后来我在 GitHub Actions 里接入了 AI 自动审查——PR 提交后自动触发,审查结果直接贴到 PR 评论区,人工只需要确认 AI 的发现。跑了两周之后,人工审查时间从每 PR 15 分钟降到了 5 分钟。这篇文章是完整的搭建过程,所有配置可以直接复制使用。
整体架构
流水线很简单,四步走:
PR 提交 → GitHub Actions 触发 → Python 脚本调用 AI 审查代码 diff → 结果通过 GitHub API 贴到 PR 评论区
需要的材料:一个 GitHub 仓库、一个 API 令牌(用来调大模型)、一段 Python 脚本、一个 Actions 配置文件。
第一步:准备 API 访问
AI 审查脚本需要能调用大模型 API。我用的是 Claude 4.7,因为它在代码审查上的表现比 GPT-5.5 更稳定,误报率更低。
API Key 从聚合平台获取——注册后在令牌管理里创建一个专用令牌,只勾选 Claude 4.7 的权限,取名为 ci-review。然后把 Key 存到 GitHub 仓库的 Secrets 里,不要在配置文件里硬编码。
# 在 GitHub 仓库 Settings → Secrets and variables → Actions 中添加: # 名称: API_KEY # 值: 你的ci-review令牌 # 名称: API_BASE_URL # 值: https://api.bblabu.cn/v1
第二步:写审查脚本
核心逻辑:用 git 拿到 PR 的 diff → 加上审查 prompt → 发给 Claude 4.7 → 把返回结果格式化。
# review.py
import os, sys, json
from openai import OpenAI
REVIEW_PROMPT = """审查以下代码变更,按此格式输出:
### 🔴 严重问题
- [文件名:行号] 问题描述 + 修复建议
### 🟡 建议改进
- [文件名:行号] 建议描述
### 🟢 正面发现
- 值得肯定的代码写法
只报告真实问题,不确定的不要报。"""
def review_diff(diff_text):
client = OpenAI(
api_key=os.environ["API_KEY"],
base_url=os.environ["API_BASE_URL"]
)
resp = client.chat.completions.create(
model="claude-4.7",
messages=[
{"role": "system", "content": "你是资深代码审查者"},
{"role": "user", "content": f"{REVIEW_PROMPT}\n\n{diff_text}"}
],
max_tokens=2000,
temperature=0.3 # 低温度保证审查一致性
)
return resp.choices[0].message.content
if __name__ == "__main__":
# 从标准输入读取 diff
diff = sys.stdin.read()
if len(diff) > 50000:
print("⚠️ diff 过大,只审查前 50000 字符")
diff = diff[:50000]
result = review_diff(diff)
print(result)
第三步:配置 GitHub Actions
在项目根目录创建 .github/workflows/ai-review.yml:
name: AI Code Review
on:
pull_request:
types: [opened, synchronize]
jobs:
review:
runs-on: ubuntu-latest
permissions:
pull-requests: write
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # 获取完整历史以计算 diff
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: pip install openai
- name: Get PR diff
run: |
git diff origin/${{ github.base_ref }}...HEAD > pr.diff
- name: Run AI review
id: review
env:
API_KEY: ${{ secrets.API_KEY }}
API_BASE_URL: ${{ secrets.API_BASE_URL }}
run: |
python .github/scripts/review.py < pr.diff > review.md
- name: Post review comment
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const review = fs.readFileSync('review.md', 'utf8');
const body = '## 🤖 AI 代码审查\n\n' + review +
'\n\n---\n*自动审查仅供参考,请人工确认所有发现*';
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: body
});
第四步:跑起来看看效果
配置完成后,随便提一个 PR 测试。推送代码后,GitHub Actions 自动运行审查脚本,大概 30-60 秒后 PR 评论区就会出现 AI 的审查结果。
两周跑下来,统计了 32 个 PR 的审查数据:
| 指标 | 数据 |
|---|---|
| 审查 PR 数 | 32 个 |
| AI 发现问题(经人工确认) | 28 个 |
| 严重问题 | 5 个(并发安全 2 个、SQL 注入 1 个、逻辑错误 2 个) |
| 误报数 | 6 个(误报率 ~18%) |
| 人工审查时间 | 从每 PR 15 分钟降到 5 分钟 |
| 总费用(32 个 PR) | 约 ¥1.2(聚合平台定价) |
32 个 PR 的 AI 审查总共花了不到一块五。如果走官网直连,同样用量(约 48 万 Token,Claude 4.7 输出单价 $75/百万Token)大约要 ¥260。差价来自 API 额度的获取渠道——聚合平台以批发价采购额度再分销,Token 单价只有官网的几十分之一。
几个踩坑经验
坑一:diff 太大导致超时。第一次跑的时候有一个 2000 行的 PR 重构,diff 文本接近 8 万字符,发给 Claude 后等了快两分钟然后超时了。解决方案是加了 diff 大小限制,超过 5 万字符自动截断。大 PR 建议拆成小 PR 提交,审查质量也会更高。
坑二:Actions 的 Secrets 变量名。GitHub Actions 的 Secrets 不能以 GITHUB_ 开头,也不能包含特殊字符。我当时把变量名设为 GITHUB_API_KEY,被 Actions 静默拦截了,脚本拿到的值是空的。排查了半小时才发现。
坑三:审查 prompt 不要写太长。最开始我把公司的编码规范(2000 多字)也塞进了系统 prompt,导致每次审查的输入 Token 翻倍。后来把规范精简到 500 字以内,审查质量没降,但每次审查的费用降了一半。
总结
整个搭建过程不到一小时——写一个 Python 脚本 + 一个 Actions 配置文件,剩下的 GitHub 和 API 平台都帮你做了。跑起来之后的效果超出了我的预期:5 个严重问题在合入之前被发现,避免了至少两次可能的生产事故。
这套流水线的代码都是标准的,换个项目只需要改一下审查脚本里的 prompt。如果你也想试试,建议先在一个非关键仓库跑一周,根据误报率调整 prompt,稳定了再推广到全部项目。
相关资源:
- bblabu API 平台 — 注册送体验额度,支持 Claude 4.7
- GitHub Actions 官方文档
测试环境:GitHub Actions ubuntu-latest,Claude 4.7,2026年5月。审查效果因项目类型和代码规范而异。
本文链接:https://www.kkkliao.cn/?id=REPLACE_ID 转载需授权!
本文链接:https://www.kkkliao.cn/?id=4011 转载需授权!
版权声明:本文由廖万里的博客发布,如需转载请注明出处。



手机流量卡
免费领卡·号卡店铺
关于本站
