161 lines
4.5 KiB
Bash
Executable File
161 lines
4.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
|
||
################################################################################
|
||
#
|
||
# Copyright (c) 2017-2024
|
||
# Qubit Technology Inc. (https://www.qubit.ltd)
|
||
# All rights reserved.
|
||
#
|
||
# This script will publish the frontend project to the remote server.
|
||
#
|
||
# Author: Haixing Hu
|
||
# Date: 2024-12-08
|
||
#
|
||
################################################################################
|
||
|
||
# 打印使用说明
|
||
print_usage() {
|
||
echo "使用方法:$0 配置文件路径"
|
||
echo "配置文件格式:"
|
||
echo " # 注释行"
|
||
echo " PROPERTY_NAME = PROPERTY_VALUE"
|
||
echo "必填属性:"
|
||
echo " PROJECT_ENV: 项目编译环境"
|
||
echo " PROJECT_NAME: 项目名称"
|
||
echo " REMOTE_SERVER: 远程服务器地址"
|
||
echo " REMOTE_PORT: 远程服务器端口"
|
||
echo " REMOTE_USER: 远程服务器账号名"
|
||
echo " REMOTE_PASSWORD: 远程服务器账号密码(可选)"
|
||
echo " REMOTE_NGINX_HTML_PATH: 远程服务器nginx html发布目录"
|
||
}
|
||
|
||
# 参数校验
|
||
if [ $# -ne 1 ]; then
|
||
echo "错误:未提供配置文件路径!"
|
||
print_usage
|
||
exit 1
|
||
fi
|
||
|
||
CONFIG_FILE="$1"
|
||
|
||
# 检查配置文件是否存在
|
||
if [ ! -f "$CONFIG_FILE" ]; then
|
||
echo "错误:配置文件不存在:$CONFIG_FILE"
|
||
exit 1
|
||
fi
|
||
|
||
# 读取配置文件
|
||
declare -A CONFIG
|
||
while IFS='=' read -r key value; do
|
||
key=$(echo "$key" | xargs) # 去除前后空格
|
||
value=$(echo "$value" | xargs)
|
||
[[ "$key" =~ ^#.*$ || -z "$key" ]] && continue # 跳过注释或空行
|
||
CONFIG["$key"]="$value"
|
||
done < "$CONFIG_FILE"
|
||
|
||
# 检查必填配置项
|
||
REQUIRED_KEYS=("PROJECT_ENV" "PROJECT_NAME" "REMOTE_SERVER" "REMOTE_PORT" "REMOTE_USER" "REMOTE_NGINX_HTML_PATH")
|
||
for key in "${REQUIRED_KEYS[@]}"; do
|
||
if [ -z "${CONFIG[$key]}" ]; then
|
||
echo "错误:缺少必填配置项:$key"
|
||
exit 1
|
||
fi
|
||
done
|
||
|
||
# 读取配置
|
||
PROJECT_ENV="${CONFIG["PROJECT_ENV"]}"
|
||
PROJECT_NAME="${CONFIG["PROJECT_NAME"]}"
|
||
REMOTE_SERVER="${CONFIG["REMOTE_SERVER"]}"
|
||
REMOTE_PORT="${CONFIG["REMOTE_PORT"]}"
|
||
REMOTE_USER="${CONFIG["REMOTE_USER"]}"
|
||
REMOTE_PASSWORD="${CONFIG["REMOTE_PASSWORD"]}"
|
||
REMOTE_NGINX_HTML_PATH="${CONFIG["REMOTE_NGINX_HTML_PATH"]}"
|
||
|
||
# 提示发布
|
||
read -p "确定要发布项目 ${PROJECT_NAME} 到 ${PROJECT_ENV} 环境吗?(yes/no): " CONFIRM
|
||
CONFIRM=$(echo "$CONFIRM" | tr '[:upper:]' '[:lower:]') # 将用户输入转换为小写
|
||
if [[ "$CONFIRM" != "y" && "$CONFIRM" != "yes" ]]; then
|
||
echo "发布已取消。"
|
||
exit 0
|
||
fi
|
||
|
||
# 检查 package.json 中的 build 脚本
|
||
echo "正在检查 package.json ..."
|
||
if [ ! -f "package.json" ]; then
|
||
echo "错误:当前目录下未找到 package.json 文件!"
|
||
exit 1
|
||
fi
|
||
|
||
BUILD_SCRIPT="build:${PROJECT_ENV}"
|
||
if [[ "$PROJECT_ENV" == "prod" ]]; then
|
||
BUILD_SCRIPT="build"
|
||
if ! grep -q "\"build\"" package.json; then
|
||
BUILD_SCRIPT="build:prod"
|
||
fi
|
||
fi
|
||
|
||
if ! grep -q "\"$BUILD_SCRIPT\"" package.json; then
|
||
echo "错误:未在 package.json 中找到 $BUILD_SCRIPT 脚本!"
|
||
exit 1
|
||
fi
|
||
|
||
# 编译项目
|
||
echo "正在安装依赖..."
|
||
yarn install
|
||
if [ $? -ne 0 ]; then
|
||
echo "安装依赖失败,发布终止!"
|
||
exit 1
|
||
fi
|
||
|
||
echo "正在编译项目(使用脚本:${BUILD_SCRIPT})..."
|
||
yarn "$BUILD_SCRIPT"
|
||
if [ $? -ne 0 ]; then
|
||
echo "编译失败,发布终止!"
|
||
exit 1
|
||
fi
|
||
|
||
# 获取当前时间戳
|
||
TIMESTAMP=$(date +%Y%m%d%H%M%S)
|
||
|
||
# 远程操作
|
||
echo "正在发布到远程服务器 $REMOTE_SERVER ..."
|
||
|
||
# 创建远程备份目录并重命名现有目录
|
||
BACKUP_DIR="${REMOTE_NGINX_HTML_PATH}/${PROJECT_NAME}_${TIMESTAMP}"
|
||
ssh -p "$REMOTE_PORT" "$REMOTE_USER@$REMOTE_SERVER" <<EOF
|
||
if [ -d "${REMOTE_NGINX_HTML_PATH}/${PROJECT_NAME}" ]; then
|
||
mv "${REMOTE_NGINX_HTML_PATH}/${PROJECT_NAME}" "$BACKUP_DIR"
|
||
fi
|
||
EOF
|
||
|
||
if [ $? -ne 0 ]; then
|
||
echo "远程目录重命名失败,发布终止!"
|
||
exit 1
|
||
fi
|
||
|
||
# 上传编译后的代码
|
||
echo "正在上传文件..."
|
||
scp -P "$REMOTE_PORT" -r dist/* "$REMOTE_USER@$REMOTE_SERVER:${REMOTE_NGINX_HTML_PATH}/${PROJECT_NAME}/"
|
||
|
||
if [ $? -ne 0 ]; then
|
||
echo "文件上传失败,发布终止!"
|
||
exit 1
|
||
fi
|
||
|
||
# 设置远程目录及文件的权限
|
||
echo "正在设置远程目录和文件权限..."
|
||
ssh -p "$REMOTE_PORT" "$REMOTE_USER@$REMOTE_SERVER" <<EOF
|
||
# 确保目标目录存在并设置权限
|
||
if [ -d "${REMOTE_NGINX_HTML_PATH}/${PROJECT_NAME}" ]; then
|
||
chmod -R 755 "${REMOTE_NGINX_HTML_PATH}/${PROJECT_NAME}"
|
||
fi
|
||
EOF
|
||
|
||
if [ $? -ne 0 ]; then
|
||
echo "设置远程权限失败,发布终止!"
|
||
exit 1
|
||
fi
|
||
|
||
# 发布成功
|
||
echo "发布成功!"
|