diff --git a/.githooks/post-receive b/.githooks/post-receive index dd2a6eef..7c6cd14e 100755 --- a/.githooks/post-receive +++ b/.githooks/post-receive @@ -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 .bashrc,pnpm **不**在 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/ 目**录**