从读到写:PR 拉取与评论回写手记

       之前把 OAuth 和 webhook 状态闭环讲完了。到这一步,代码审查助手在 GitHub 侧已经能接进来;若只停在任务列表和后台草稿,对开发者仍像另一个系统,而不是 PR 里的协作者。我接下来要补的是链路后半段:Worker 里真正读到 PR 变更,以及人工确认后把草稿写回 GitHub。这两块都挂在同一个 GitProvider 抽象上,和前面 Mock/真实切换是一脉相承的。


一、背景:入口通了,还要把读和写接上

       Webhook 落库时,PullRequestSnapshot 里往往只有事件里带的元数据和一句占位说明,diff 要等 Worker 去拉。审查流水线 ReviewPipelineService 在处理任务时,第一步就是调 git_provider.fetch_pull_request,用返回的 PullRequestData 刷新快照,再交给静态分析、技能和模型。也就是说:前面做的 binding、OAuth、token 解析,在这里第一次被消费——没有有效 token,就会退回 Mock,演示仍能跑;OAuth 绑定的仓库,才有机会拉到真 files 和真内容。

       我联调时的体会是:前面若 webhook_status 或 connection_status 不对,任务照样能建,但 Worker 里读到的仍是 Mock 数据;助手是否在看真代码,取决于 binding 上的连接与 token,而不是 Webhook 是否 202。


二、读 PR:令牌、分页与内容来源

   GitHubProvider.fetch_pull_request 里,token 优先从 binding.oauth_connection 解出,没有则看配置的 fallback,再没有就走 Mock。有 token 时,先拉 PR 元数据,再分页拉 /pulls/{number}/files,对 Python/Java 等支持的语言尝试 contents API 或 raw_url,失败再退回 patch——日志里会记 contents_apiraw_urlpatch_fallback 各用了几次。这能保证PR 文件一多、patch 被截断时,助手仍要尽量拿到可分析的上下文。

       读到的 changed_files 会进入后续分析链路;对平台接入来说,我只要把 binding → token → GitHub REST 这条缝压实,后面同学换分析器或模型,不必动 Git 层。


三、写回评论:行内优先,失败再降级

       发布侧同样在 GitProvider 里实现。publish_comment 若草稿带 path 和 line,且快照有 head_sha,先尝试 GitHub 的 PR review comment(行内评论);若返回 4xx 或条件不满足,再退到 issue comment,并在正文里附上路径行号。没有 token 时与读取对称,直接走 Mock,返回 mock URL,本地验收不依赖外网。


四、业务层:确认之后才能发布

       Git 适配层只负责 HTTP;助手是否自动刷屏由服务层状态机挡住。publish_draft_comment 会先加载 comment、task、snapshot、binding 和 oauth_connection;已发布则记 draft_comment.publish_idempotent 直接返回;否则只允许 CONFIRMED 状态发布,再调 provider.publish_comment,写 published_url 和 draft_comment.published 审计。同一任务下草稿若都已发布或忽略,任务状态会推进到 PUBLISHED

       对外是 POST /api/v1/draft-comments/{comment_id}/publish,并做了权限和可见范围校验——和前面 RBAC、access_scope 是同一套故事:能发评论的人,和能看这条 binding 的人,要对齐。

       我跑通一次完整闭环时的顺序通常是:Webhook 或冒烟脚本建任务 → Worker 拉 PR → 后台确认草稿 → 点发布 → 在 GitHub PR 页或 Mock URL 上看到结果。这和产品叙事一致:助手出意见,人确定,系统再代发。


五、和前面工作的衔接,以及后面要做什么

   到目前我负责的后端接入线大致是:

  • Webhook / 幂等 / 异步 → 任务能稳定进队;
  • 绑定 / OAuth / webhook 状态 → 知道对哪条 binding、token 是否可用;
  • 目前:读 PR + 写评论 → 助手在研发流程里闭环。

目前,开发上这条线我认为已经收束;剩下主要是把链路实现可复现,并且进行测试与收官。在整个项目的角度,要与其他人的进度对其,做全链路的跑通与实现,还要写清楚 Mock 与真实 GitHub 的边界。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐