2026/9/14 10:55:05

open-code-review 的 GitLab CI 如何避免每次 push 都重复评审浪费 Token?

open-code-review 的 GitLab CI 如何避免每次 push 都重复评审浪费 Token? open-code-review 的 GitLab CI 如何避免每次 push 都重复评审浪费 Token【免费下载链接】open-code-reviewFast, efficient, battle-tested at Alibabas scale. Hybrid architecture code review tool: deterministic pipelines LLM Agent, precise line-level comments, built-in multi-language ruleset (NPE, thread-safety, XSS, SQL injection), OpenAI Anthropic compatible.项目地址: https://gitcode.com/GitHub_Trending/op/open-code-review如果你已经把 open-code-review下称 OCR接入了 GitLab CI会发现一个费 token 的现象默认流水线使用only: [merge_requests]触发这会响应所有MR 事件——创建、更新、重开。也就是说一个长期迭代中的 MR作者每 push 一次新提交ocr review就会对整个 MR diff 重新跑一遍 LLM 评审。文档明确指出这会“burn a lot of LLM tokens on long-running MRs”。GitLab CI 没有原生的“仅在 MR 创建时触发”事件所以文档给出的推荐模式是在运行评审之前先查询 MR 上是否已经存在 OCR 的评论如果存在就直接退出不消耗任何 token。这篇文章基于仓库自带的示例examples/gitlab_ci 下的.gitlab-ci.yml和post_review.py和文档pages/src/content/docs/en/integrations/ci.md中的 GitLab CI 章节说明如何改造这条流水线。准备条件接入默认 GitLab 流水线如果还没接入 OCR先完成以下两步已接入的可以直接跳到改造步骤。把.gitlab-ci.yml和post_review.py两个文件都放到你的仓库根目录或子目录——如果放在别处记得同步修改 YAML 中python3 post_review.py的路径。仓库已有.gitlab-ci.yml时可以把配方 vendor 到其他路径并用include:引入例如include: - local: ci/ocr-review.gitlab-ci.yml在项目的Settings → CI/CD → Variables中配置 CI/CD 变量变量必填Masked说明OCR_LLM_URL是否LLM API 端点 URL例如https://api.openai.com/v1/chat/completionsOCR_LLM_AUTH_TOKEN是是LLM API 认证 token会被写入ocr config set llm.auth_tokenOCR_LLM_MODEL是否模型名。OCR 没有内置默认模型不设置流水线会直接失败GITLAB_API_TOKEN否本文需要见下是带apiscope 的 Project / Personal / Group access tokenGITLAB_API_TOKEN在默认流水线中是可选项不设置时回退到内置的CI_JOB_TOKEN例如 fork MR 场景它可以通过/discussions发讨论文档仍然建议用专门的 token 保证可靠性。但本文的去重检查脚本直接读取GITLAB_API_TOKEN不会回退到CI_JOB_TOKEN所以要启用这个模式必须配置带apiscope 的GITLAB_API_TOKEN。另外注意GitLab CI/CD 不支持值少于 8 个字符的变量因此llm.use_anthropic无法作为 CI 变量传入流水线里被硬编码为false需要使用 Anthropic Claude 模型时要直接改.gitlab-ci.yml脚本。改造用 Python 包装器替代直接的 ocr review 调用把code-reviewjob 里直接执行ocr review ... .ocr/ocr-result.json的那一步替换为下面的 Python 包装脚本。它先调用 GitLab API 列出 MR 的 notesper_page100逐条检查 body 中是否含OpenCodeReview找到即说明该 MR 已经被 OCR 评审过打印日志后直接退出ocr review根本不会执行没找到才运行评审并把 JSON 输出写到发布步骤期望的.ocr/ocr-result.jsonscript: # Install OpenCodeReview - npm install -g alibaba-group/open-code-review # Configure OCR - | : ${OCR_LLM_URL:?set OCR_LLM_URL in Settings - CI/CD - Variables} : ${OCR_LLM_AUTH_TOKEN:?set OCR_LLM_AUTH_TOKEN in Settings - CI/CD - Variables} : ${OCR_LLM_MODEL:?set OCR_LLM_MODEL in Settings - CI/CD - Variables} ocr config set llm.url $OCR_LLM_URL ocr config set llm.auth_token $OCR_LLM_AUTH_TOKEN ocr config set llm.model $OCR_LLM_MODEL ocr config set llm.use_anthropic false ocr config set llm.extra_body {thinking: {type: disabled}} # Check for existing OCR reviews and run review only if not found - | python3 WRAPPER_SCRIPT import json import os import subprocess import sys import urllib.request GITLAB_URL os.environ.get(CI_SERVER_URL, https://gitlab.com) PROJECT_ID os.environ[CI_PROJECT_ID] MR_IID os.environ[CI_MERGE_REQUEST_IID] API_TOKEN os.environ[GITLAB_API_TOKEN] TARGET_BRANCH os.environ[CI_MERGE_REQUEST_TARGET_BRANCH_NAME] # Check for existing OCR reviews url f{GITLAB_URL}/api/v4/projects/{PROJECT_ID}/merge_requests/{MR_IID}/notes?per_page100 req urllib.request.Request(url, headers{PRIVATE-TOKEN: API_TOKEN}) with urllib.request.urlopen(req) as resp: notes json.loads(resp.read().decode(utf-8)) for note in notes: if OpenCodeReview in note.get(body, ): print(OCR has already reviewed this MR. Skipping to save tokens.) # 写一个空的 comments 结果避免后续 post_review.py 因找不到输入文件而报错 os.makedirs(.ocr, exist_okTrue) with open(.ocr/ocr-result.json, w) as f: f.write({comments: []}) sys.exit(0) # No existing review found - run OCR print(No existing OCR review found. Running review...) COMMIT_SHA os.environ[CI_COMMIT_SHA] result subprocess.run([ ocr, review, --from, forigin/{TARGET_BRANCH}, --to, COMMIT_SHA, --format, json, --audience, agent ], capture_outputTrue, textTrue) # Save output for the posting script os.makedirs(.ocr, exist_okTrue) with open(.ocr/ocr-result.json, w) as f: f.write(result.stdout) with open(.ocr/ocr-stderr.log, w) as f: f.write(result.stderr) print(OCR review completed.) WRAPPER_SCRIPT # Post review comments to MR - python3 post_review.py .ocr/ocr-result.json脚本要点--to使用CI_COMMIT_SHA而不是目标分支名这是示例流水线对 fork MR 的支持方式同仓库 MR 同样适用。评审仍保持--format json --audience agent前者给出可解析的 JSON后者抑制进度输出保持 stdout 干净。文档示例在命中时只sys.exit(0)并打印提示上面的版本额外在跳过分支写了一个{comments: []}空结果因为post_review.py的输入参数默认读取.ocr/ocr-result.json文件不存在会打印Failed to parse OCR output并尝试发一条空的错误 summary。如果你的 YAML 在跳过分支会整体终止 job则不需要这一行。验证是否生效判断方法直接看 pipeline 日志和 MR 评论首次MR 上还没有 OCR 评论的 pipeline 日志出现No existing OCR review found. Running review...评审完成后 MR 上出现 inline discussions 和 summary notesummary note 默认带OpenCodeReview标识。之后作者再次 push触发的新 pipeline日志出现OCR has already reviewed this MR. Skipping to save tokens.job 正常结束exit 0MR 上不会新增评审评论也没有产生新的 LLM 调用。如果想确认为什么某次运行评审结果异常可以在 job 里cat .ocr/ocr-result.json和cat .ocr/ocr-stderr.log查看 OCR 的原始输出对应文档的 Debugging 建议。需要强制重新评审时文档给出的方法是手动删除 MR 上已有的 OCR notes——下一次 pipeline 运行检测不到 OCR 评论就会重新执行完整评审。限制与排查检查逻辑是在 notes 列表的前 100 条per_page100里查找OpenCodeReview字样。如果某个 MR 的 notes 已经超过 100 条且 OCR 评论不在前 100 条内跳过逻辑可能检测不到、从而重复评审。跳过分支只保证不再消耗 LLM token但 pipeline 本身仍会被 MR update 事件触发并跑完安装与配置步骤resource_group: mr-review-$CI_MERGE_REQUEST_IID和interruptible: true只负责并发管理不会阻止 token 消耗。跳过分支中API_TOKEN直接取自os.environ[GITLAB_API_TOKEN]变量未配置时脚本会在这一行抛异常而不是优雅回退所以本文场景下该变量是必配项。常见报错与默认流水线相同对照文档的 TroubleshootingCannot find merge-base说明 runner 用了浅克隆请保留 job 里的GIT_DEPTH: 0全量克隆设置API error 403说明GITLAB_API_TOKEN缺apiscope、不是项目成员或自托管实例上 token 不是由本实例签发Failed to parse OCR output则检查OCR_LLM_URL和OCR_LLM_AUTH_TOKEN。自托管 GitLab 无需改代码发布脚本读取 GitLab 自动设置的CI_SERVER_URL但要确保GITLAB_API_TOKEN由你的自托管实例签发而不是gitlab.com。参考完整 CI/CD 集成说明pages/src/content/docs/en/integrations/ci.mdGitLab CI 章节的 “Avoid re-reviewing on every push”可运行的示例流水线与发布脚本examples/gitlab_ci/.gitlab-ci.yml、examples/gitlab_ci/post_review.py、examples/gitlab_ci/README.mdJSON 输出格式comments[]信封结构见 CLI Reference【免费下载链接】open-code-reviewFast, efficient, battle-tested at Alibabas scale. Hybrid architecture code review tool: deterministic pipelines LLM Agent, precise line-level comments, built-in multi-language ruleset (NPE, thread-safety, XSS, SQL injection), OpenAI Anthropic compatible.项目地址: https://gitcode.com/GitHub_Trending/op/open-code-review创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考