47 lines
2.6 KiB
Bash
Executable File
47 lines
2.6 KiB
Bash
Executable File
#!/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
|