#!/bin/bash # OS 확인 OS_INFO=$(grep '^ID=' /etc/os-release) if [[ "$OS_INFO" != *"ubuntu"* ]]; then echo "This script runs on Ubuntu only." exit 1 fi # 키보드 레이아웃을 영문(US)으로 설정 echo "Setting keyboard layout to English (US)..." # CLI 환경에서 키보드 레이아웃 설정 if command -v loadkeys >/dev/null 2>&1 && [ $(id -u) -eq 0 ]; then echo "Setting console keyboard layout to US..." loadkeys us elif command -v loadkeys >/dev/null 2>&1; then echo "To change keyboard layout, run with sudo: sudo loadkeys us" # 권한이 없어도 시도는 해봄 sudo loadkeys us 2>/dev/null || true fi echo "Starting Production Environment..." # 환경 변수 파일 로드 if [ -f .env.production ]; then echo "Loading production environment variables..." set -a source .env.production set +a else echo "Error: .env.production file not found!" exit 1 fi echo "Starting Production Environment..." export NODE_ENV=production # 이전 컨테이너 정리 docker-compose -f docker-compose.prod.yml down echo "Pruning Docker system..." # 컨테이너 정리 docker system prune -af docker image prune -af docker volume prune -af # Git 관련 명령어 실행 git reset --hard git checkout main # 강제로 리모트 브랜치의 내용을 가져옴 if ! git fetch origin; then echo "Git fetch failed. Exiting script." exit 1 fi if ! git reset --hard origin/main; then echo "Git reset failed. Exiting script." exit 1 fi # Java 개발 환경 확인 및 설치 echo "Checking Java development environment..." # JDK 7 우선 설치 및 설정 if ! command -v javac &> /dev/null; then echo "Java compiler (javac) not found. Installing OpenJDK 7..." # 패키지 목록 업데이트 apt-get update # OpenJDK 7 JDK 설치 (JRE가 아닌 JDK) apt-get install -y openjdk-7-jdk # 설치 확인 if ! command -v javac &> /dev/null; then echo "Failed to install OpenJDK 7. Trying alternative installation..." apt-get install -y default-jdk if ! command -v javac &> /dev/null; then echo "Failed to install Java compiler. Exiting..." exit 1 fi fi fi # JAVA_HOME 설정 (JDK 7 우선) export JAVA_HOME="" JDK7_PATHS=( "/usr/lib/jvm/java-7-openjdk-amd64" "/usr/lib/jvm/java-1.7.0-openjdk-amd64" "/usr/lib/jvm/openjdk-7-jdk" "/usr/lib/jvm/default-java" ) for path in "${JDK7_PATHS[@]}"; do if [ -d "$path" ] && [ -f "$path/bin/javac" ]; then export JAVA_HOME="$path" export PATH="$JAVA_HOME/bin:$PATH" echo "Set JAVA_HOME to: $JAVA_HOME" break fi done if [ -z "$JAVA_HOME" ]; then echo "Warning: Could not find JDK 7 installation directory" fi # Java 버전 확인 echo "Java compiler version:" javac -version echo "Java runtime version:" java -version # Java 소스 컴파일 echo "Compiling Java sources..." # Java 컴파일을 위한 디렉토리 생성 및 기존 클래스 파일 정리 echo "Preparing compilation directory..." rm -rf WebContent/WEB-INF/classes mkdir -p WebContent/WEB-INF/classes # 클래스패스 설정 (모든 jar 파일 포함) CLASSPATH="" for jar in WebContent/WEB-INF/lib/*.jar; do if [ -z "$CLASSPATH" ]; then CLASSPATH="$jar" else CLASSPATH="$CLASSPATH:$jar" fi done # JDK 7 기본 라이브러리 추가 if [ -n "$JAVA_HOME" ]; then if [ -f "$JAVA_HOME/jre/lib/rt.jar" ]; then CLASSPATH="$CLASSPATH:$JAVA_HOME/jre/lib/rt.jar" echo "Added JDK 7 runtime: $JAVA_HOME/jre/lib/rt.jar" fi if [ -f "$JAVA_HOME/lib/tools.jar" ]; then CLASSPATH="$CLASSPATH:$JAVA_HOME/lib/tools.jar" echo "Added JDK 7 tools: $JAVA_HOME/lib/tools.jar" fi fi # Servlet API는 WEB-INF/lib에 있는 것을 사용 (이미 클래스패스에 포함됨) echo "Using Servlet API from WEB-INF/lib (javax.servlet-api-4.0.1.jar)" echo "Classpath: $CLASSPATH" # Java 소스 파일 찾기 및 컴파일 if [ -d "src" ]; then echo "Found Java source directory: src" # Java 소스 파일 목록 생성 find src -name "*.java" > java_sources.txt if [ -s java_sources.txt ]; then echo "Compiling Java files..." # Java 컴파일 실행 (Java 7 호환성을 위해 source와 target 버전 명시) echo "Starting Java compilation with classpath..." echo "Number of Java files to compile: $(wc -l < java_sources.txt)" # 컴파일 실행 및 결과 확인 COMPILE_EXIT_CODE=0 javac -cp "$CLASSPATH" -d WebContent/WEB-INF/classes -encoding UTF-8 -source 1.7 -target 1.7 @java_sources.txt 2>&1 | tee compile.log COMPILE_EXIT_CODE=${PIPESTATUS[0]} if [ $COMPILE_EXIT_CODE -eq 0 ]; then echo "Java compilation successful!" # 컴파일된 클래스 파일 수 확인 CLASS_COUNT=$(find WebContent/WEB-INF/classes -name "*.class" | wc -l) echo "Successfully compiled $CLASS_COUNT class files" # 컴파일된 패키지 구조 표시 if [ $CLASS_COUNT -gt 0 ]; then echo "Compiled packages:" find WebContent/WEB-INF/classes -type d | grep -v "^WebContent/WEB-INF/classes$" | head -10 fi else echo "Java compilation failed! (Exit code: $COMPILE_EXIT_CODE)" echo "Compilation errors:" if [ -f compile.log ]; then tail -50 compile.log fi echo "Attempting compilation with extended classpath..." # 이미 설정된 JAVA_HOME 사용하여 확장된 클래스패스 구성 EXTENDED_CLASSPATH="$CLASSPATH" if [ -n "$JAVA_HOME" ]; then echo "Using JAVA_HOME: $JAVA_HOME" # JDK 7 필수 라이브러리들 추가 for lib in "jre/lib/rt.jar" "lib/tools.jar" "jre/lib/jsse.jar" "jre/lib/jce.jar"; do if [ -f "$JAVA_HOME/$lib" ]; then EXTENDED_CLASSPATH="$EXTENDED_CLASSPATH:$JAVA_HOME/$lib" echo "Added: $JAVA_HOME/$lib" fi done else echo "Warning: JAVA_HOME not set, using system default" fi # 시스템 클래스패스로 재시도 echo "Extended classpath: $EXTENDED_CLASSPATH" RETRY_EXIT_CODE=0 javac -cp "$EXTENDED_CLASSPATH" -d WebContent/WEB-INF/classes -encoding UTF-8 -source 1.7 -target 1.7 @java_sources.txt 2>&1 | tee compile_retry.log RETRY_EXIT_CODE=${PIPESTATUS[0]} if [ $RETRY_EXIT_CODE -eq 0 ]; then echo "Java compilation successful with extended classpath!" CLASS_COUNT=$(find WebContent/WEB-INF/classes -name "*.class" | wc -l) echo "Successfully compiled $CLASS_COUNT class files" # 컴파일된 패키지 구조 표시 if [ $CLASS_COUNT -gt 0 ]; then echo "Compiled packages:" find WebContent/WEB-INF/classes -type d | grep -v "^WebContent/WEB-INF/classes$" | head -10 fi else echo "Java compilation failed even with extended classpath. (Exit code: $RETRY_EXIT_CODE)" echo "Retry compilation errors:" if [ -f compile_retry.log ]; then tail -50 compile_retry.log fi echo "WARNING: Continuing with deployment anyway. Some features may not work properly." fi fi # 임시 파일 정리 rm -f java_sources.txt compile.log compile_retry.log # XML, properties 등 리소스 파일들을 classes 디렉토리에 복사 echo "Copying resource files (XML, properties, etc.) to classes directory..." # src 디렉토리에서 Java 파일이 아닌 모든 파일들을 찾아서 복사 find src -type f ! -name "*.java" | while read resource_file; do # src/ 부분을 제거하여 상대 경로 생성 relative_path=${resource_file#src/} target_dir="WebContent/WEB-INF/classes/$(dirname "$relative_path")" # 대상 디렉토리 생성 mkdir -p "$target_dir" # 파일 복사 cp "$resource_file" "WebContent/WEB-INF/classes/$relative_path" echo "Copied: $resource_file -> WebContent/WEB-INF/classes/$relative_path" done # 복사된 리소스 파일 수 확인 RESOURCE_COUNT=$(find WebContent/WEB-INF/classes -type f ! -name "*.class" | wc -l) echo "Copied $RESOURCE_COUNT resource files (XML, properties, etc.)" else echo "No Java source files found in src directory" # Java 파일이 없어도 리소스 파일은 복사 echo "Copying resource files (XML, properties, etc.) to classes directory..." find src -type f ! -name "*.java" | while read resource_file; do relative_path=${resource_file#src/} target_dir="WebContent/WEB-INF/classes/$(dirname "$relative_path")" mkdir -p "$target_dir" cp "$resource_file" "WebContent/WEB-INF/classes/$relative_path" echo "Copied: $resource_file -> WebContent/WEB-INF/classes/$relative_path" done RESOURCE_COUNT=$(find WebContent/WEB-INF/classes -type f ! -name "*.class" | wc -l) echo "Copied $RESOURCE_COUNT resource files (XML, properties, etc.)" fi else echo "No src directory found - skipping Java compilation and resource copying" fi # 컴파일된 클래스 파일 권한 설정 및 최종 확인 if [ -d "WebContent/WEB-INF/classes" ]; then chmod -R 644 WebContent/WEB-INF/classes find WebContent/WEB-INF/classes -type d -exec chmod 755 {} \; FINAL_CLASS_COUNT=$(find WebContent/WEB-INF/classes -name "*.class" | wc -l) FINAL_RESOURCE_COUNT=$(find WebContent/WEB-INF/classes -type f ! -name "*.class" | wc -l) if [ $FINAL_CLASS_COUNT -gt 0 ] || [ $FINAL_RESOURCE_COUNT -gt 0 ]; then echo "✓ Build completed successfully!" echo "✓ Total compiled class files: $FINAL_CLASS_COUNT" echo "✓ Total resource files (XML, properties, etc.): $FINAL_RESOURCE_COUNT" echo "✓ Set appropriate permissions for all files" # 클래스 파일 크기 확인 CLASSES_SIZE=$(du -sh WebContent/WEB-INF/classes 2>/dev/null | cut -f1) echo "✓ Classes directory size: $CLASSES_SIZE" # 주요 리소스 파일 타입 확인 if [ $FINAL_RESOURCE_COUNT -gt 0 ]; then echo "✓ Resource file types found:" find WebContent/WEB-INF/classes -type f ! -name "*.class" | sed 's/.*\.//' | sort | uniq -c | head -5 fi else echo "⚠ WARNING: No compiled class files or resource files found in WebContent/WEB-INF/classes" echo "⚠ The application may not function properly without compiled Java classes and resources" fi else echo "⚠ WARNING: WebContent/WEB-INF/classes directory not found" fi # 컨테이너 상태 확인 echo "Checking container status..." docker-compose -f docker-compose.prod.yml up --build --force-recreate -d echo "Production environment setup complete!"