209 lines
5.8 KiB
Bash
Executable File
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 |