look.sh 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #!/usr/bin/env bash
  2. # /look —— 一键:验证 → 构建 → 推 feature(源码)+ deploy(产物)→ 服务器拉取 → 上线
  3. # 用法:bash infra/look.sh ["提交说明"]
  4. set -euo pipefail
  5. cd "$(dirname "$0")/.."
  6. MSG="${1:-chore: update}"
  7. SERVER="bigdata@100.64.0.62"
  8. SERVER_DIR="\$HOME/hs-data" # 服务器上 deploy 分支的 clone
  9. URL="http://100.64.0.62:8080/"
  10. echo "==> 1/5 验证 + 构建(real API:VITE_USE_MOCK=false)"
  11. corepack pnpm@10 --filter @hs-data/web test
  12. # 线上由服务器 uvicorn 同源托管 /api(真实 PG),构建关掉 mock。
  13. VITE_USE_MOCK=false corepack pnpm@10 --filter @hs-data/web build
  14. echo "==> 2/5 源码 → 当前分支"
  15. BR="$(git branch --show-current)"
  16. [ "$BR" = "feature" ] || echo " ⚠️ 当前分支是 '$BR'(预期 feature),仍推到它以保持源码/部署同步"
  17. git add -A
  18. git diff --cached --quiet || git commit -q -m "$MSG"
  19. git push -q origin "$BR"
  20. echo "==> 3/5 产物 → deploy 分支(worktree 快进推送,无 force)"
  21. git fetch -q origin deploy
  22. WT="../hs-deploy-tmp"
  23. git worktree remove -f "$WT" 2>/dev/null || true
  24. git worktree add -f "$WT" origin/deploy >/dev/null
  25. find "$WT" -mindepth 1 -maxdepth 1 ! -name .git -exec rm -rf {} +
  26. cp -r apps/web/dist/. "$WT"/
  27. (
  28. cd "$WT"
  29. git add -A
  30. git diff --cached --quiet || git commit -q -m "deploy: $MSG"
  31. git push -q origin HEAD:deploy
  32. )
  33. git worktree remove -f "$WT"
  34. echo "==> 4/5 服务器拉取(git pull,非 scp)+ 后端按需重启"
  35. # 前端产物:uvicorn 以 STATIC_DIR 实时读盘,纯前端改动无需重启(不抖)。
  36. # 后端源码(~/hs-api):仅当 HEAD 变化才重启 uvicorn(新依赖需手动 pip,少见)。
  37. ssh -o BatchMode=yes "$SERVER" '
  38. cd $HOME/hs-data && GIT_TERMINAL_PROMPT=0 git pull -q
  39. cd $HOME/hs-api && before=$(git rev-parse HEAD) && GIT_TERMINAL_PROMPT=0 git pull -q && after=$(git rev-parse HEAD)
  40. # 仅当 apps/api 真的变了才重启(纯前端改动 uvicorn 实时读盘,不动它=不抖、不掉)。
  41. if git diff --name-only "$before" "$after" | grep -q "^apps/api/"; then
  42. echo "后端代码有更新 → 重启 uvicorn"
  43. pkill -9 -f "uvicorn app.main:app" 2>/dev/null || true
  44. for i in $(seq 1 20); do ss -ltn 2>/dev/null | grep -q :8080 || break; sleep 0.5; done
  45. cd $HOME/hs-api/apps/api
  46. STATIC_DIR=$HOME/hs-data setsid nohup $HOME/miniconda3/bin/python -m uvicorn app.main:app \
  47. --host 0.0.0.0 --port 8080 >$HOME/hs-api.log 2>&1 </dev/null &
  48. sleep 3 # 让 setsid 在 ssh 关闭前完成 fork/exec,进程随后脱离会话存活
  49. else
  50. bash $HOME/serve-hs-api.sh # 未在跑则冷启动拉起;在跑则幂等退出
  51. fi
  52. echo pulled-ok
  53. '
  54. echo "==> 5/5 完成 → $URL"