当前位置: 首页 > news >正文

构建自动化代码审查机器人:Cursor + Claude API + GitHub App 实战

代码审查是团队协作中最耗时但又必不可少的环节。本文带你从零搭建一个自动化代码审查机器人,当 PR 创建或更新时,自动调用 Claude 3.7 分析代码变更,输出可操作的改进建议,并将结果作为评论发布到 PR 中。全程使用 Cursor 协助开发,最终部署到云服务器或 Vercel。

1. 系统架构

GitHub PR 事件 → Webhook → 后端服务(FastAPI) → Claude API → 格式化评论 → GitHub API 发布评论

组件说明

  • GitHub App:接收 PR 事件并生成 Webhook
  • 后端服务:FastAPI + Uvicorn,处理 Webhook 并调用 Claude
  • Claude API:分析 diff 并生成审查意见
  • 部署:可选用 Railway / Fly.io / 自建服务器

2. 准备工作

2.1 获取 Claude API Key

官方申请需要境外支付方式。若困难,可使用已验证的 API Key(笔者来源见文末)。

2.2 注册 GitHub App

  1. 访问 GitHub Settings → Developer settings → GitHub Apps → New GitHub App
  2. 设置以下参数:
    • Webhook URLhttps://your-domain.com/webhook(部署后填写)
    • Permissions:Pull requests: Read & write
    • Events:Pull request (勾选)
  3. 生成Private Key并下载
  4. 记录App IDClient ID

2.3 安装依赖

pipinstallfastapi uvicorn httpx PyGithub python-dotenv

3. 核心代码实现

3.1 项目结构

code-review-bot/ ├── main.py # FastAPI 入口 ├── github_handler.py # 处理 Webhook 和 API 调用 ├── claude_review.py # Claude 审查逻辑 ├── config.py # 环境变量配置 ├── requirements.txt └── Dockerfile

3.2 配置管理(config.py

importosfromdotenvimportload_dotenv load_dotenv()CLAUDE_API_KEY=os.getenv("CLAUDE_API_KEY")GITHUB_APP_ID=os.getenv("GITHUB_APP_ID")GITHUB_PRIVATE_KEY=os.getenv("GITHUB_PRIVATE_KEY").replace("\\n","\n")WEBHOOK_SECRET=os.getenv("WEBHOOK_SECRET")

3.3 Claude 审查逻辑(claude_review.py

importanthropic client=anthropic.Anthropic(api_key=CLAUDE_API_KEY)defreview_diff(diff_text:str)->str:"""调用 Claude 分析代码变更,返回审查建议"""prompt=f"""请对以下 GitHub PR 代码变更进行审查,输出内容要求:1.严重问题(安全漏洞、逻辑错误、性能瓶颈)2.代码规范问题(命名、格式、重复代码)3.可维护性建议(注释、模块拆分)4.对于每个问题,请给出具体位置(文件名+行号,如果有)和修复建议。 请使用 Markdown 格式,简明扼要。 变更内容(diff):

{diff_text}

""" response = client.messages.create( model="claude-3-7-sonnet-20250219", max_tokens=2000, messages=[{"role": "user", "content": prompt}] ) return response.content[0].text

3.4 GitHub 事件处理(github_handler.py

importhmacimporthashlibfromfastapiimportHTTPException,RequestfromgithubimportGithubIntegrationfromclaude_reviewimportreview_diffdefverify_signature(payload:bytes,signature:str,secret:str)->bool:mac=hmac.new(secret.encode(),msg=payload,digestmod=hashlib.sha256)returnhmac.compare_digest(f"sha256={mac.hexdigest()}",signature)asyncdefhandle_pr_event(request:Request):# 验证 webhook 签名body=awaitrequest.body()signature=request.headers.get("X-Hub-Signature-256")ifnotverify_signature(body,signature,WEBHOOK_SECRET):raiseHTTPException(401,"Invalid signature")event=request.headers.get("X-GitHub-Event")ifevent!="pull_request":return{"msg":"ignored"}payload=awaitrequest.json()action=payload.get("action")ifactionnotin["opened","synchronize"]:return{"msg":"only review opened/synchronized PRs"}pr=payload["pull_request"]repo_full_name=payload["repository"]["full_name"]pr_number=pr["number"]pr_diff_url=pr["diff_url"]# 获取 diff 内容asyncwithhttpx.AsyncClient()asclient:diff_resp=awaitclient.get(pr_diff_url)diff_text=diff_resp.text# 调用 Claude 审查review_comment=review_diff(diff_text)# 使用 GitHub App 认证发表评论installation_id=payload["installation"]["id"]integration=GithubIntegration(GITHUB_APP_ID,GITHUB_PRIVATE_KEY,)access_token=integration.get_access_token(installation_id).token# 使用 PyGithub 添加评论g=Github(login_or_token=access_token)repo=g.get_repo(repo_full_name)pr_obj=repo.get_pull(pr_number)pr_obj.create_comment(review_comment)return{"msg":"review posted"}

3.5 FastAPI 入口(main.py

fromfastapiimportFastAPI,Requestfromgithub_handlerimporthandle_pr_event app=FastAPI()@app.post("/webhook")asyncdefwebhook(request:Request):returnawaithandle_pr_event(request)@app.get("/health")asyncdefhealth():return{"status":"ok"}

3.6 部署配置文件

Dockerfile

FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

requirements.txt

fastapi==0.115.0 uvicorn==0.30.0 httpx==0.27.0 PyGithub==2.3.0 anthropic==0.40.0 python-dotenv==1.0.0

4. 使用 Cursor 加速开发

你可以在 Cursor 中用 Agent 模式快速生成上述代码。只需提供需求描述:

请帮我用 FastAPI 创建一个 GitHub App 的 webhook 处理函数: - 接收 pull_request 事件 - 获取 PR 的 diff URL - 调用 Claude API(使用 anthropic 库)审查代码 - 用 GitHub App 认证将审查结果评论回 PR

Cursor Agent 会自动生成完整代码,并处理好异常、日志等细节。

5. 本地测试

5.1 使用 smee.io 转发 Webhook

npx smee-uhttps://smee.io/your-channel-thttp://localhost:8000/webhook

5.2 启动服务

uvicorn main:app--reload

5.3 触发测试 PR

创建一个测试仓库,发起 PR,观察是否有评论返回。

6. 部署到生产环境

6.1 使用 Railway

railway login railway init railway up

设置环境变量:CLAUDE_API_KEY,GITHUB_APP_ID,GITHUB_PRIVATE_KEY,WEBHOOK_SECRET

6.2 或使用 Fly.io

flyctl launch flyctl secretssetCLAUDE_API_KEY=xxx flyctl deploy

6.3 更新 GitHub App Webhook URL

部署后获取你的域名(如https://your-app.fly.dev/webhook),填入 GitHub App 设置中。

7. 进阶功能

  • 增量审查:只审查新增的 diff,避免重复评论
  • 自定义规则:在 prompt 中加入团队代码规范(如禁用print,要求类型注解)
  • 评论更新:当 PR 更新时,删除旧的审查评论并发布新版本
  • 支持更多语言:Claude 原生支持多种语言,无需修改
  • 结果缓存:对相同 diff 的审查结果缓存 10 分钟,避免重复调用 API

8. 性能与成本

PR 大小diff 行数token 消耗耗时成本
小型(5 文件,100 行)~50040005s$0.02
中型(10 文件,500 行)~25001200012s$0.06
大型(20 文件,2000 行)~100003500030s$0.18

对于每月 100 个 PR 的团队,成本约 $6-18,远低于人工审查的时间成本。

9. 常见问题

问题解决方法
Webhook 验证失败检查签名算法是否为 sha256,确保 secret 一致
Claude API 超时增加 timeout,或改用异步后台任务
评论内容过长被截断拆分多条评论,或只输出关键问题
GitHub App 认证失败检查 private key 格式(需保留换行符)

10. 总结

通过本方案,你可以:

  • ✅ 自动化 PR 代码审查,降低人工负担
  • ✅ 保证审查标准一致性
  • ✅ 集成到现有 GitHub 工作流
  • ✅ 使用 Cursor 快速迭代开发

未来可扩展为支持 GitLab、Bitbucket 等平台,或增加自定义规则引擎。

11. 参考来源

文中使用的 Claude API Key 来自gpt108.com(该渠道提供 ChatGPT Plus、Claude Pro、Gemini Advanced、Cursor Pro 等账号及 API 充值)。笔者团队生产环境已稳定使用 3 个月,仅作技术方案记录。

http://www.jsqmd.com/news/844960/

相关文章:

  • 从安装到实战:手把手教你用nvm-windows搞定Node.js 18和21双版本共存(含常见报错解决方案)
  • 2026最新 湖州市黄金回收白银回收铂金回收店铺实力排行榜TOP5;五家靠谱回收门店联系方式推荐_转自TXT - 盛世金银回收
  • ExtractorSharp终极指南:3步解决游戏资源编辑难题
  • Sunshine游戏串流实战手册:构建你的跨平台游戏共享生态系统
  • 2026最新 亳州市黄金回收白银回收铂金回收店铺实力排行榜TOP5;五家靠谱回收门店联系方式推荐_转自TXT - 盛世金银回收
  • Zotero Style:当文献管理遇见视觉叙事,你的科研工作流将如何被重新定义?
  • 3分钟极速解锁B站缓存视频:m4s-converter完整使用指南
  • VPU与NPU协同优化:边缘AI视觉处理的算力融合实践
  • 打造你的专属音乐伴侣:LyricsX桌面歌词插件全攻略
  • CVE-2026-42897深度解析:Exchange零日XSS武器化全链条与企业防御实战指南
  • 2026最新 怀化市黄金回收白银回收铂金回收店铺实力排行榜TOP5;五家靠谱回收门店联系方式推荐_转自TXT - 盛世金银回收
  • 2026最新 沧州市黄金回收白银回收铂金回收店铺实力排行榜TOP5;五家靠谱回收门店联系方式推荐_转自TXT - 盛世金银回收
  • 2026最新 龙岩市黄金回收白银回收铂金回收店铺实力排行榜TOP5;五家靠谱回收门店联系方式推荐_转自TXT - 盛世金银回收
  • 2026最新 淮安市黄金回收白银回收铂金回收店铺实力排行榜TOP5;五家靠谱回收门店联系方式推荐_转自TXT - 盛世金银回收
  • QMC音频解密技术深度解析:算法实现与性能优化
  • 3步精通TlbbGmTool:天龙八部单机版游戏数据管理终极解决方案
  • 26-cv-4120 Joel Sartore 摄影图版权,300+店涉案冻结!若有资金冻结,请尽快联系我们专业谈判解冻!
  • 御坂翻译器:3分钟开启你的日语游戏无障碍之旅
  • 别再手动复制了!用Python+Wind API批量下载股票、期货、债券代码的完整脚本
  • 2026最新 常德市黄金回收白银回收铂金回收店铺实力排行榜TOP5;五家靠谱回收门店联系方式推荐_转自TXT - 盛世金银回收
  • 2026最新 常州市黄金回收白银回收铂金回收店铺实力排行榜TOP5;五家靠谱回收门店联系方式推荐_转自TXT - 盛世金银回收
  • 2026最新 陇南市黄金回收白银回收铂金回收店铺实力排行榜TOP5;五家靠谱回收门店联系方式推荐_转自TXT - 盛世金银回收
  • 别再只会用BurpSuite了!手把手教你用ZAP(Zed Attack Proxy)给Web应用做免费安全体检
  • 从“消融”到“流动岩浆”:用Unity Shader的Tilling和Offset玩转动态纹理(URP/HDRP通用)
  • Pearcleaner:macOS应用彻底清理的终极免费解决方案
  • 3步重塑你的数字资产管理体系:DownKyi开源工具完全指南
  • 2026最新 淮北市黄金回收白银回收铂金回收店铺实力排行榜TOP5;五家靠谱回收门店联系方式推荐_转自TXT - 盛世金银回收
  • Windows 11系统优化神器:Win11Debloat一站式去广告与性能提升指南
  • 逻辑分析仪实战:HAL库SPI时序分析与陀螺仪ID读取优化
  • 如何免费绕过iPhone激活锁:applera1n图形化工具终极指南