| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- #!/bin/bash
-
- # ETL数据管道启动脚本
- # 支持开发和生产环境
-
- set -e
-
- # 环境配置
- APP_NAME="etl-pipeline"
- SPRING_PROFILES_ACTIVE="dev"
- MEMORY_OPTS="-Xmx1g -Xms512m"
-
- # 颜色输出
- RED='\033[0;31m'
- GREEN='\033[0;32m'
- YELLOW='\033[1;33m'
- NC='\033[0m' # No Color
-
- # 日志函数
- log_info() {
- echo -e "${GREEN}[INFO]${NC} $1"
- }
-
- log_warn() {
- echo -e "${YELLOW}[WARN]${NC} $1"
- }
-
- log_error() {
- echo -e "${RED}[ERROR]${NC} $1"
- }
-
- # 检查Java环境
- check_java() {
- if ! command -v java &> /dev/null; then
- log_error "Java not found. Please install Java 11 or higher."
- exit 1
- fi
-
- JAVA_VERSION=$(java -version 2>&1 | head -n1 | cut -d'"' -f2 | cut -d'.' -f1)
- if [ "$JAVA_VERSION" -lt 11 ]; then
- log_error "Java version 11 or higher required. Current: $JAVA_VERSION"
- exit 1
- fi
-
- log_info "Java version: $(java -version 2>&1 | head -n1)"
- }
-
- # 检查数据库连接
- check_database() {
- log_info "Checking database connection..."
-
- # 检查MySQL连接
- if ! mysql -h localhost -u root -pwater123 -e "SELECT 1;" &> /dev/null; then
- log_warn "MySQL connection failed. Please check MySQL service and configuration."
- log_warn "Attempting to start Docker Compose services..."
-
- # 启动Docker服务
- if [ -f "docker-compose.yml" ]; then
- docker-compose up -d
- sleep 10
-
- # 等待MySQL启动
- log_info "Waiting for MySQL to start..."
- for i in {1..30}; do
- if mysql -h localhost -u root -pwater123 -e "SELECT 1;" &> /dev/null; then
- log_info "MySQL connection established."
- return 0
- fi
- sleep 2
- done
-
- log_error "MySQL failed to start within expected time."
- exit 1
- else
- log_error "docker-compose.yml not found. Please create Docker Compose configuration."
- exit 1
- fi
- fi
-
- log_info "Database connection OK."
- }
-
- # 检查Kafka连接
- check_kafka() {
- log_info "Checking Kafka connection..."
-
- # 检查Kafka是否运行在Docker中
- if docker-compose ps kafka 2>/dev/null | grep -q "Up"; then
- log_info "Kafka is running in Docker."
- return 0
- fi
-
- log_warn "Kafka connection check skipped - Docker Compose not available."
- }
-
- # 创建日志目录
- create_logs_dir() {
- if [ ! -d "logs" ]; then
- mkdir -p logs
- log_info "Created logs directory."
- fi
- }
-
- # 编译项目
- build_project() {
- log_info "Building project..."
-
- if [ -f "pom.xml" ]; then
- mvn clean package -DskipTests
- if [ $? -ne 0 ]; then
- log_error "Maven build failed."
- exit 1
- fi
- JAR_FILE="target/etl-pipeline-1.0.0-SNAPSHOT.jar"
- elif [ -f "build.gradle" ]; then
- ./gradlew build
- if [ $? -ne 0 ]; then
- log_error "Gradle build failed."
- exit 1
- fi
- JAR_FILE="build/libs/etl-pipeline-1.0.0-SNAPSHOT.jar"
- else
- log_error "No build system found (pom.xml or build.gradle)."
- exit 1
- fi
-
- log_info "Build completed successfully."
- }
-
- # 启动应用
- start_application() {
- log_info "Starting $APP_NAME..."
-
- if [ -f "$JAR_FILE" ]; then
- java $MEMORY_OPTS -jar $JAR_FILE --spring.profiles.active=$SPRING_PROFILES_ACTIVE &
- APP_PID=$!
- echo $APP_PID > .app.pid
- log_info "$APP_NAME started with PID: $APP_PID"
- log_info "Access: http://localhost:8080"
- log_info "Logs: ./logs/etl-application.log"
- else
- log_error "Application JAR not found: $JAR_FILE"
- exit 1
- fi
- }
-
- # 停止应用
- stop_application() {
- if [ -f ".app.pid" ]; then
- APP_PID=$(cat .app.pid)
- if kill -0 $APP_PID 2>/dev/null; then
- log_info "Stopping $APP_NAME (PID: $APP_PID)..."
- kill $APP_PID
- rm .app.pid
- log_info "$APP_NAME stopped."
- else
- log_warn "$APP_NAME is not running."
- fi
- else
- log_warn "$APP_PID file not found."
- fi
- }
-
- # 查看应用状态
- status_application() {
- if [ -f ".app.pid" ]; then
- APP_PID=$(cat .app.pid)
- if kill -0 $APP_PID 2>/dev/null; then
- log_info "$APP_NAME is running with PID: $APP_PID"
- curl -s http://localhost:8080/actuator/health | jq '.' 2>/dev/null || log_info "Health check endpoint not available."
- else
- log_info "$APP_NAME is not running."
- fi
- else
- log_info "$APP_PID file not found."
- fi
- }
-
- # 查看日志
- show_logs() {
- if [ -f "logs/etl-application.log" ]; then
- if [ "$1" == "follow" ]; then
- tail -f logs/etl-application.log
- else
- log_info "Recent application logs:"
- tail -n 100 logs/etl-application.log
- fi
- else
- log_warn "Log file not found: logs/etl-application.log"
- fi
- }
-
- # 主函数
- main() {
- case "${1:-start}" in
- start)
- check_java
- create_logs_dir
- check_database
- check_kafka
- build_project
- start_application
- ;;
- stop)
- stop_application
- ;;
- restart)
- stop_application
- sleep 2
- main start
- ;;
- status)
- status_application
- ;;
- logs)
- show_logs
- ;;
- logs-follow)
- show_logs follow
- ;;
- build)
- check_java
- build_project
- ;;
- db-check)
- check_database
- ;;
- kafka-check)
- check_kafka
- ;;
- *)
- echo "Usage: $0 {start|stop|restart|status|logs|logs-follow|build|db-check|kafka-check}"
- echo " start - Build and start the application"
- echo " stop - Stop the application"
- echo " restart - Restart the application"
- echo " status - Check application status"
- echo " logs - Show recent logs"
- echo " logs-follow - Follow log output"
- echo " build - Build the project only"
- echo " db-check - Check database connection"
- echo " kafka-check - Check Kafka connection"
- exit 1
- ;;
- esac
- }
-
- # 执行主函数
- main "$@"
|