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:
+31
-3
@@ -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/ 目**录**
|
||||
|
||||
Reference in New Issue
Block a user