67 lines
2.2 KiB
Bash
Executable File
67 lines
2.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
set -e
|
||
|
||
# 部署脚本:打包并通过 SSH 将构建产物同步到远程目录
|
||
# 用法: ./deploy.sh <服务器IP> <SSH端口> <登录账户> <登录密码> [sudo]
|
||
# 示例: ./deploy.sh 192.168.1.100 22 root mypassword
|
||
# 若远程目录无写权限,加第5个参数 sudo:先传到 /tmp,再通过 sudo 拷到目标(会用到同一密码作为 sudo 密码)
|
||
# 示例: ./deploy.sh 192.168.1.100 22 myuser mypassword sudo
|
||
|
||
if [ $# -lt 4 ]; then
|
||
echo "用法: $0 <服务器IP> <SSH端口> <登录账户> <登录密码> [sudo]"
|
||
echo "示例: $0 192.168.1.100 22 root mypassword"
|
||
echo "远程目录无写权限时加第5参数: $0 <IP> <端口> <用户> <密码> sudo"
|
||
exit 1
|
||
fi
|
||
|
||
HOST="$1"
|
||
PORT="$2"
|
||
USER="$3"
|
||
PASSWORD="$4"
|
||
USE_SUDO="${5:-}"
|
||
REMOTE_DIR="/root/caddy/site/tool"
|
||
REMOTE_TMP="/tmp/tool_deploy_$$"
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
DIST_DIR="${SCRIPT_DIR}/dist"
|
||
SSH_OPTS="-p ${PORT} -o StrictHostKeyChecking=accept-new -T"
|
||
|
||
echo ">>> 正在打包..."
|
||
cd "$SCRIPT_DIR"
|
||
npm run build
|
||
|
||
if [ ! -d "$DIST_DIR" ]; then
|
||
echo "错误: 构建产物目录 dist 不存在"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查 sshpass 是否可用(用于非交互式传入密码)
|
||
if ! command -v sshpass &> /dev/null; then
|
||
echo "未找到 sshpass,请先安装:"
|
||
echo " macOS: brew install sshpass"
|
||
echo " Ubuntu: sudo apt-get install sshpass"
|
||
exit 1
|
||
fi
|
||
|
||
export SSHPASS="$PASSWORD"
|
||
|
||
if [ "$USE_SUDO" = "sudo" ]; then
|
||
echo ">>> 正在同步到远程临时目录 ${REMOTE_TMP}"
|
||
sshpass -e rsync -avz --delete \
|
||
-e "ssh ${SSH_OPTS}" \
|
||
"${DIST_DIR}/" \
|
||
"${USER}@${HOST}:${REMOTE_TMP}/"
|
||
echo ">>> 正在用 sudo 拷贝到目标目录 ${REMOTE_DIR}"
|
||
# 只执行一次 sudo(读一次密码),在子 shell 里完成 rsync 与清理,避免第二次 sudo 无密码
|
||
printf '%s\n' "$PASSWORD" | sshpass -e ssh ${SSH_OPTS} "${USER}@${HOST}" \
|
||
"sudo -S sh -c 'rsync -avz --delete ${REMOTE_TMP}/ ${REMOTE_DIR}/ && rm -rf ${REMOTE_TMP}'"
|
||
else
|
||
echo ">>> 正在通过 SSH 同步到 ${USER}@${HOST}:${PORT} -> ${REMOTE_DIR}"
|
||
sshpass -e rsync -avz --delete \
|
||
-e "ssh ${SSH_OPTS}" \
|
||
"${DIST_DIR}/" \
|
||
"${USER}@${HOST}:${REMOTE_DIR}/"
|
||
fi
|
||
|
||
unset SSHPASS
|
||
echo ">>> 部署完成"
|