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前运行,不需要任何额外部署。
它按顺序执行三项检查,且所有检查都会跑完,让你一次看到全部失败而不是只看到第一个:
- 后端测试套件—— 在
apps/backend下执行uv run pytest -q -p no:cacheprovider(约 8 秒)。LLM-judge evals 通过addopts -m "not eval"默认排除,因此不发起任何网络/LLM 调用。 - 前端 locale 一致性—— 用纯 Python(无 Node/npm/nvm 依赖)运行 scripts/check_locale_parity.py,校验每个
apps/frontend/messages/*.json的键结构与en.json一致。这个检查针对的正是曾经导致next build失败、且只在合并后 Docker 发布任务中才暴露的 i18n 结构不一致问题。 - 前端测试套件—— 在
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; - 它拦截的是本机发起的 push(
dev/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),仅供参考