Merge branch 'dev' into test
This commit is contained in:
+44
-33
@@ -1,18 +1,11 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# Post-receive hook: push 后自动 build + start
|
# Post-receive hook: push 后自动 build + start
|
||||||
#
|
|
||||||
|
|
||||||
# pnpm 环境变量
|
# pnpm 环境变量
|
||||||
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
|
||||||
|
|
||||||
# git 调钩子时 cwd=GIT_DIR 并设了 GIT_DIR=.(相对)。此时:
|
|
||||||
# 1. `git rev-parse --show-toplevel` 返回 `/.../repo/.git`(不报错),
|
|
||||||
# 会让原版 `|| echo $PWD` 退路不触发、cd 误进 .git。
|
|
||||||
# 2. cd 到工作树后,GIT_DIR=. 不再指向 .git,下面 `git reset` 之类的
|
|
||||||
# 会报 `fatal: not a git repository: '.'`。
|
|
||||||
# 修正:拿绝对 git-dir,算出 worktree 根,并改用绝对 GIT_DIR。
|
|
||||||
GIT_DIR_ABS="$(git rev-parse --absolute-git-dir 2>/dev/null)"
|
GIT_DIR_ABS="$(git rev-parse --absolute-git-dir 2>/dev/null)"
|
||||||
if [ -n "$GIT_DIR_ABS" ] && [ -d "$GIT_DIR_ABS" ]; then
|
if [ -n "$GIT_DIR_ABS" ] && [ -d "$GIT_DIR_ABS" ]; then
|
||||||
REPO_TOPLEVEL="$(cd "$GIT_DIR_ABS/.." && pwd)"
|
REPO_TOPLEVEL="$(cd "$GIT_DIR_ABS/.." && pwd)"
|
||||||
@@ -24,29 +17,16 @@ unset GIT_WORK_TREE
|
|||||||
cd "$REPO_TOPLEVEL" || { echo "FATAL: cannot cd to $REPO_TOPLEVEL" >&2; exit 1; }
|
cd "$REPO_TOPLEVEL" || { echo "FATAL: cannot cd to $REPO_TOPLEVEL" >&2; exit 1; }
|
||||||
echo "=== REPO_TOPLEVEL=$REPO_TOPLEVEL (GIT_DIR=$GIT_DIR) ===" >&2
|
echo "=== REPO_TOPLEVEL=$REPO_TOPLEVEL (GIT_DIR=$GIT_DIR) ===" >&2
|
||||||
|
|
||||||
# ============================================================
|
|
||||||
# 0. sync_worktree —— 将工作树同步到新 push 的 HEAD
|
|
||||||
# 背景:服务器 .git/config 设了 receive.denyCurrentBranch=updateInstead 时
|
|
||||||
# git 自动更新工作树但会跳过此钩子;改为 false 后
|
|
||||||
# git 不会更新工作树,手动 reset --hard 同步才能让下面
|
|
||||||
# 的 build 用上新代码。
|
|
||||||
# ============================================================
|
|
||||||
sync_worktree() {
|
sync_worktree() {
|
||||||
echo "=== sync_worktree: git reset --hard HEAD @ $(date +%Y-%m-%dT%H:%M:%S%z) ==="
|
echo "=== sync_worktree: git reset --hard HEAD @ $(date +%Y-%m-%dT%H:%M:%S%z) ==="
|
||||||
git reset --hard HEAD
|
git reset --hard HEAD
|
||||||
}
|
}
|
||||||
|
|
||||||
# ============================================================
|
|
||||||
# 1. init_log_file —— 定义 LOG_FILE + 创建 logs/ 目录
|
|
||||||
# ============================================================
|
|
||||||
init_log_file() {
|
init_log_file() {
|
||||||
LOG_FILE="$REPO_TOPLEVEL/logs/post-receive.log"
|
LOG_FILE="$REPO_TOPLEVEL/logs/post-receive.log"
|
||||||
mkdir -p "$(dirname "$LOG_FILE")"
|
mkdir -p "$(dirname "$LOG_FILE")"
|
||||||
}
|
}
|
||||||
|
|
||||||
# ============================================================
|
|
||||||
# 2. write_metadata_header —— 覆盖写入元信息(首次写 → 覆盖让日志开头是这个)
|
|
||||||
# ============================================================
|
|
||||||
write_metadata_header() {
|
write_metadata_header() {
|
||||||
{
|
{
|
||||||
echo "=== post-receive @ $(date +%Y-%m-%dT%H:%M:%S%z) ==="
|
echo "=== post-receive @ $(date +%Y-%m-%dT%H:%M:%S%z) ==="
|
||||||
@@ -86,7 +66,29 @@ copy_env_by_branch() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
# 4. run_build —— 跑 `pnpm install` + `pnpm run build`,输出丢,捕获退出码写日志
|
# 4. select_port_by_branch —— 根据分支选择 next start 端口
|
||||||
|
# main 分支 → 9185
|
||||||
|
# test 分支 → 9135
|
||||||
|
# dev 分支 → 9135
|
||||||
|
# ============================================================
|
||||||
|
select_port_by_branch() {
|
||||||
|
case "$CURRENT_BRANCH" in
|
||||||
|
main)
|
||||||
|
START_PORT=9185
|
||||||
|
;;
|
||||||
|
test|dev)
|
||||||
|
START_PORT=9135
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
START_PORT=9135
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
export START_PORT
|
||||||
|
echo "=== start port: $START_PORT ===" >> "$LOG_FILE"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# 5. run_build —— 跑 `pnpm install` + `pnpm run build`,输出丢,捕获退出码写日志
|
||||||
# 返回:build 退出码(main 用 if ! run_build 决定是否继续)
|
# 返回:build 退出码(main 用 if ! run_build 决定是否继续)
|
||||||
# ============================================================
|
# ============================================================
|
||||||
run_build() {
|
run_build() {
|
||||||
@@ -99,38 +101,46 @@ run_build() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
# 5. stop_existing_next —— 两阶段 kill + 等 1s 确保端口完全释放
|
# 6. stop_existing_next —— 仅停止当前分支端口上的旧进程
|
||||||
# 1) 优雅关闭(SIGTERM)—— 旧进程自己 drain
|
# 1) 优雅关闭(SIGTERM)—— 旧进程自己 drain
|
||||||
# 2) 等 2s
|
# 2) 等 2s
|
||||||
# 3) 强杀(SIGKILL)—— 还在的话
|
# 3) 强杀(SIGKILL)—— 还在的话
|
||||||
# 4) 等 1s
|
# 4) 等 1s
|
||||||
# ============================================================
|
# ============================================================
|
||||||
stop_existing_next() {
|
stop_existing_next() {
|
||||||
echo "=== stop existing next @ $(date +%Y-%m-%dT%H:%M:%S%z) ===" >> "$LOG_FILE"
|
echo "=== stop existing next on port $START_PORT @ $(date +%Y-%m-%dT%H:%M:%S%z) ===" >> "$LOG_FILE"
|
||||||
pkill -f "next start" 2>/dev/null
|
PIDS=""
|
||||||
pkill -f "next-server" 2>/dev/null
|
if command -v lsof >/dev/null 2>&1; then
|
||||||
|
PIDS="$(lsof -ti tcp:"$START_PORT" 2>/dev/null || true)"
|
||||||
|
elif command -v fuser >/dev/null 2>&1; then
|
||||||
|
PIDS="$(fuser "$START_PORT"/tcp 2>/dev/null || true)"
|
||||||
|
else
|
||||||
|
pkill -f "next start.*$START_PORT" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$PIDS" ]; then
|
||||||
|
kill $PIDS 2>/dev/null || true
|
||||||
|
fi
|
||||||
sleep 2
|
sleep 2
|
||||||
pkill -9 -f "next start" 2>/dev/null
|
if [ -n "$PIDS" ]; then
|
||||||
pkill -9 -f "next-server" 2>/dev/null
|
kill -9 $PIDS 2>/dev/null || true
|
||||||
|
fi
|
||||||
sleep 1
|
sleep 1
|
||||||
echo "=== stop DONE @ $(date +%Y-%m-%dT%H:%M:%S%z) ===" >> "$LOG_FILE"
|
echo "=== stop DONE @ $(date +%Y-%m-%dT%H:%M:%S%z) ===" >> "$LOG_FILE"
|
||||||
echo "" >> "$LOG_FILE"
|
echo "" >> "$LOG_FILE"
|
||||||
}
|
}
|
||||||
|
|
||||||
# ============================================================
|
|
||||||
# 6. launch_next —— 后台启 `pnpm run start`,捕 PID
|
|
||||||
# ============================================================
|
|
||||||
launch_next() {
|
launch_next() {
|
||||||
# next stdout/stderr 接到 logs/next-server.log(覆盖模式,每次 deploy 重新开始)
|
# 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 +%Y-%m-%dT%H:%M:%S%z) ===" >> "$LOG_FILE"
|
echo "=== start LAUNCH port=$START_PORT @ $(date +%Y-%m-%dT%H:%M:%S%z) ===" >> "$LOG_FILE"
|
||||||
nohup pnpm run start > "$NEXT_LOG_FILE" 2>&1 &
|
PORT="$START_PORT" nohup pnpm run start > "$NEXT_LOG_FILE" 2>&1 &
|
||||||
START_PID=$!
|
START_PID=$!
|
||||||
echo "=== start PID=$START_PID @ $(date +%Y-%m-%dT%H:%M:%S%z) ===" >> "$LOG_FILE"
|
echo "=== start PID=$START_PID @ $(date +%Y-%m-%dT%H:%M:%S%z) ===" >> "$LOG_FILE"
|
||||||
}
|
}
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
# 7. log_abort —— build 失败时写结束标记(不输出 START LAUNCH)
|
# 8. log_abort —— build 失败时写结束标记(不输出 START LAUNCH)
|
||||||
# ============================================================
|
# ============================================================
|
||||||
log_abort() {
|
log_abort() {
|
||||||
echo "=== ABORTED @ $(date +%Y-%m-%dT%H:%M:%S%z) (build failed, start skipped) ===" >> "$LOG_FILE"
|
echo "=== ABORTED @ $(date +%Y-%m-%dT%H:%M:%S%z) (build failed, start skipped) ===" >> "$LOG_FILE"
|
||||||
@@ -144,6 +154,7 @@ main() {
|
|||||||
sync_worktree # 先同步工作树到新 HEAD(与 git config denyCurrentBranch 配合)
|
sync_worktree # 先同步工作树到新 HEAD(与 git config denyCurrentBranch 配合)
|
||||||
write_metadata_header # 先覆盖写元信息(这样 env copy 日志能保留在后面)
|
write_metadata_header # 先覆盖写元信息(这样 env copy 日志能保留在后面)
|
||||||
copy_env_by_branch # 追加 env copy 日志
|
copy_env_by_branch # 追加 env copy 日志
|
||||||
|
select_port_by_branch # 根据当前分支决定 next start 端口
|
||||||
|
|
||||||
if ! run_build; then
|
if ! run_build; then
|
||||||
log_abort
|
log_abort
|
||||||
|
|||||||
+3
-1
@@ -6,7 +6,9 @@
|
|||||||
"dev": "next dev",
|
"dev": "next dev",
|
||||||
"build": "next build",
|
"build": "next build",
|
||||||
"build:deploy": "pnpm install && pnpm run build",
|
"build:deploy": "pnpm install && pnpm run build",
|
||||||
"start": "next start -p 9135",
|
"start": "sh -c 'BRANCH=$(git branch --show-current); PORT=${PORT:-}; if [ -z \"$PORT\" ]; then if [ \"$BRANCH\" = \"main\" ]; then PORT=9185; else PORT=9135; fi; fi; next start -p \"$PORT\"'",
|
||||||
|
"start:test": "next start -p 9135",
|
||||||
|
"start:main": "next start -p 9185",
|
||||||
"build:start": "pnpm install && pnpm run build && pnpm run start",
|
"build:start": "pnpm install && pnpm run build && pnpm run start",
|
||||||
"lint": "eslint",
|
"lint": "eslint",
|
||||||
"lint:fix": "eslint --fix",
|
"lint:fix": "eslint --fix",
|
||||||
|
|||||||
Reference in New Issue
Block a user