
一只用 AI Agent 搭副业产线的程序员痛点我们团队 3 个项目、6 个仓库、前后端各一人。按理说每周应该做代码审查但现实是没人做。活都干不完谁有空看别人的代码做了也流于形式。随便扫两眼“看起来没问题”完事。问题照出。低级命名、重复代码、潜在 Bug事后才发现。说白了代码审查重要性都知道但执行力几乎为零。那能不能让 AI 来做每天自动采集代码提交AI 审查质量报告推送到钉钉群。团队不用花时间但问题有人盯着。这就是code-review-agent。架构四步走CNB API → Git Show → DeepSeek AI → 钉钉推送 采集提交 获取Diff AI审查代码 周报直达群Step 1从代码仓库拉取本周所有 commit 记录Step 2用 Git 获取每个 commit 的代码差异Step 3把代码差异丢给 AI让它审查代码质量Step 4汇总成周报推送到钉钉群关键差异周报只需要 commit message代码审查需要看真正的代码变更。Step 1数据采集——项目映射CNB 的仓库路径是team/project/task-api但报告里应该写任务管理系统·后端。所以需要映射typeProjectConfigstruct{NamestringBackend RepoInfo// 仓库名 负责人Frontend RepoInfo}配置在.env里CNB_REPOSorg/repo1,org/repo2 PROJECTS_JSON{name:任务管理系统,backend:{repo:task-api,dev:后端A},frontend:{repo:task-web,dev:前端A}} PROJECTS_JSON{name:文档协作平台,backend:{repo:doc-api,dev:后端B},frontend:{repo:doc-web,dev:前端A}}采集时把仓库名映射到项目和负责人后面的报告才能按项目分组、按负责人 提醒。Step 2获取代码差异——踩坑最多的环节最初方案CNB Diff API❌ 404url:fmt.Sprintf(https://api.cnb.cool/%s/commit/%s/diff,repo,sha)// 全部 404这个 API 对第三方未开放最终方案Git Clone Git Show✅funcFetchDiff(cfg*entities.Config,repo,shastring)(string,error){repoDir:filepath.Join(os.TempDir(),code-review-repo)// 首次克隆仓库if_,err:os.Stat(repoDir);os.IsNotExist(err){repoURL:fmt.Sprintf(https://cnb.cool/%s.git,repo)ifcfg.GitUsername!{repoURLfmt.Sprintf(https://%s:%scnb.cool/%s.git,cfg.GitUsername,cfg.GitPassword,repo)}exec.Command(git,clone,--depth200,repoURL,repoDir).Run()}else{// 后续只 fetch 更新exec.Command(git,-C,repoDir,fetch,--all).Run()}// 获取指定 commit 的 diffoutput,_:exec.Command(git,-C,repoDir,show,--no-color,sha).CombinedOutput()returnstring(output),nil}关键点--depth200浅克隆只拉最近 200 个 commit--no-color去掉 ANSI 颜色码纯文本更利于 AI 解析缓存机制仓库只克隆一次后续只 fetch 更新源码过滤只审查有意义的代码一个 commit 的 diff 里可能有package-lock.json、.env、二进制文件。这些丢给 AI 是浪费 TokensourceExts:map[string]bool{.go:true,.py:true,.js:true,.ts:true,.vue:true,.java:true,.css:true,.scss:true,}funcFilterSourceCode(diffstring)string{// 只保留源码文件的 diff 行// 2000 行 diff 可能只剩 500 行Token 消耗降 75%}Step 3AI 代码审查——Prompt 是灵魂逐个审查每个 commit 过一遍 AIfuncReviewDiff(cfg*entities.Config,diffBlockstring,commitInfostring)(string,error){systemPrompt:你是代码审查助手。只输出有问题的代码格式必须适合手机阅读。 【输出格式 - 严格遵循】 # 代码审查报告 ## 概览 审查 X 个提交 | 质量评分 X/5 --- ## ⚠️ 发现的问题 ### 问题1问题标题 **责任人后端A** **❌ 修改前** 语言 // 有问题的代码 **✅ 修改后** 语言 // 改进后的代码 **原因** 简要说明问题 --- 【强制规则】 - ❌ 禁止使用 Markdown 表格 - ✅ 每个问题必须有代码对比 - ✅ 每个问题必须标注责任人 - ✅ 只输出有问题的地方 - ✅ 移动端友好reqBody:ChatRequest{Model:cfg.DeepSeekModel,Messages:[]ChatMessage{{Role:system,Content:systemPrompt},{Role:user,Content:Commit: commitInfo\n\nDiff:\ndiff\ndiffBlock\n},},}// 调用 DeepSeek API ...}移动端友好的输出格式这是迭代后的版本解决了原版的问题❌ 去掉 Markdown 表格移动端显示乱✅ 每个问题包含「修改前 vs 修改后」代码对比✅ 每个问题标注责任人✅ 只输出有问题的部分正确的不写✅ 用---分隔问题适合聊天记录滚动查看Prompt 设计的 5 条铁律1. 格式必须写死不加格式约束AI 输出千奇百怪。在 Prompt 里把完整模板写出来输出立刻可控。2. 每个问题必须修改前 vs 修改后如果 AI 只说变量命名不规范读者还得猜怎么改。要求给出代码对比可操作性翻倍。3. 负责人审查报告的价值在于可执行。“有个变量命名不好不如”后端A第 42 行变量名建议改为 userList。4. 只关注代码质量不关注业务逻辑AI 看不懂你的业务。让它审查命名、结构、可读性、重复代码、潜在 Bug。这些是 AI 真正擅长的。5. 合并共性问题34 个 commit 逐个审查可能有 10 个都犯了变量名缩写过度。汇总时让 AI 合并同类项报告才不会又臭又长。汇总审查把多份审查合并成一份周报funcGenerateSummary(cfg*entities.Config,reviews[]string,commits[]entities.Commit)(string,error){// 构建项目统计信息projectInfo:buildProjectStats(commits)// 把所有审查结果拼接combinedReview:strings.Join(reviews,\n\n---\n\n)// 丢给 AI 生成最终周报格式同上// ...}最终输出一份按项目分组的审查周报钉钉群里直接渲染 Markdown。Step 4钉钉推送上次用企业微信这次团队用钉钉。逻辑完全一样换了个 Webhook 格式funcSendMarkdown(webhook,title,markdownstring)error{msg:DingTalkMarkdownMsg{MsgType:markdown}msg.Markdown.Titletitle msg.Markdown.Textmarkdown jsonBody,_:json.Marshal(msg)resp,_:http.Post(webhook,application/json,bytes.NewReader(jsonBody))returnnil} 想用飞书、企业微信、Slack只需要改这一个函数其他代码不用动。项目结构code-review-agent/ ├── main.go # 入口 调度 ├── entities/ # 数据结构 ├── config/ # 配置加载 ├── cnb/ # CNB API 采集 源码过滤 ├── git/ # Git clone/show 操作 ├── review/ # DeepSeek AI 审查 汇总 ├── dingtalk/ # 钉钉推送 ├── go.mod ├── .env.example └── README.md拆分的理由很实际main.go超过 600 行后改一个地方要上下翻好久。拆成 6 个包后改 Git 逻辑只看git/git.go改审查 Prompt 只看review/review.go。定时执行funcmain(){config.LoadDotEnv()cfg:config.Load()// 启动时立即执行一次runCodeReview(cfg)// 注册定时任务每周三 23:11ifcfg.CronSpec!{c:cron.New()c.AddFunc(cfg.CronSpec,func(){cfg.DateFromtime.Now().AddDate(0,0,-7).Format(2006-01-02)cfg.DateTotime.Now().Format(2006-01-02)runCodeReview(cfg)})c.Start()select{}}}⚠️ Cron 表达式的坑robfig/cron/v3的格式是分 时 日 月 周我想设每周三 23:00一开始写了0 3 23 * * 3以为是从左到右递增。结果被解析成每月 23 号周三凌晨 3 点。正确写法0 23 * * 3实际效果34 个 commit 逐个审查大约15 分钟。其中 AI 调用是主要耗时每个 commit 约 8-15 秒。钉钉群里收到的报告格式# 代码质量周报 ## 概览 审查 8 个提交 | 质量评分 3/5 --- ## ⚠️ 问题清单 ### 问题1死代码未删除 **责任人后端A** **❌ 修改前** html !-- button classsubmit报送/button --✅ 修改后(直接删除整行)原因应删除而非注释Git 已有历史记录 改进建议清理注释残留代码 后端A提取硬编码数值为常量 前端A可以看到 - ✅ 适合手机滚动查看 - ✅ 每个问题有代码对比 - ✅ 了具体负责人 - ✅ 共性问题已合并 --- ## 和周报 Agent 的对比 两个 Agent 架构相似但重点不同 - **周报 Agent**输入 commit messageAI 做文案整理输出给人看做了什么 - **代码审查 Agent**输入 commit message 代码 DiffAI 做代码审查指出代码问题 代码审查 Agent 新增了 3 个关键能力 1. **项目映射**仓库名 → 项目名 负责人报告才有归属 2. **源码过滤**只审查 .go .vue .ts 等源码文件跳过配置和锁文件 3. **汇总报告**多份逐个审查 → 1 份按项目分组的周报 --- ## 部署指南 ### 前置准备 1. DeepSeek API Key注册就送额度审查一次约 0.1 元 2. CNB Token或其他代码平台 Token 3. 钉钉群机器人 Webhook 4. 服务器上安装 Git ### 部署步骤 bash # 克隆项目 git clone https://github.com/lobster-bujiaban/code-review-agent.git cd code-review-agent # 配置 cp .env.example .env # 编辑 .env填入 API Key、仓库列表、项目映射、Webhook # 编译 go build -o code-review-agent . # 测试运行 ./code-review-agent.env 配置示例DEEPSEEK_API_KEYsk-xxxxx CNB_TOKENyour-token CNB_REPOSorg/project-a/backend,org/project-a/frontend # 项目配置每个项目一行 PROJECTS_JSON{name:项目A,backend:{repo:backend,dev:后端A},frontend:{repo:frontend,dev:前端A}} DINGTALK_WEBHOOKhttps://oapi.dingtalk.com/robot/send?access_tokenxxx # 留空自动最近7天或指定日期 DATE_FROMauto DATE_TOauto # 每周三 23:00 CRON_SPEC0 23 * * 3systemd 部署[Unit] DescriptionCode Review Agent Afternetwork.target [Service] Typesimple WorkingDirectory/opt/code-review-agent ExecStart/opt/code-review-agent/code-review-agent Restarton-failure RestartSec10 [Install] WantedBymulti-user.target# 部署sudocpcode-review-agent /opt/code-review-agent/sudocp.env /opt/code-review-agent/# 启动sudosystemctl daemon-reloadsudosystemctlenablecode-review-agentsudosystemctl start code-review-agent# 查看日志sudojournalctl-ucode-review-agent-f交叉编译推荐无需在服务器装 Go# Mac/LinuxGOOSlinuxGOARCHamd64 go build-ocode-review-agent-linux# Windows PowerShell$env:GOOSlinux;$env:GOARCHamd64;go build-ocode-review-agent-linux改造成你自己的换代码平台→ 改cnb/cnb.go换 AI 模型→ 改review/review.go的 API 地址换推送渠道→ 改dingtalk/dingtalk.go加审查维度→ 改review/review.go的 Prompt调审查频率→ 改.env的CRON_SPEC踩过的坑坑 1CNB Diff API 404API 文档里有 diff 端点但第三方调用全部 404。浪费了 2 小时尝试各种参数。解法降级到git clonegit show。多一步 Git 操作但 100% 可靠。教训别信文档先curl验证 API 可用性再写代码。坑 2Cron 表达式字段顺序搞反0 3 23 * * 3→ 我以为是秒 分 时 日 月 周实际是分 时 日 月 周。解法改成0 23 * * 3。坑 3AI 输出格式不可控第一版 Prompt 只有你是代码审查员AI 输出五花八门。解法在 Prompt 里写死完整的 Markdown 模板。教训Prompt 不是聊天是编程。你不说清楚格式AI 就自由发挥。坑 4源码不过滤Token 爆炸一个 commit 可能改了package-lock.json、.env这些文件 diff 动辄几千行。解法加了FilterSourceCode()函数只保留源码文件的 diff。总结这个项目从想法到跑通花了大约两个晚上。比周报 Agent 多花了一倍时间主要是因为 Diff 获取方案从 API 降级到 Git以及 Prompt 迭代。但核心架构是同一条线数据采集 → AI 处理 → 自动推送下周我会写 W3 踩坑实录把搭这两个 Agent 过程中所有踩过的坑详细拆解。 源码地址GitHub - lobster-bujiaban/code-review-agent欢迎 Star、提 Issue、Fork 改造。一只用 AI Agent 搭副业产线的程序员全平台同名虾哥不加班需要定制 AI 工具来聊聊 → lob_ai