Files
2026-11-07 20:20:51 +07:00

55 lines
2.5 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
# 目标:/server/web_hgb/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_hgb/h5}"
PACKAGE_NAME="${DEPLOY_PACKAGE_NAME:-web_hgb_h5.tar.gz}"
PROGRAM="${DEPLOY_PROGRAM:-web_hgb_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..."
# 属主统一为 root:GNU tar 用 --owner/--group,macOS 自带 bsdtar 用 --uid/--gid。
if tar --version 2>/dev/null | grep -q 'GNU tar'; then
TAR_OWNER_FLAGS=(--owner=0 --group=0)
else
TAR_OWNER_FLAGS=(--uid 0 --gid 0)
fi
(cd "$LINUX_DIST" && COPYFILE_DISABLE=1 COPY_EXTENDED_ATTRIBUTES_DISABLE=1 tar --no-xattrs "${TAR_OWNER_FLAGS[@]}" \
--exclude='.DS_Store' --exclude='._*' \
--exclude='node_modules/@img/sharp-darwin-arm64' --exclude='node_modules/@img/sharp-libvips-darwin-arm64' \
-czf "$STAGE/$PACKAGE_NAME" .)
tar -tzf "$STAGE/$PACKAGE_NAME" >/dev/null || fail "压缩包校验失败"
(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