fix(githooks): cd to repo top + load pnpm into PATH

- cd to repo toplevel first (defensive: git-receive-pack CWD may differ)
- source nvm or directly find pnpm binary if not in PATH
- prepend pnpm's dir to PATH so build/start work

Root cause: post-receive hook was not being triggered on push.
With core.hooksPath=.githooks (relative), git-receive-pack
resolved the path incorrectly. Also pnpm wasn't in PATH during
non-interactive shell invocation.
This commit is contained in:
2026-06-15 11:47:45 +08:00
parent b2170f789b
commit 558b3a32af
+31 -3
View File
@@ -1,7 +1,4 @@
#!/bin/sh
# MARKER
touch /tmp/.hook-marker
# Post-receive hook: push 后自动 build + start
#
# 触发场景:
@@ -15,6 +12,37 @@ touch /tmp/.hook-marker
# - **全**局变量:LOG_FILE(在 init_log_file **里**定**义**)、CURRENT_BRANCH
# - **函**数**间**通过 `$LOG_FILE` / `$BUILD_EXIT` 通信
# - **不**用 set -e —— 各步**自**己处理错**误**env 不**存**在 / build 失败 / 旧**进**程**不**存**在)→ 让 deploy 错**误****不**挡 git push
#
# 关键前置(**解**决 push 后 hook **不**触**发** + pnpm **找**不**到**):
# 1) cd 到 repo **顶**层 —— git-receive-pack 调 hook 时 CWD **未**必 = repo 顶
# 2) 加**载** nvm —— 非交互 shell **不**会 source .bashrcpnpm **不**在 PATH
# 3) **验**证 PATH —— 写日**志**确认 pnpm 可**用****不**可用则 build **必**失**败**
# ---- 前置:切到 repo 顶 + 加 pnpm 到 PATH ----
REPO_TOPLEVEL="$(git rev-parse --show-toplevel)"
cd "$REPO_TOPLEVEL" || { echo "FATAL: cannot cd to $REPO_TOPLEVEL" >&2; exit 1; }
# 加**载** nvm**非**交互 shell **不**自动 source .bashrc
# nvm 是 POSIX **兼**容,但**有**个**问**题:它**会** [ -n "$BASH_VERSION" ] **检**查,
# 在 dash **下** nvm 函**数**注**册**失败(pnpm **仍**然**找**不**到**)。
# 所以策略是:尝**试** source nvm**如**果失**败**则**直**接**找** pnpm **可执**行文件路径。
PNPM_BIN="$(command -v pnpm 2>/dev/null || true)"
if [ -z "$PNPM_BIN" ] && [ -s "$HOME/.nvm/nvm.sh" ]; then
\. "$HOME/.nvm/nvm.sh" 2>/dev/null || true
PNPM_BIN="$(command -v pnpm 2>/dev/null || true)"
fi
# 兜底:**直**接**搜**索 **常**见 nvm 路**径**
if [ -z "$PNPM_BIN" ]; then
for candidate in /root/.nvm/versions/node/*/bin/pnpm "$HOME/.local/share/pnpm/pnpm" /usr/local/bin/pnpm; do
if [ -x "$candidate" ]; then
PNPM_BIN="$candidate"
break
fi
done
fi
if [ -n "$PNPM_BIN" ]; then
export PATH="$(dirname "$PNPM_BIN"):$PATH"
fi
# ============================================================
# 1. init_log_file —— 定**义** LOG_FILE + 创**建** logs/ 目**录**