ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Windmill 协作实践:用 Local Codex Review 在 push 前复现 CI 的 Codex PR 审查

Windmill 协作实践:用 Local Codex Review 在 push 前复现 CI 的 Codex PR 审查 Windmill 协作实践用 Local Codex Review 在 push 前复现 CI 的 Codex PR 审查【免费下载链接】windmillOpen-source developer platform to power your entire infra and turn scripts into webhooks, workflows and UIs. Fastest workflow engine (13x vs Airflow). Open-source alternative to Retool and Temporal.项目地址: https://gitcode.com/GitHub_Trending/wi/windmill导读Windmill 仓库在 CI 中通过 GitHub Action.github/workflows/codex-pr-review.yml对每个非草稿 PR 自动执行 Codex 代码审查。为了让开发者能在 PR 真正存在之前就发现 CI 会拦截的问题仓库提供了一等公民的本地化技能local-review-codex它在你的分支上运行与 CI 完全相同的审查政策REVIEW.md与推理强度xhigh但作用域只覆盖你尚未推送的工作已提交 未提交改动。读完本文你将掌握该技能的完整用法、run.sh的底层实现原理、它与 CI 的逐项对齐与差异以及如何与其他本地审查技能配合获得独立视角。背景为什么需要一个推前的 Codex 审查在 Windmill 的开发流程中CI 的 Codex 审查承担着第一道关卡的作用。以 .github/workflows/codex-pr-review.yml 为骨架整个流程大致为检查 Codex 认证配置OPENAI_API_KEY优先于CODEX_AUTH_JSON→ 解析 PR 元数据PR 号、base/head SHA、标题正文、是否 fork→ 检出合并树 → 有条件地检出并替换 EE 私有代码 → 安装并登录 Codex CLI → 预取 base 与 head refs → 拉取既往 PR 讨论 → 写入审查上下文文件 → 执行codex exec→ 将输出发布为 PR 评论。但这条链路有一个天然的时间差只有 PR 存在之后CI 才会开始审查。对于一个非平凡改动等 push 之后再等 CI 反馈一轮代价是明显的。local-review-codex技能把这个环节提前到git push之前让开发者在工作区里就能拿到与 CI 口径一致的审查结论。该技能的入口文件是 .claude/skills/local-review-codex/SKILL.md它通过符号链接指向规范文件 .agents/skills/local-review-codex/SKILL.md真正的执行体是同一个目录下的 .agents/skills/local-review-codex/run.sh。AGENTS.md 中明确建议在 Claude Code 中使用/local-review-codex调用此技能。与 CI 审查的对齐与差异对齐identical本地审查刻意保持与 CI 审查三处关键参数完全一致审查政策以 REVIEW.md 为唯一政策来源涵盖严重性分级P0/P1/P2、公开面检查清单、AGENTS.md 合规检查与测试覆盖评估推理强度model_reasoning_effortxhigh与 CI 中传给codex exec的配置相同输出格式输出以## Codex Review开头每条发现标记 P0 / P1 / P2 严重级别并附带file:line。差异local-only本地运行与 CI 存在四处有意为之的差异理解它们有助于正确解读结果维度本地local-review-codexCIcodex-pr-review.yml模型gpt-6-astragpt-5.6-sol审查范围当前分支 vsmain的 merge-base包含未提交改动已推送的 PR diff沙箱read-only只能读 diff 与文件不能改动工作树danger-full-access在临时 runner 上上下文codex exec是独立的冷进程不锚定当前聊天会话全新 runner天然冷上下文关于模型差异文档与 run.sh 头部注释都强调这不是疏漏而是认证层级决定的。本地通过codex login的 ChatGPT 认证确认gpt-6-astra可用而 CI 优先使用OPENAI_API_KEY认证工作流中明确prefers it overCODEX_AUTH_JSON该认证层级尚未对gpt-6-astra验证过因此 CI 留在gpt-5.6-sol。待 API 访问确认后或 CI 切换到CODEX_AUTH_JSON认证后二者再统一模型。范围差异也值得注意本地审查以 merge-base 为界git merge-base HEAD base因此只看本分支引入的改动同时git diff BASE_SHA的单引用形式会把未提交的工作树改动一并折入 diff——这正是推前审查的价值所在。前置条件运行该技能需要满足两个前提codex CLI 0.153.4 且已通过codex login完成认证。环境变量OPENAI_API_KEY会被 Codex 优先采用但它可能无法触达gpt-6-astra模型见上文的模型说明。旧版 CLI 会以一句不带版本信息的报错拒绝该模型requires a newer version of Codex而run.sh会在执行前主动检查版本避免失败得不明不白。升级命令为npm install --global openai/codex0.153.4全局安装可能需要sudo。这个版本号与 .github/workflows/codex-pr-review.yml 中的 pin 保持一致——两侧 CLI 版本相同只有模型不同。base ref 保持最新。如果main或其他 base是陈旧的先执行git fetch确保 merge-base 计算准确。运行方法技能默认以main为基准也可显式指定其他 base refbash .agents/skills/local-review-codex/run.sh # 默认对比 main bash .agents/skills/local-review-codex/run.sh base # 对比指定 base ref必须使用bash调用或直接执行脚本因为脚本依赖 Bash 的set -o pipefailDebian/Ubuntu 下sh是 Dash会失败。如果本地不存在main分支例如全新的单分支 checkout脚本会自动回退到origin/main。run.sh 源码剖析一次审查是如何组装出来的.agents/skills/local-review-codex/run.sh约 115 行是整条本地链路的核心值得逐段理解版本门禁与认证告警。脚本在set -euo pipefail下运行先检查codex是否存在于 PATH再解析codex --version并用sort -V与0.153.4做语义化比较。这里有个细节|| true的存在是为了让无法解析的--version输出不至于在set -e下中止整个脚本——无法判断版本应当放行到 exec 阶段而不是杀掉审查。随后若环境中设置了OPENAI_API_KEY脚本会打印警告因为该密钥会优先于codex login凭据而gpt-6-astra在该认证层级可能不可用——失败信息会指向模型而非真正作祟的认证来源。base ref 解析与 merge-base。脚本先验证 base 是否存在优先本地 refgit rev-parse --verify --quiet ${BASE_REF}^{commit}失败则回退origin/${BASE_REF}两者都失败才报错退出并提示git fetch origin base。随后计算BASE_SHA$(git merge-base HEAD $BASE_COMMITISH)确保 diff 只包含本分支引入的改动。未跟踪文件的补齐。注释明确指出用 base SHA 配合单引用git diff虽然能折入未提交的工作树编辑但git diff永远看不到未跟踪文件——于是脚本单独用git ls-files --others --exclude-standard收集这些文件可能是一个全新模块、一个新 skill 目录避免被静默跳过。若 base 与 HEAD 相同且无任何差异脚本直接输出 No changes vs— nothing to review. 并提前退出。提示词组装与隔离。脚本用mktemp创建提示词与输出两个临时文件并注册trap ... EXIT清理只写临时文件工作树零污染。提示词由cat REVIEW.md共享政策 追加的Codex output format与Review context两部分拼接而成后者给出精确的 diff 上下文命令git log --oneline $BASE_SHA..HEAD变更提交git diff --stat $BASE_SHA变更文件git diff --unified0 $BASE_SHA完整审查 diff含未提交编辑未跟踪文件清单要求 Codex 逐个cat阅读整体视为新增代码格式部分要求输出以## Codex Review开头、每条发现带 P0/P1/P2 严重级别与文件路径、行号。这与 CI 使用的 .github/codex/pr-review.prompt.md 中规定的输出格式完全一致。最终执行。提示词通过 stdin 喂给codex exec \ -C $REPO_ROOT \ -m $MODEL \ -c model_reasoning_effortxhigh \ -s read-only \ -o $OUT \ - $PROMPT-s read-only对应 SKILL.md 中Sandbox is read-only的声明——审查可以读 diff 与文件但无法改动你的工作树。随后脚本打印分隔线并cat $OUT输出审查全文。审查政策与严重性分级无论本地还是 CI审查都遵循 REVIEW.md 这一共享政策核心要点开头一行必须给出结论Good to merge/Mergeable, but should ideally address nits: .../Should address issues before merging: ...三选一且结论中列出的每项都必须在正文有完整上下文严重性分级P0 覆盖 RCE、认证绕过、数据丢失、代码中的密钥、SQL 注入、路径穿越、公开面的认证破坏P1 覆盖显著 bug、新公开面缺失认证/授权检查、疑似异步路径上的阻塞 I/O、竞态、调用方可控参数缺少输入校验、可观察的性能回退P2 覆盖模块放置不当、文档与代码不一致、半成品公开抽象pub fn#[allow(dead_code)]TODO、AGENTS.md 风格违规只报告确信的问题只报确实由该 PR/分支引入的真实问题不报风格洁癖、臆测、既有问题与 linter/类型检查器能抓的问题每条发现先自问资深工程师一定会标记吗不确定就丢弃公开面清单对新增pub fn/ 导出的 Svelte 组件 / 导出 prop逐一核对认证/授权契约是否在文档注释或函数体中落实、模块职责是否匹配、是否半成品、输入校验是否防御注入/越界/溢出/NUL 字节测试覆盖评估按 diff 实际触及的层结束审查——Rust 后端逻辑期望单测、API handler/worker/队列/DB 访问期望或注明缺少集成测试、Svelte 组件一般不要求测试只对纯逻辑工具如flowDiff提出测试要求、CI/文档/纯配置改动则明确说明不预期自动化测试并给出合并前需要的手工验证场景。结果传递原样输出不做二次加工SKILL.md 对结果处理有明确纪律将 Codex 的输出原样打印不要重新总结或过滤。理由很直接——冷 Codex 一次 pass 的价值就在于暴露当前会话会合理化掉的问题如果主会话把结论翻译一遍就相当于把冷上下文的价值打了折扣。拿到结果后再与用户一起决定是否在 push 前处理这些发现。与 local-review 的互补关系仓库中还提供了 Claude 原生的本地审查技能 .agents/skills/local-review/SKILL.md在 Claude Code 中以/local-review调用。它与 Codex 版共享同一套REVIEW.md政策但执行路径不同Claude 版通过Agent工具派发branch-diff-reviewer子代理定义见 .claude/agents/branch-diff-reviewer.md只读工具、为分支 diff 审查量身定制强调子代理冷上下文的价值——主会话在反复迭代 diff 的过程中会吸收用户的推理与合理化从而锚定并漏掉 CI 能抓的问题。两者共同遵循的核心原则是一致的审查必须在全新上下文中运行。SKILL.md 中明确建议两个技能都跑一遍获得独立视角Claude 原生视角local-review加上 Codex 冷进程视角local-review-codex。而AGENTS.md还提到 Pi 的pi --skill local-review入口说明这套本地审查能力是三 CLI 共用的。注意事项与最佳实践认证优先级陷阱OPENAI_API_KEY的存在会静默改变认证来源导致gpt-6-astra不可用且报错指向模型而非认证。本地开发环境中如无必要避免设置该变量让codex login的 ChatGPT 凭据生效。base ref 新鲜度陈旧 base 会让 merge-base 失真审查范围不准。运行前保持git fetch习惯。Bash 而非 sh脚本依赖set -o pipefail必须用bash执行。工作树零污染脚本只写mktemp临时文件不会在仓库中留下任何脚手架审查后工作树与运行前完全一致。CLI 版本与 CI 对齐本地的 codex CLI 版本与 CI pin 相同0.153.4只有模型不同——排查问题时请先确认两侧版本一致再考虑模型差异。非平凡改动才需要SKILL.md 建议在git push之前、对非平凡改动使用本技能琐碎改动如纯文档可跳过。小结local-review-codex是 Windmill 开发工作流中把 CI 审查前移的工程化实践以 REVIEW.md 为统一政策、以xhigh推理强度为统一口径在 push 之前对未推送工作含未提交改动执行一次与 CI 行为一致的 Codex 审查。它的实现run.sh清晰展示了 merge-base 作用域计算、未跟踪文件补齐、临时文件隔离、认证告警与版本门禁等工程细节可作为本地复现 CI Agent 审查类工具的优秀参考。配合 .agents/skills/local-review/SKILL.md 使用可以在提交前获得 Claude 与 Codex 两个独立冷上下文的双重审查视角。【免费下载链接】windmillOpen-source developer platform to power your entire infra and turn scripts into webhooks, workflows and UIs. Fastest workflow engine (13x vs Airflow). Open-source alternative to Retool and Temporal.项目地址: https://gitcode.com/GitHub_Trending/wi/windmill创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表