chore(githooks): simplify post-receive hook and overwrite server log

Simplify the repo toplevel detection logic and remove verbose comments from the post-receive hook. Switch next-server.log from append mode to overwrite mode so each deploy starts with a fresh log file.
This commit is contained in:
2026-06-15 18:44:35 +08:00
parent fd5dfe2715
commit 664ff67ee9
+7 -28
View File
@@ -1,41 +1,20 @@
#!/bin/sh #!/bin/sh
# Post-receive hook: push 后自动 build + start # Post-receive hook: push 后自动 build + start
# #
# 触发场景:
# - 非 bare repo + receive.denyCurrentBranch=updateInstead:本地推送自动部署
#
# 用途:执行 package.json 中的 `build` + `start` 脚本
# - 实际调用 `pnpm run build`(输出丢,仅记退出码)
# - 再后台启 `pnpm run start`nohup,输出丢,hook 立即返回)
#
# 设计:逻辑块**封**装为独立函数,main 调**度**shell 风格)
# - **全**局变量:LOG_FILE(在 init_log_file **里**定**义**)、CURRENT_BRANCH
# - **函**数**间**通过 `$LOG_FILE` / `$BUILD_EXIT` 通信
# - **不**用 set -e —— 各步**自**己处理错**误**env 不**存**在 / build 失败 / 旧**进**程**不**存**在)→ 让 deploy 错**误****不**挡 git push
# pnpm 环境变量
# git-receive-pack 调 hook 时 CWD **可**能是 `.git/` 内**部**
# `git rev-parse --show-toplevel` 会**报**错 `must be run in a work tree`。
# 解**法****用** `git rev-parse --absolute-git-dir` **取**得**绝**对 .git **路**径,
# 然后 dirname **得**到 repo **顶**层。**这**两个调**用**在 .git/ 内**部**也都**能**成**功**。
GIT_DIR_ABS="$(git rev-parse --absolute-git-dir 2>/dev/null || true)"
if [ -n "$GIT_DIR_ABS" ] && [ "$GIT_DIR_ABS" != ".git" ]; then
REPO_TOPLEVEL="$(cd "$GIT_DIR_ABS/.." && pwd)"
else
REPO_TOPLEVEL="$PWD"
fi
cd "$REPO_TOPLEVEL" || { echo "FATAL: cannot cd to $REPO_TOPLEVEL" >&2; exit 1; }
# 同 .bashrc **里**的 NVM **加**载逻辑
export NVM_DIR="$HOME/.nvm" export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
REPO_TOPLEVEL="$(git rev-parse --show-toplevel 2>/dev/null || echo "$PWD")"
cd "$REPO_TOPLEVEL" || { echo "FATAL: cannot cd to $REPO_TOPLEVEL" >&2; exit 1; }
# ============================================================ # ============================================================
# 1. init_log_file —— 定**义** LOG_FILE + 创**建** logs/ 目**录** # 1. init_log_file —— 定**义** LOG_FILE + 创**建** logs/ 目**录**
# ============================================================ # ============================================================
init_log_file() { init_log_file() {
LOG_FILE="$(git rev-parse --show-toplevel)/logs/post-receive.log" LOG_FILE="$REPO_TOPLEVEL/logs/post-receive.log"
mkdir -p "$(dirname "$LOG_FILE")" mkdir -p "$(dirname "$LOG_FILE")"
} }
@@ -116,10 +95,10 @@ stop_existing_next() {
# 6. launch_next —— 后**台**启 `pnpm run start`,捕 PID # 6. launch_next —— 后**台**启 `pnpm run start`,捕 PID
# ============================================================ # ============================================================
launch_next() { launch_next() {
# next stdout/stderr 接**到** logs/next-server.log******模式******留**历**史** log ****于排**** # next stdout/stderr 接**到** logs/next-server.log******模式******次 deploy ********
NEXT_LOG_FILE="$REPO_TOPLEVEL/logs/next-server.log" NEXT_LOG_FILE="$REPO_TOPLEVEL/logs/next-server.log"
echo "=== start LAUNCH @ $(date -u +%Y-%m-%dT%H:%M:%SZ) ===" >> "$LOG_FILE" echo "=== start LAUNCH @ $(date -u +%Y-%m-%dT%H:%M:%SZ) ===" >> "$LOG_FILE"
nohup pnpm run start >> "$NEXT_LOG_FILE" 2>&1 & nohup pnpm run start > "$NEXT_LOG_FILE" 2>&1 &
START_PID=$! START_PID=$!
echo "=== start PID=$START_PID @ $(date -u +%Y-%m-%dT%H:%M:%SZ) ===" >> "$LOG_FILE" echo "=== start PID=$START_PID @ $(date -u +%Y-%m-%dT%H:%M:%SZ) ===" >> "$LOG_FILE"
} }