将“切换目录、npm构建、tar打包、scp传输到服务器、服务器端解压、服务器端文件解压替换、服务器端服务重启”流程,整合成一个shell脚本
#!/bin/bash ### # @Description: 前端自动发布脚本 # @FilePath: publish.sh ### # 获取脚本所在目录 SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" # 获取脚本所在目录的上一级目录 PARENT_DIR="$(dirname "$SCRIPT_DIR")" # 本地 tar 文件名称 LOCAL_TAR_FILE="dist.tar" # 远程服务器信息 REMOTE_USER="root" # 远程服务器用户 REMOTE_HOST="" # 远程服务器 IP REMOTE_PORT="22" # 远程服务器 ssh 端口 REMOTE_PASSWORD="$1" # 远程服务器密码 REMOTE_DIR="/usr/frontend/" # 远程服务器文件传输目录
# todo 添加执行参数检查于确认
# 检查打包命令是否成功的函数 check_success() { if [ $? -ne 0 ]; then echo "错误: $1" exit 1 fi } # 检查 sshpass 是否存在 USE_SSHPASS=false if command -v sshpass > /dev/null 2>&1; then if [ -z "$REMOTE_PASSWORD" ]; then echo "警告: 检测到 sshpass,但未提供密码。将使用常规方式登录。" else USE_SSHPASS=true fi else echo "未检测到 sshpass,使用常规的密码提示方式。" fi # 开始打包 echo "开始打包..." npm run build > /dev/null 2>&1 check_success "前端打包失败" # 删除旧的 tar 文件 rm -f $LOCAL_TAR_FILE > /dev/null 2>&1 # 生成新的 tar 文件 tar -cvf $LOCAL_TAR_FILE dist > /dev/null 2>&1 check_success "打包 dist 目录失败" # 传输文件到服务器 echo "正在将文件传输到服务器..." if [ "$USE_SSHPASS" = true ]; then sshpass -p "$REMOTE_PASSWORD" scp -P $REMOTE_PORT $LOCAL_TAR_FILE $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR else scp -P $REMOTE_PORT $LOCAL_TAR_FILE $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR fi check_success "SCP 文件传输失败" # 定义在远程服务器上执行的脚本内容 REMOTE_SCRIPT=$(cat << EOF #!/bin/bash cd $REMOTE_DIR if [ ! -e "$LOCAL_TAR_FILE" ]; then echo "$LOCAL_TAR_FILE 不存在" exit 1 fi tar -xvf $LOCAL_TAR_FILE > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "错误: $LOCAL_TAR_FILE 解压失败" exit 1 fi rm -rf html mv dist html # docker restart frontend_web EOF ) # 登录服务器并执行脚本 echo "文件传输完成,正在登录服务器并执行脚本..." if [ "$USE_SSHPASS" = true ]; then sshpass -p "$REMOTE_PASSWORD" ssh -p "$REMOTE_PORT" "$REMOTE_USER@$REMOTE_HOST" "bash -s" <<EOF $REMOTE_SCRIPT EOF else ssh -p "$REMOTE_PORT" "$REMOTE_USER@$REMOTE_HOST" "bash -s" <<EOF $REMOTE_SCRIPT EOF fi check_success "远程脚本执行失败" cd - > /dev/null 2>&1 || exit echo "脚本执行完毕!"
命令行使用方式:
sh publish.sh ssh-password
标签:脚本,shell,REMOTE,sshpass,TAR,前端,echo,FILE,服务器 From: https://www.cnblogs.com/timseng/p/18491962