#!/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" <