diff --git a/.githooks/post-receive b/.githooks/post-receive index 3343aeb3..74e8426f 100755 --- a/.githooks/post-receive +++ b/.githooks/post-receive @@ -6,20 +6,24 @@ export NVM_DIR="$HOME/.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 -GIT_DIR_ABS="$(git rev-parse --absolute-git-dir 2>/dev/null)" -if [ -n "$GIT_DIR_ABS" ] && [ -d "$GIT_DIR_ABS" ]; then - REPO_TOPLEVEL="$(cd "$GIT_DIR_ABS/.." && pwd)" - export GIT_DIR="$GIT_DIR_ABS" -else - REPO_TOPLEVEL="$(git rev-parse --show-toplevel 2>/dev/null || echo "$PWD")" -fi -unset GIT_WORK_TREE -cd "$REPO_TOPLEVEL" || { echo "FATAL: cannot cd to $REPO_TOPLEVEL" >&2; exit 1; } -echo "=== REPO_TOPLEVEL=$REPO_TOPLEVEL (GIT_DIR=$GIT_DIR) ===" >&2 +# 全局变量统一声明。具体值由各步骤函数写入。 +REPO_TOPLEVEL="" +LOG_FILE="" +CURRENT_BRANCH="" +START_PORT="" +BUILD_EXIT=0 -sync_worktree() { - echo "=== sync_worktree: git reset --hard HEAD @ $(date +%Y-%m-%dT%H:%M:%S%z) ===" - git reset --hard HEAD +resolve_repo_context() { + GIT_DIR_ABS="$(git rev-parse --absolute-git-dir 2>/dev/null)" + if [ -n "$GIT_DIR_ABS" ] && [ -d "$GIT_DIR_ABS" ]; then + REPO_TOPLEVEL="$(cd "$GIT_DIR_ABS/.." && pwd)" + export GIT_DIR="$GIT_DIR_ABS" + else + REPO_TOPLEVEL="$(git rev-parse --show-toplevel 2>/dev/null || echo "$PWD")" + fi + unset GIT_WORK_TREE + cd "$REPO_TOPLEVEL" || { echo "FATAL: cannot cd to $REPO_TOPLEVEL" >&2; exit 1; } + echo "=== REPO_TOPLEVEL=$REPO_TOPLEVEL (GIT_DIR=$GIT_DIR) ===" >&2 } init_log_file() { @@ -37,12 +41,11 @@ write_metadata_header() { } > "$LOG_FILE" } -# ============================================================ -# 3. copy_env_by_branch —— 根据分支选 env-example → .env -# main 分支 → .env.production(prod 部署) -# test 分支 → .env.local(test 不碰 .env.production,避免读到 prod 域名) -# dev 分支 → .env.local(未配远端用途,但保留) -# ============================================================ +sync_worktree() { + echo "=== sync_worktree: git reset --hard HEAD @ $(date +%Y-%m-%dT%H:%M:%S%z) ===" + git reset --hard HEAD +} + copy_env_by_branch() { CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD) echo "=== branch: $CURRENT_BRANCH ===" >> "$LOG_FILE" @@ -131,10 +134,8 @@ stop_existing_next() { } launch_next() { - # next stdout/stderr 接到 logs/next-server.log(覆盖模式,每次 deploy 重新开始) - NEXT_LOG_FILE="$REPO_TOPLEVEL/logs/next-server.log" echo "=== start LAUNCH port=$START_PORT @ $(date +%Y-%m-%dT%H:%M:%S%z) ===" >> "$LOG_FILE" - PORT="$START_PORT" nohup pnpm run start > "$NEXT_LOG_FILE" 2>&1 & + PORT="$START_PORT" nohup pnpm run start >> "$LOG_FILE" 2>&1 & START_PID=$! echo "=== start PID=$START_PID @ $(date +%Y-%m-%dT%H:%M:%S%z) ===" >> "$LOG_FILE" } @@ -150,10 +151,13 @@ log_abort() { # main —— 调度所有步骤 # ============================================================ main() { + resolve_repo_context init_log_file - sync_worktree # 先同步工作树到新 HEAD(与 git config denyCurrentBranch 配合) write_metadata_header # 先覆盖写元信息(这样 env copy 日志能保留在后面) + + sync_worktree # 先同步工作树到新 HEAD(与 git config denyCurrentBranch 配合) copy_env_by_branch # 追加 env copy 日志 + select_port_by_branch # 根据当前分支决定 next start 端口 if ! run_build; then