Files
2026-10-27 21:45:47 +07:00

47 lines
2.6 KiB
Bash
Executable File
Raw Permalink 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
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_hgcg/h5}"
PACKAGE_NAME="${DEPLOY_PACKAGE_NAME:-web_hgcg_h5.tar.gz}"
PROGRAM="${DEPLOY_PROGRAM:-web_hgcg_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..."
(cd "$DIR" && npm run bundle)
[ -d "$DIR/dist/production" ] || fail '构建产物 dist/production 不存在'
echo "[3/5] 生成 tar.gz 和 SHA-256..."
# 从 dist/production/ 下进入打 tar,避免外层目录名出现在压缩包里;up_next_h5_prod.sh 预期入口在根(start.mjs 等)。
# node_modules 不打进包,远端 npm ci --omit=dev 自己装 Linux 原生依赖;--no-xattrs 去 macOS 扩展属性噪音。
# 属主统一为 root:GNU tar 用 --owner/--group,macOS 自带的 bsdtar 用 --uid/--gid/--uname/--gname;COPYFILE_DISABLE 防止打入 ._* 文件。
if tar --version 2>/dev/null | grep -q 'GNU tar'; then OWNER_FLAGS='--owner=0 --group=0'; else OWNER_FLAGS='--uid 0 --gid 0 --uname root --gname root'; fi
# shellcheck disable=SC2086 # OWNER_FLAGS 需要按空格拆成多个参数
(cd "$DIR/dist/production" && COPYFILE_DISABLE=1 tar --no-xattrs --exclude='./node_modules' --exclude='.DS_Store' $OWNER_FLAGS -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 ..."
# 先传服务器端脚本(可能更新了逻辑),再传压缩包和校验和。
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