#!/bin/bash # ======================================== # Docker 迁移功能自动测试脚本 # ======================================== set -e # 遇到错误立即退出 echo "🚀 开始Docker迁移功能自动测试..." echo "==================================================" # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 错误计数 ERROR_COUNT=0 # 记录错误函数 record_error() { echo -e "${RED}❌ 错误: $1${NC}" ERROR_COUNT=$((ERROR_COUNT + 1)) } # 记录成功函数 record_success() { echo -e "${GREEN}✅ 成功: $1${NC}" } # 记录警告函数 record_warning() { echo -e "${YELLOW}⚠️ 警告: $1${NC}" } # 记录信息函数 record_info() { echo -e "${BLUE}ℹ️ 信息: $1${NC}" } ############################################################ # 使用脚本所在目录的 docker-compose.yml ############################################################ SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) export COMPOSE_FILE="$SCRIPT_DIR/docker-compose.yml" record_info "使用的 Compose 文件: $COMPOSE_FILE" # 清理旧容器与孤儿,确保干净环境 record_info "清理旧容器与孤儿..." docker-compose down -v --remove-orphans >/dev/null 2>&1 || true record_success "环境清理完成" echo "📋 测试阶段1: 环境准备" echo "==================================================" # 检查Docker是否运行 if ! docker info > /dev/null 2>&1; then record_error "Docker未运行,请启动Docker" exit 1 fi record_success "Docker运行正常" # 检查Docker Compose是否可用 if ! docker-compose --version > /dev/null 2>&1; then record_error "Docker Compose不可用" exit 1 fi record_success "Docker Compose可用" # 停止并清理现有容器 record_info "清理现有容器..." docker-compose down -v --remove-orphans > /dev/null 2>&1 || true record_success "现有容器已清理" echo "" echo "📋 测试阶段2: 迁移工具测试" echo "==================================================" # 测试迁移工具 record_info "测试迁移工具..." cd "$SCRIPT_DIR/../../tools" # 测试PHP文件发现工具 if node -e "const PHPFileDiscovery = require('./php-file-discovery.js'); const discovery = new PHPFileDiscovery(); discovery.run(); console.log('PHP文件发现工具测试通过');" 2>/dev/null; then record_success "PHP文件发现工具正常" else record_error "PHP文件发现工具失败" fi # 测试业务逻辑转换器 if node -e "const BusinessLogicConverter = require('./generators/business-logic-converter.js'); const converter = new BusinessLogicConverter(); console.log('业务逻辑转换器测试通过');" 2>/dev/null; then record_success "业务逻辑转换器正常" else record_error "业务逻辑转换器失败" fi # 测试控制器生成器 if node -e "const ControllerGenerator = require('./generators/controller-generator.js'); const generator = new ControllerGenerator(); console.log('控制器生成器测试通过');" 2>/dev/null; then record_success "控制器生成器正常" else record_error "控制器生成器失败" fi # 测试服务生成器 if node -e "const ServiceGenerator = require('./generators/service-generator.js'); const generator = new ServiceGenerator(); console.log('服务生成器测试通过');" 2>/dev/null; then record_success "服务生成器正常" else record_error "服务生成器失败" fi # 测试实体生成器 if node -e "const EntityGenerator = require('./generators/entity-generator.js'); const generator = new EntityGenerator(); console.log('实体生成器测试通过');" 2>/dev/null; then record_success "实体生成器正常" else record_error "实体生成器失败" fi # 测试迁移协调器 if node -e "const MigrationCoordinator = require('./migration-coordinator.js'); const coordinator = new MigrationCoordinator(); console.log('迁移协调器测试通过');" 2>/dev/null; then record_success "迁移协调器正常" else record_error "迁移协调器失败" fi cd "$SCRIPT_DIR/../.." echo "" echo "📋 测试阶段3: 构建Docker镜像" echo "==================================================" # 构建NestJS后端镜像 record_info "构建NestJS后端镜像..." if docker-compose build nestjs-backend; then record_success "NestJS后端镜像构建成功" else record_error "NestJS后端镜像构建失败" fi # 构建Admin前端镜像 record_info "构建Admin前端镜像..." if docker-compose build admin-frontend; then record_success "Admin前端镜像构建成功" else record_error "Admin前端镜像构建失败" fi echo "" echo "📋 测试阶段4: 启动服务" echo "==================================================" # 启动基础服务(MySQL和Redis) record_info "启动MySQL和Redis服务..." if docker-compose up -d mysql redis; then record_success "MySQL和Redis服务启动成功" else record_error "MySQL和Redis服务启动失败" fi # 等待数据库就绪 record_info "等待数据库就绪..." sleep 30 # 检查MySQL健康状态 if docker-compose exec -T mysql mysqladmin ping -h localhost -u root -proot123456 > /dev/null 2>&1; then record_success "MySQL数据库连接正常" else record_error "MySQL数据库连接失败" fi # 检查Redis健康状态 if docker-compose exec -T redis redis-cli -a redis123456 ping > /dev/null 2>&1; then record_success "Redis缓存连接正常" else record_error "Redis缓存连接失败" fi echo "" echo "📋 测试阶段5: 启动NestJS后端" echo "==================================================" # 启动NestJS后端 record_info "启动NestJS后端服务..." if docker-compose up -d nestjs-backend; then record_success "NestJS后端服务启动成功" else record_error "NestJS后端服务启动失败" fi # 等待NestJS服务就绪 record_info "等待NestJS服务就绪..." sleep 60 # 检查NestJS健康状态 if curl -f http://localhost:3000/health > /dev/null 2>&1; then record_success "NestJS后端健康检查通过" else record_error "NestJS后端健康检查失败" # 显示NestJS日志 record_info "NestJS服务日志:" docker-compose logs nestjs-backend --tail=50 fi echo "" echo "📋 测试阶段6: 启动Admin前端" echo "==================================================" # 启动Admin前端 record_info "启动Admin前端服务..." if docker-compose up -d admin-frontend; then record_success "Admin前端服务启动成功" else record_error "Admin前端服务启动失败" fi # 等待Admin前端就绪 record_info "等待Admin前端就绪..." sleep 30 # 检查Admin前端健康状态 if curl -f http://localhost/ > /dev/null 2>&1; then record_success "Admin前端健康检查通过" else record_error "Admin前端健康检查失败" # 显示Admin前端日志 record_info "Admin前端服务日志:" docker-compose logs admin-frontend --tail=50 fi echo "" echo "📋 测试阶段7: API接口测试" echo "==================================================" # 测试关键API接口 record_info "测试关键API接口..." # 测试健康检查接口 if curl -f http://localhost:3000/health > /dev/null 2>&1; then record_success "健康检查接口正常" else record_error "健康检查接口失败" fi # 测试API根路径 if curl -f http://localhost:3000/api > /dev/null 2>&1; then record_success "API根路径正常" else record_warning "API根路径可能未配置" fi # 测试Admin API路径 if curl -f http://localhost:3000/adminapi > /dev/null 2>&1; then record_success "Admin API路径正常" else record_warning "Admin API路径可能未配置" fi echo "" echo "📋 测试阶段8: 数据库连接测试" echo "==================================================" # 测试数据库连接 record_info "测试数据库连接..." if docker-compose exec -T nestjs-backend node -e " const mysql = require('mysql2/promise'); async function test() { try { const connection = await mysql.createConnection({ host: 'mysql', user: 'wwjcloud', password: 'wwjcloud123', database: 'wwjcloud' }); await connection.execute('SELECT 1'); await connection.end(); console.log('数据库连接测试成功'); } catch (error) { console.error('数据库连接测试失败:', error.message); process.exit(1); } } test(); " 2>/dev/null; then record_success "数据库连接测试通过" else record_error "数据库连接测试失败" fi echo "" echo "📋 测试阶段9: 服务状态检查" echo "==================================================" # 检查所有服务状态 record_info "检查所有服务状态..." docker-compose ps echo "" echo "📋 测试阶段10: 日志检查" echo "==================================================" # 检查NestJS日志中的错误 record_info "检查NestJS服务日志..." NESTJS_ERRORS=$(docker-compose logs nestjs-backend 2>&1 | grep -i "error\|exception\|failed" | wc -l) if [ "$NESTJS_ERRORS" -eq 0 ]; then record_success "NestJS服务无错误日志" else record_warning "NestJS服务发现 $NESTJS_ERRORS 个错误日志" docker-compose logs nestjs-backend 2>&1 | grep -i "error\|exception\|failed" | head -10 fi # 检查Admin前端日志中的错误 record_info "检查Admin前端日志..." ADMIN_ERRORS=$(docker-compose logs admin-frontend 2>&1 | grep -i "error\|exception\|failed" | wc -l) if [ "$ADMIN_ERRORS" -eq 0 ]; then record_success "Admin前端无错误日志" else record_warning "Admin前端发现 $ADMIN_ERRORS 个错误日志" docker-compose logs admin-frontend 2>&1 | grep -i "error\|exception\|failed" | head -10 fi echo "" echo "📊 测试结果汇总" echo "==================================================" if [ $ERROR_COUNT -eq 0 ]; then echo -e "${GREEN}🎉 所有测试通过!迁移功能完全正常!${NC}" echo -e "${GREEN}✅ 错误数量: 0${NC}" echo -e "${GREEN}✅ 迁移工具: 正常${NC}" echo -e "${GREEN}✅ Docker构建: 成功${NC}" echo -e "${GREEN}✅ 服务启动: 成功${NC}" echo -e "${GREEN}✅ API接口: 正常${NC}" echo -e "${GREEN}✅ 数据库连接: 正常${NC}" else echo -e "${RED}❌ 测试发现问题!${NC}" echo -e "${RED}❌ 错误数量: $ERROR_COUNT${NC}" echo -e "${YELLOW}⚠️ 请检查上述错误信息并修复${NC}" fi echo "" echo "📋 服务访问信息" echo "==================================================" echo -e "${BLUE}🌐 Admin前端: http://localhost${NC}" echo -e "${BLUE}🔧 NestJS后端: http://localhost:3000${NC}" echo -e "${BLUE}💾 MySQL数据库: localhost:3306${NC}" echo -e "${BLUE}🗄️ Redis缓存: localhost:6379${NC}" echo "" echo "📋 清理命令" echo "==================================================" echo -e "${YELLOW}停止所有服务: docker-compose down${NC}" echo -e "${YELLOW}停止并清理数据: docker-compose down -v${NC}" echo -e "${YELLOW}查看服务日志: docker-compose logs [service-name]${NC}" # 如果测试失败,退出码为1 if [ $ERROR_COUNT -gt 0 ]; then exit 1 fi echo "" echo -e "${GREEN}🎊 Docker迁移功能自动测试完成!${NC}"