Files
web_hgdja_h5/deploy_prod.sh
T
2026-11-07 20:11:51 +07:00

50 lines
2.7 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# 生产部署:本地构建 Next.js standalone → tar.gz → scp → 远端 up_next_h5_prod.sh
# 目标:/server/web_hga/h5(参考 /server/web_hgcg 的发布流程)
set -Eeuo pipefail
DIR=$(cd "$(dirname "$0")" && pwd)
SSH_TARGET="${DEPLOY_SSH_TARGET:-root@172.104.166.87}"
REMOTE_DIR="${DEPLOY_REMOTE_DIR:-/server/web_hga/h5}"
PACKAGE_NAME="${DEPLOY_PACKAGE_NAME:-web_hga_h5.tar.gz}"
PROGRAM="${DEPLOY_PROGRAM:-web_hga_h5}"
REMOTE_SCRIPT="up_next_h5_prod.sh"
fail() { printf '错误:%s\n' "$*" >&2; exit 1; }
for tool in node npm tar shasum ssh scp; do command -v "$tool" >/dev/null || fail "缺少命令 $tool"; done
node -e 'const [a,b]=process.versions.node.split(".").map(Number);if(a<20||a===20&&b<9)process.exit(1)' || fail '需要 Node.js >=20.9'
[ -f "$DIR/deploy/$REMOTE_SCRIPT" ] || fail "缺少 deploy/$REMOTE_SCRIPT"
STAGE="$DIR/dist/.prod-stage"
rm -rf "$STAGE" "$DIR/dist/$PACKAGE_NAME" "$DIR/dist/$PACKAGE_NAME.sha256"
mkdir -p "$STAGE"
echo "[1/5] 构建 production..."
(cd "$DIR" && npm run build)
echo "[2/5] 打包 standalone(含 Linux x64/glibc 原生包)..."
(cd "$DIR" && npm run bundle)
(cd "$DIR" && npm run bundle:linux)
LINUX_DIST="$DIR/dist/production-linux-x64-glibc"
[ -d "$LINUX_DIST" ] || fail "构建产物 $LINUX_DIST 不存在"
echo "[3/5] 生成 tar.gz 和 SHA-256..."
# 从 dist/production-linux-x64-glibc/ 下进入打 tar,避免外层目录名出现在压缩包里;up_next_h5_prod.sh 预期入口在根(start.mjs 等)。
# -h 把 pnpm 的符号链接展开成真实文件(远端只接受普通文件和目录);--no-xattrs 去 macOS 扩展属性噪音;包含 Linux sharp 原生 .node,远端无需 npm ci。
# 属主归零:GNU tar 用 --owner/--group,macOS 自带 bsdtar 用 --uid/--gid。
if tar --version 2>/dev/null | grep -q 'GNU tar'; then OWNER_OPTS=(--owner=0 --group=0); else OWNER_OPTS=(--uid 0 --gid 0); fi
(cd "$LINUX_DIST" && tar -h --no-xattrs --exclude='.DS_Store' --exclude='*sharp-darwin-arm64*' --exclude='*sharp-libvips-darwin-arm64*' "${OWNER_OPTS[@]}" -czf "$STAGE/$PACKAGE_NAME" .)
(cd "$STAGE" && shasum -a 256 "$PACKAGE_NAME" > "$PACKAGE_NAME.sha256")
ls -lh "$STAGE/$PACKAGE_NAME" "$STAGE/$PACKAGE_NAME.sha256"
echo "[4/5] 上传到 $SSH_TARGET:$REMOTE_DIR ..."
# 先传服务器端脚本(可能更新了逻辑),再传压缩包和校验和。
ssh "$SSH_TARGET" "mkdir -p '$REMOTE_DIR'"
scp "$DIR/deploy/$REMOTE_SCRIPT" "$SSH_TARGET:$REMOTE_DIR/$REMOTE_SCRIPT"
scp "$STAGE/$PACKAGE_NAME" "$STAGE/$PACKAGE_NAME.sha256" "$SSH_TARGET:$REMOTE_DIR/"
echo "[5/5] 远端执行解包和热替换..."
ssh "$SSH_TARGET" "chmod +x $REMOTE_DIR/$REMOTE_SCRIPT && DEPLOY_PROGRAM=$PROGRAM DEPLOY_PACKAGE_NAME=$PACKAGE_NAME bash $REMOTE_DIR/$REMOTE_SCRIPT"
echo DEPLOY_OK