Files
happy-life-star/backend/dev-auto.sh
T

209 lines
5.8 KiB
Bash
Executable File

#!/bin/bash
# ============================================================================
# 情绪博物馆自动化开发脚本
# 自动编译、启动、监控文件变化并重启服务
# ============================================================================
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 配置
PROJECT_ROOT=$(pwd)
SERVICES=("emotion-gateway" "emotion-user" "emotion-ai" "emotion-record" "emotion-growth" "emotion-explore" "emotion-reward" "emotion-stats")
PID_FILE="$PROJECT_ROOT/.dev-pids"
LOG_DIR="$PROJECT_ROOT/dev-logs"
# 创建日志目录
mkdir -p "$LOG_DIR"
echo -e "${BLUE}===========================================${NC}"
echo -e "${BLUE}情绪博物馆自动化开发环境${NC}"
echo -e "${BLUE}===========================================${NC}"
# 清理函数
cleanup() {
echo -e "\n${YELLOW}正在停止所有服务...${NC}"
if [ -f "$PID_FILE" ]; then
while read line; do
if [ ! -z "$line" ]; then
echo "停止进程: $line"
kill -9 $line 2>/dev/null || true
fi
done < "$PID_FILE"
rm -f "$PID_FILE"
fi
# 清理Maven进程
pkill -f "mvn.*spring-boot:run" 2>/dev/null || true
echo -e "${GREEN}✅ 清理完成${NC}"
exit 0
}
# 捕获退出信号
trap cleanup SIGINT SIGTERM
# 编译项目
compile_project() {
echo -e "${YELLOW}🔄 编译项目...${NC}"
mvn clean compile -DskipTests -q
if [ $? -eq 0 ]; then
echo -e "${GREEN}✅ 编译成功${NC}"
return 0
else
echo -e "${RED}❌ 编译失败${NC}"
return 1
fi
}
# 启动单个服务
start_service() {
local service=$1
local port=$2
echo -e "${BLUE}🚀 启动 $service (端口: $port)...${NC}"
cd "$PROJECT_ROOT/$service"
# 启动服务并获取PID
nohup mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Dserver.port=$port" \
> "$LOG_DIR/$service.log" 2>&1 &
local pid=$!
echo "$pid" >> "$PID_FILE"
echo -e "${GREEN}$service 已启动 (PID: $pid)${NC}"
cd "$PROJECT_ROOT"
}
# 检查服务健康状态
check_service_health() {
local service=$1
local port=$2
local max_attempts=30
local attempt=0
echo -e "${YELLOW}⏳ 等待 $service 启动...${NC}"
while [ $attempt -lt $max_attempts ]; do
if curl -s "http://localhost:$port/actuator/health" > /dev/null 2>&1; then
echo -e "${GREEN}$service 健康检查通过${NC}"
return 0
fi
attempt=$((attempt + 1))
sleep 2
echo -n "."
done
echo -e "\n${RED}$service 健康检查失败${NC}"
return 1
}
# 监控文件变化
monitor_changes() {
echo -e "${BLUE}👀 开始监控文件变化...${NC}"
echo -e "${YELLOW}按 Ctrl+C 停止监控${NC}"
# 使用fswatch监控文件变化 (需要安装: brew install fswatch)
if command -v fswatch > /dev/null; then
fswatch -o -r --exclude="target" --exclude=".git" --exclude="node_modules" \
--include=".*\\.java$" --include=".*\\.yml$" --include=".*\\.xml$" \
"$PROJECT_ROOT" | while read f; do
echo -e "${YELLOW}🔄 检测到文件变化,重新编译...${NC}"
if compile_project; then
echo -e "${GREEN}📝 代码已更新,DevTools将自动重启服务${NC}"
fi
done
else
# 如果没有fswatch,使用简单的循环检查
echo -e "${YELLOW}⚠️ 建议安装 fswatch 以获得更好的文件监控体验:brew install fswatch${NC}"
while true; do
sleep 5
# 简单的时间戳检查(这里可以根据需要扩展)
echo -e "${BLUE}💓 服务运行中... ($(date))${NC}"
done
fi
}
# 显示服务状态
show_status() {
echo -e "${BLUE}===========================================${NC}"
echo -e "${BLUE}服务状态${NC}"
echo -e "${BLUE}===========================================${NC}"
local ports=(8080 8081 8082 8083 8084 8085 8086 8087)
local i=0
for service in "${SERVICES[@]}"; do
local port=${ports[$i]}
if curl -s "http://localhost:$port/actuator/health" > /dev/null 2>&1; then
echo -e "${GREEN}$service (端口: $port) - 运行中${NC}"
else
echo -e "${RED}$service (端口: $port) - 停止${NC}"
fi
i=$((i + 1))
done
echo -e "${BLUE}===========================================${NC}"
echo -e "${YELLOW}📋 日志文件位置: $LOG_DIR/${NC}"
echo -e "${YELLOW}🌐 API网关: http://localhost:9000${NC}"
echo -e "${YELLOW}📚 API文档: http://localhost:9000/doc.html${NC}"
echo -e "${BLUE}===========================================${NC}"
}
# 主函数
main() {
# 清理之前的进程
cleanup 2>/dev/null || true
# 编译项目
if ! compile_project; then
echo -e "${RED}❌ 编译失败,请检查代码错误${NC}"
exit 1
fi
# 启动服务
echo -e "${BLUE}🚀 启动所有微服务...${NC}"
local ports=(9000 9001 9002 9003 9004 9005 9006 9007)
local i=0
for service in "${SERVICES[@]}"; do
start_service "$service" "${ports[$i]}"
sleep 3 # 给服务一些启动时间
i=$((i + 1))
done
# 等待所有服务启动
sleep 10
# 显示状态
show_status
# 开始监控
monitor_changes
}
# 检查参数
case "${1:-}" in
"status")
show_status
;;
"stop")
cleanup
;;
"logs")
echo -e "${BLUE}📋 实时日志 (按 Ctrl+C 退出):${NC}"
tail -f "$LOG_DIR"/*.log
;;
*)
main
;;
esac