llm-survey/frontend/deploy-frontend.sh
2025-02-23 18:18:56 +08:00

161 lines
4.5 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 "发布成功!"