Resume Matcher 如何启用本地 pre-push 钩子拦截测试失败的推送?
2026/9/13 10:36:53 网站建设 项目流程

Resume Matcher 如何启用本地 pre-push 钩子拦截测试失败的推送?

【免费下载链接】Resume-MatcherThe #1 AI Harness for Building Resumes, PDFs, Cover Letters & more, locally with 100+ LLMs support.项目地址: https://gitcode.com/GitHub_Trending/re/Resume-Matcher

Resume-Matcher 仓库刻意不提供 PR 触发的 GitHub Actions 测试工作流——因为仓库收到大量外部贡献者 PR,CI 会在每一个 PR 上运行(包括不可信代码)。取而代之的是仓库内置的本地pre-push钩子:提交后照常 push,钩子在推送前运行后端测试、前端 locale 一致性检查和前端测试套件,任何一项失败都会中止推送。本文讲如何在你自己的 clone 里启用它、它会执行哪些检查、如何验证拦截生效,以及需要绕过时的出口。

钩子已经在仓库里:.githooks/pre-push

钩子脚本随仓库版本管理,位于 .githooks/pre-push,配套说明在 .githooks/README.md。它是一条"local CI",在你本机的git push前运行,不需要任何额外部署。

它按顺序执行三项检查,且所有检查都会跑完,让你一次看到全部失败而不是只看到第一个:

  1. 后端测试套件—— 在apps/backend下执行uv run pytest -q -p no:cacheprovider(约 8 秒)。LLM-judge evals 通过addopts -m "not eval"默认排除,因此不发起任何网络/LLM 调用
  2. 前端 locale 一致性—— 用纯 Python(无 Node/npm/nvm 依赖)运行 scripts/check_locale_parity.py,校验每个apps/frontend/messages/*.json的键结构与en.json一致。这个检查针对的正是曾经导致next build失败、且只在合并后 Docker 发布任务中才暴露的 i18n 结构不一致问题。
  3. 前端测试套件—— 在apps/frontend下运行 vitest,但仅当node在 PATH 上且apps/frontend/node_modules/.bin/vitest存在时才执行;否则跳过并打印警告。完整的tsc/next build检查有意不在此钩子中运行(文档记录的原因是钩子内 nvm/node 环境不可靠)。

环境缺失时的行为(脚本.githooks/pre-push中明确定义):

  • 找不到uv:后端检查直接记为失败,推送会被阻断
  • 找不到python3:跳过 locale 检查并打印警告,不阻断;
  • 找不到node或 vitest:跳过前端测试并打印警告,不阻断。

启用:每个 clone 执行一次

git config core.hooksPath .githooks

这一条命令就是全部启用步骤。它是本地 git 设置,只对你当前这个 clone 生效,不会写进仓库、也不影响其他克隆者——这是设计使然,因为每个开发者的本地环境不同。

启用前提(钩子脚本依赖的组件):

cd apps/backend uv sync # 安装后端依赖(创建 .venv);`uv` 本身需要在 PATH 上

前端 vitest 套件需要node_modules存在(即已执行过npm install);没有它时钩子只是跳过前端测试,后端检查和 locale 检查仍然生效。

验证拦截是否生效

正常路径下,每次git push会先看到钩子的输出头── pre-push gate ──,随后逐项打印▶ backend : uv run pytest▶ frontend : locale parity (messages/*.json vs en.json)▶ frontend : vitest run。全部通过时输出:

✓ pre-push gate passed — pushing.

确认拦截能力的最直接方式:让某项检查变红再推送。比如故意改坏一个后端断言后 push,钩子会输出✗ backend tests failed,并以✗ pre-push gate FAILED — push aborted. Fix the above, or bypass with: git push --no-verify结尾、退出码为 1,推送中止。修复后重新 push 即可。

不想每次 push 都等钩子时,可以按文档给出的命令手动跑各项检查:

cd apps/backend && uv run pytest # 后端套件 python3 scripts/check_locale_parity.py # locale 一致性(在仓库根目录执行) cd apps/frontend && npm run test # 前端套件(vitest)

日常使用的心智模型是:commit 随便提交,闸门在 push 时才运行,而不是每个 commit 都跑。

绕过与彻底关闭

文档给出两个明确的出口(见 .githooks/README.md):

git push --no-verify # 单次绕过闸门(适用于 docs-only / WIP 分支) git config --unset core.hooksPath # 彻底关闭钩子

边界与限制

  • 钩子是本地设置:换一个新 clone 需要重新执行git config core.hooksPath .githooks
  • 它拦截的是本机发起的 pushdev/main在维护者自己推送时保持绿色),外部贡献者的 PR 不经过这道闸门——仓库的决策记录(docs/agent/testing-strategy.md §7)解释了这是有意为之;
  • 前端tsc/next build目前不在钩子中,TypeScript 类型错误只能靠 locale 一致性检查和手动next build兜底;
  • 仓库的 agentic E2E monitor(apps/backend/e2e_monitor/)是按需、report-only 的上层工具,从不被写进 pre-push 钩子。

完整测试策略与这项闸门的设计背景见 docs/agent/testing-strategy.md(Phase 6)。

【免费下载链接】Resume-MatcherThe #1 AI Harness for Building Resumes, PDFs, Cover Letters & more, locally with 100+ LLMs support.项目地址: https://gitcode.com/GitHub_Trending/re/Resume-Matcher

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询