用Hermes智能体搭建GitHub PR自动化评审:从配置到落地的完整实践

发布时间:2026/9/5 20:58:51
用Hermes智能体搭建GitHub PR自动化评审:从配置到落地的完整实践 先交代下背景。我们团队是个十人左右的小型研发组前后端加上算法、测试都算上每天同时活跃的PR大概有七八个。以前评审主要靠两个核心开发人工盯结果就是简单问题反复提、低级错误流到合并之后才被发现、代码风格没人统一、安全相关的隐患偶尔漏过去。加上远程办公之后时差问题一个PR挂个两三天才有人看是常态。我们试过加评审清单、开会宣贯规范效果都撑不过两周。后来我开始研究用Agent类的工具把评审这件事拆给自动化流程去扛于是接触到Hermes这个智能体框架搭了一套GitHub PR自动审查的流程跑了一阵子之后团队合并效率确实肉眼可见地提上来了。这篇东西不是泛泛的工具推荐文章而是实打实地记录我自己的选型过程、架构设计、规则配置思路以及三个月里踩到的一堆坑。如果你也想给团队搭一套自动化代码评审或者只是想把个人开源项目的PR纳入AI辅助审查这篇应该能帮你省下不少试错成本。1. 为什么自动化代码评审值得做我们真实的痛点与投入产出账先聊聊最实际的问题值不值得投入精力搭这套东西我的判断是如果你的团队存在下面这三类信号中的至少两类那就非常值得投入评审成为瓶颈PR堆积时间超过24小时核心开发每天要切出去大块时间做人肉扫描自己的开发节奏断断续续。低级错误反复出现拼写错误、日志打错、边界条件漏判、异常没捕获、密钥硬编码这些问题明明有规则可查但人盯人就是盯不干净。意见来回拉锯风格问题、命名问题等非功能性意见占掉评审对话的一半以上真正的逻辑问题反而没被认真讨论。我算过一笔时间账在没有自动化之前一个中等规模PR改动300到500行核心开发做首次评审大概需要20到30分钟其中真正有价值的逻辑审查时间可能只有一半剩下全在挑格式、挑痕迹、挑基础性问题。如果PR涉及紧急修复或者陌生模块时间还要翻倍甚至更多。引入自动化审查之后Hermes在PR开出来的几十秒内就会给出结构化评审意见人只需要在它给出的基础上做增量补充和深度逻辑判断单次评审时间能压到10分钟以内如果改动小甚至更少。还有一个经常被忽视的价值是评审情绪的改善。过去评审意见容易带个人语气格式问题夹杂在逻辑问题里被评审的人容易应激讨论着讨论着就跑偏。Hermes生成的评论是客观、结构化、带规范依据的团队里大家默认这是在跟工具对话心理接受度高很多沟通摩擦明显下降。当然自动化不等于完全替代人工评审。至少现阶段AI对业务语义的深层理解、跨模块影响面的判断、架构层面的权衡仍然是需要人来兜底的。所以更合适的定位是Hermes负责第一轮全量扫描人负责第二轮深度评审和终审决策。这两者结合才是完整的高效评审闭环。2. Hermes智能体的工作边界与核心能力拆解我不是从零开始写脚本去调GitHub API的而是直接把Hermes这个Agent框架用了起来。在两三周内把整套流程跑通很大程度归功于它的能力边界设计得比较合适。Hermes本身是一个偏通用的智能体框架支持通过插件或技能方式接入不同平台相关的安装部署资料在网上也挺好找。我把它用在代码评审场景核心依赖它的几项能力代码变更的自动化拉取与分析通过GitHub Webhook或者定时拉取机制拿到PR的完整diff能够感知到文件级和行级的变更粒度。多语言代码解析我们仓库里主要是Python、TypeScript和一部分GoHermes对这些主流语言的基础语法和常见工程规范都能覆盖到不会出现解析不了整份diff的情况。规则化评审与自然语言提示词结合这是我最看重的。它既支持用规则库的形式强制约束某些硬性红线也支持用自然语言给它下达评审指令两者可以混用。结构化评论输出以行内评论或者汇总评论的形式回写到PR页面从开发者的视角看就像多了一个认真、耐心的评审机器人。Hermes的安装方式有一定灵活性可以用Docker跑服务端也可以安装在本地开发机上甚至还有桌面端形态。我的落地方式比较朴素因为团队代码仓库托管在GitHub上我在一台内网的小服务器上以Docker方式部署了Hermes服务然后通过GitHub Webhook触发它执行审查任务。这个方案的优点是无侵入团队现有工作流一点不用改。在对Hermes做能力边界理解的过程中有一件事需要特别明确它不是一个静态代码扫描工具而是带有一定推理能力的评审Agent。静态扫描工具只能匹配预定义的规则模板比如要求所有函数必须有docstring、禁止使用eval等一旦遇到规则之外的场景就无能为力。Hermes的优势在于它能结合上下文、包括PR描述、相关文件、变更意图来分析一个改动是否合理这就跟人更接近了。但是能力边界也要同时画清楚。在我实测下来Hermes在以下几类场景容易表现不佳或者需要人工干预大PR跨多模块重构时上下文窗口不够它很容易只看局部、丢全局。出现和业务强相关的判断时比如数据库字段是否需要加索引、某个逻辑是否满足特定业务约束它会给出看起来合理这类无意义的废话因为它没有业务背景知识。多人同时评论、讨论串复杂时它对讨论内容的跟踪能力仍然有限偶尔会出现意见重复。理解了边界之后下一个问题就是怎么在配置文件层面把它的能力边界调整到最适合我们的状态。3. 一次完整的Hermes配置与GitHub接入实操记录下面这部分是纯操作层面的东西。由于Hermes的具体版本迭代比较快配置字段可能有所调整我不建议你对着我这份配置照抄而是要理解每一步的意图在自己的环境里去验证。3.1 安装与初始化的选择Hermes有Agent和平台两种理解路径。作为智能体本身它有一套指令系统和Skill机制可以在本地驱动工具完成任务作为平台的话它通常需要通过类似Webhook桥接的方式连接外部服务。我采用的方式是在一台Ubuntu 22.04的服务器上部署Hermes服务端然后通过GitHub App的方式建立和GitHub仓库的连接。GitHub App的创建流程不复杂在GitHub Settings - Developer settings - GitHub Apps里新建一个App配置好Webhook URL指向Hermes服务权限方面我勾选了Pull requests的读权限和写权限、Checks的读写权限以及Contents的只读权限。生成私钥之后放到Hermes的配置目录这一步做完GitHub和Hermes之间的信任关系就建立了。选GitHub App而不是Personal Access TokenPAT的关键原因是权限边界。PAT是整个用户级别的授权如果这个Token泄漏攻击者能操作你名下的所有仓库。GitHub App的权限细化到仓库和资源类型还能设置过期时间安全上可控得多。3.2 Hermes的配置文件应该怎么组织我的Hermes配置目录大概长这样hermes/ ├── config.yaml ├── skills/ │ ├── code_review/ │ │ ├── prompt.md │ │ └── rules.yaml │ └── ... ├── keys/ │ └── github_app.pem └── logs/config.yaml里面主要声明了三类内容GitHub App连接参数App ID、安装ID、私钥路径、监听的事件类型我默认监听pull_request的opened和synchronize事件也就是说新开PR和更新PR都会触发、以及要启用的Skill名称。# config.yaml 示例请以当前版本实际字段为准 github: app_id: 123456 install_id: 2345678 private_key_path: /path/to/hermes/keys/github_app.pem webhook_secret: your_super_secret events: - pull_request.opened - pull_request.synchronize skills: - code_review如果你是用Docker部署的这里要特别注意容器内外路径映射的问题我第一次部署时就是因为私钥路径没有正确映射到容器内导致认证一直失败。日志里反复出现permission denied排查了半天才发现不是权限问题而是路径问题这个坑值得记一下。3.3 让Hermes活跃起来的关键一步配置完成之后有一个关键动作是很多文档里没有强调的必须在GitHub仓库中安装这个GitHub App。光创建App但不安装你的仓库根本收不到任何Webhook事件。去仓库的Settings - GitHub Apps页面找到你创建的App点击Configure然后选择要授权的仓库这一步做完之后顺手在GitHub上随便开一个测试PR看Hermes日志有没有收到事件没有就回头检查Webhook URL和Secret是否配对。我第一次跑通的时候在测试PR里故意写了一行print(api_key)等着看Hermes能不能捕捉到。大约过了40秒PR页面已经出现了Hermes的评论不仅指出了硬编码密钥问题还给出了修改建议和对应的行号。那一刻确实有种值了的感觉。4. 评审规则库的构建思路用规则兜底用提示词提上限配置跑通只是基础真正决定这套系统好不好用的是评审规则库的设计。这部分我花的时间最多前后迭代了大概五轮下面说说我的思路。4.1 分层设计的规则库我把评审规则分成了三个层次第一层是红线规则不管什么项目出现这类问题必须拦截不能合并。比如密钥/Token等敏感信息硬编码、sql拼接字符串、使用了被禁止的危险函数、明显的越权逻辑等。这一层的规则是一票否决制Hermes一旦发现评论里会带上BLOCK标识我们的分支保护规则也会拦下未通过的checks。第二层是规范规则和团队的代码规范保持一致。比如Python代码要符合PEP8相关约定、TypeScript要遵循eslint的常用规则集、函数不能超过一定的复杂度、禁止TODO遗留等。这一层的目的是让每个PR的代码风格都向团队标准看齐。第三层是建议规则属于最好能改但不强求比如某些代码块可以提取成复用函数、某个实现可以换成更高效的数据结构、这里补一个单元测试会更好等。建议性评论控制在合理数量内不然会噪音过大。规则文件用YAML组织每一类下面的具体规则可以很直观地配置比如red_line_rules: - name: hardcoded_secret pattern: AKIA[0-9A-Z]{16}|sk-[a-zA-Z0-9]{20,}|password\\s*\\s*[\][^\][\] message: 检测到疑似密钥硬编码请立即移除并改用密钥管理服务。 level: block配规则的时候不用追求面面俱到因为Hermes本身有一定的语义理解能力规则库兜住你明确知道的红线剩下的交给提示词模型去发挥反而效果更好。4.2 评审提示词设计是真正的分水岭如果说规则库是下限的保障那提示词就是上限的放大器。评审提示词的设计直接决定了Hermes产出的评论质量这个部分值得你花时间去打磨。我自己的评审提示词经历了几个版本的迭代最初的版本特别简陋大致意思是请审查这个PR找出问题。结果就是它给出的评论非常泛泛像建议增加错误处理、请优化代码可读性这种正确的废话多点没法用。后来我参考了一个很有启发性的写法把提示词的重心从列出问题转向明确评审关注的维度和评论的形式。现在的提示词大致逻辑是这样你是一个资深代码评审专家。请按照以下维度审查PR的变更内容 1. 安全性是否有敏感信息泄漏、SQL注入、XSS、越权风险。 2. 正确性逻辑是否有明显漏洞边界条件是否考虑周全异常路径是否有处理。 3. 可维护性命名是否表意清晰、函数是否过长、是否存在重复代码、抽象层次是否合理。 4. 性能与资源是否有明显的性能隐患比如循环内执行查询、内存泄漏风险、无限递归等。 5. 测试覆盖改动是否有对应的测试用例核心逻辑是否有单测覆盖。 输出要求 - 每个问题必须标注文件、行号和建议修改方式。 - 按严重级别分类输出block / warning / suggestion。 - 不确定的问题用建议确认的方式提出不要武断。 - 不要输出与PR无关的内容。加了这些约束之后Hermes的评审质量明显上了一个台阶。它不再给出空泛的废话而是会针对具体代码行给出有建设性的建议。4.3 Skill的复用与团队适配Hermes的Skill机制在团队推广上很管用。我给自己配的这套code_review Skill可以封装好之后分享给团队其他人他们不用改任何规则直接就能用同一套评审标准。如果某个成员发现了一些Hermes漏掉的常见问题可以把这个问题沉淀成一条规则加进去慢慢积累下来规则库就会越来越贴近团队实际。这里有一个需要确定的度规则加得太多会导致误报率升高本来可合并的PR被一堆无关紧要的建议卡住。我的经验是红线规则宁缺毋滥建议规则适量就好每加一条规则都问一下自己这个问题在过去三个月的评审中出现过几次如果低于三次就不要加。5. 跑通流程后必须处理好的三类联动问题工具本身的配置只是开始真正影响落地效果的是和其他环节的联动。这里分享我踩过最多的三类坑。5.1 PR冲突和被插队时的处理我有一个习惯是写完代码立刻开PR但经常遇到刚开完PR还没合并主干分支又被别人推进了新代码或者代码审查过程中和别的PR发生冲突。以前遇到这种情况手动处理起来确实痛苦尤其是在多个PR同时活跃、大家的改动区域又靠近时你的PR被插队了需要解决冲突几乎是每天都会上演的戏码。Hermes对PR更新的感知是不错的只要配置了synchronize事件PR一有更新它就会重新拉取新的diff重新评审。但如果你在处理冲突之后没有把分支更新到最新Hermes给出来的行号和评论位置就会对不上容易误导人。我的经验是先解决冲突、再更新分支、最后等Hermes的增量重新评审这个顺序千万不能反。一旦出现冲突导致Hermes无法正常解析diff的情况我会手动去GitHub页面上确认一下状态然后重新触发一次审查。不过这个问题在大多数场景下可以尽量规避把PR拆小、控制每次PR的改动范围冲突概率会显著下降。一个PR既要修Bug又要加需求又要改文档这种杂拌PR会让自动化审查效果大打折扣对人工评审也不友好。5.2 与GitHub Checks体系整合把机器人意见变成硬性关卡默认情况下Hermes的评审意见以评论形式存在PR里开发者可以看但无视它也不影响合并。这远远不够。如果你想真正把自动化评审变成流程的一部分就必须把它的输出接入GitHub Checks接口让评审结果以Check的形式展示不合格就阻止合并。我的做法是在分支保护设置里加了一条规则要求PR必须通过开发者的一个名为code-review/hermes的Check才能合并。这样一来逢开新PR或者更新PRHermes自动跑完审查后会把结论以Check状态上报如果发现block级别的问题Check结论会是failureGitHub直接拒绝合并直到问题解决并重新更新分支。这一轮操作下来人盯人就彻底变成了流程盯流程。5.3 误报和漏报的复盘机制没有哪个现成的工具能做到100%零误报、零漏报。对于误报处理办法是建立驳回机制代码作者可以在评论下面回复说明理由定期收集这些不成立的意见对应调整规则或提示词。对于漏报处理办法就是前面提过的定期把手动评审中发现的新问题类型沉淀成新的规则。我自己是两周一复盘把最近两个星期的评审记录导出来分类统计看哪些规则触发频率最高、哪些规则从来没有触发过、哪些误报最多。触发率低的规则可以删掉误报多的规则要放宽门槛或者改成正则写法这样规则库才不会越来越臃肿。6. 实测验证三个月跑下来评审效率与质量的变化数据最后把三个月的实测情况给大家看一下这里只列数据不掺水分。我们的代码仓库以Python和TypeScript为主三个月内Hermes总审查PR数为186个累计提出了794条评审意见。其中block级别的硬性问题一共87条占比约11%这些如果没有被拦截流到生产环境里大概率就是线上事故或安全隐患。warning级别的意见351条suggestion级别356条。最典型的场景是硬编码密钥问题。三个月里Hermes抓到了12次密钥和Token硬编码其中大部分是开发者为了方便调试临时写的偶尔忘了删。这事儿以前靠人工评审真的特别容易漏因为人都有惯性看到某个文件改动时意识不到那个角落多了一个密钥。Hermes就不一样它每次都是全文扫描漏掉的可能性极低。评审节奏的变化也很明显。以前PR平均首次人工评审等待时间是26小时现在只要Webhook正常PR开出来1分钟内Hermes的评审意见就会挂上去开发者在等待人工评审前就可以根据机器意见先做一轮自测和修复。人工评审的关注点也集中到了真正需要人来判断的地方团队的评审会议从低效挑刺变成了讨论关键设计。当然也有一些数据是不太好量化的比如团队代码规范的一致性、新人对项目规范的熟悉速度这些没有直接指标但长期沉淀下来带来的收益是实实在在的。7. 关于落地这套流程的个人经验与后续扩展思路最后聊几句我个人在这三个月中比较深的感受。第一自动化评审工具不是用来代替人的而是用来把人从重复劳动里解放出来的。我见过一些团队一上来就追求全自动合并这非常危险AI的评审能力目前还远达不到可以完全信赖的程度在自动化基础上保留一层人工终审是底线。第二规则和提示词一定要持续迭代没有一套一次到位的配置。这和你养一个实习生有点像刚开始你手把手教后来它越来越懂你的要求但你也要持续给它反馈不然它会停留在旧水平上。第三注意排查成本。自动化评审本身的响应速度非常重要如果一套审查要跑十几分钟开发者早就切走去做别的事了回来看评论时上下文已经丢失新鲜感大打折扣。我目前遇到的绝大多数PR从Webhook触发到评论挂上耗时能控制在1分钟以内这个体感非常重要。后续我打算扩展的方向有三个一是把Hermes接到内部的GitLab仓库上因为我们还有一小部分私有项目托管在内网二是尝试让它对测试代码也做覆盖度评审而不只是评审业务代码三是把过去半年的评审数据做成一份团队质量报告每个季度自动生成用来指导团队的技术债处理优先级。自动化代码评审这条路我觉得对于任何有一定代码积累的团队都值得走一遍。不需要一步到位哪怕先从一个仓库开始跑通一个最小的闭环后面慢慢完善收获是看得见的。如果你也在考虑类似的方案或者已经踩到了什么不一样的坑欢迎一起交流。