2626
2727 - name : Build with Gradle
2828 run : |
29- # Maven Central 403 에러 대비 재시도 로직 유지
3029 for i in {1..3}; do
3130 ./gradlew clean build -x test && break || {
3231 echo "Build attempt $i failed, retrying in 10 seconds..."
@@ -41,82 +40,70 @@ jobs:
4140
4241 - name : Deploy to EC2
4342 run : |
44- # 1. 빌드된 JAR 파일 찾기 (BE-로 시작하고 plain이 아닌 파일)
43+ # 1. 빌드된 JAR 파일 찾기
4544 JAR_FILE_PATH=$(find build/libs/ -name "BE-*.jar" ! -name "*plain*" | head -n 1)
46-
4745 if [ -z "$JAR_FILE_PATH" ]; then
48- echo "Error: No JAR file found in build/libs/ "
46+ echo "Error: No JAR file found"
4947 exit 1
5048 fi
5149
52- echo "Target JAR to transfer: $JAR_FILE_PATH"
50+ # 로컬(GitHub Runner)에서 파일 크기 확인
51+ LOCAL_SIZE=$(stat -c%s "$JAR_FILE_PATH")
52+ echo "Local JAR size: $LOCAL_SIZE bytes"
5353
54- # 2. EC2에서 기존 파일 및 잘못된 디렉토리 정리
55- # 특히 app-new.jar가 디렉토리인 경우를 대비해 rm -rf를 사용합니다.
56- ssh -i private_key.pem -o StrictHostKeyChecking=no -o ConnectTimeout=10 \
54+ # 2. EC2 사전 준비 (unzip 설치 및 기존 파일 정리)
55+ ssh -i private_key.pem -o StrictHostKeyChecking=no \
5756 ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} << 'EOF'
58- # 기존에 잘못 생성된 디렉토리나 파일 삭제
59- sudo rm -rf /home/ubuntu/app-new.jar
57+ # unzip이 없으면 설치
58+ if ! command -v unzip &> /dev/null; then
59+ sudo apt-get update && sudo apt-get install -y unzip
60+ fi
6061
61- # 기존 실행 중인 파일 백업 (파일이 존재할 때만)
62+ sudo rm -rf /home/ubuntu/app-new.jar
6263 if [ -f /home/ubuntu/app.jar ]; then
6364 sudo cp /home/ubuntu/app.jar /home/ubuntu/app.jar.backup
6465 fi
6566 EOF
6667
6768 # 3. JAR 파일 전송
6869 echo "Transferring JAR to EC2..."
69- scp -i private_key.pem -o StrictHostKeyChecking=no -o ConnectTimeout=10 \
70- $JAR_FILE_PATH ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }}:/home/ubuntu/app-new.jar
70+ scp -i private_key.pem -o StrictHostKeyChecking=no \
71+ " $JAR_FILE_PATH" ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }}:/home/ubuntu/app-new.jar
7172
7273 # 4. 파일 검증 및 서비스 재시작
73- ssh -i private_key.pem -o StrictHostKeyChecking=no -o ConnectTimeout=10 \
74- ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} << ' EOF'
75- set -e # 에러 발생 시 스크립트 중단
74+ ssh -i private_key.pem -o StrictHostKeyChecking=no \
75+ ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} << EOF
76+ set -e
7677
77- # 전송된 파일이 존재하는지 확인 (파일 형태인지 -f 체크)
78- if [ ! -f /home/ubuntu/app-new.jar ]; then
79- echo "Error: app-new.jar not found or is not a file"
80- exit 1
81- fi
78+ # 전송된 파일 크기 확인
79+ REMOTE_SIZE=\$(stat -c%s /home/ubuntu/app-new.jar)
80+ echo "Remote JAR size: \$REMOTE_SIZE bytes"
8281
83- # 파일 크기 확인 (최소 1MB 이상)
84- size=$(stat -c%s /home/ubuntu/app-new.jar)
85- if [ $size -lt 1000000 ]; then
86- echo "Error: JAR file too small ($size bytes). Transfer might have failed."
82+ # 로컬과 원격 크기 비교 (다르면 전송 오류)
83+ if [ "$LOCAL_SIZE" -ne "\$REMOTE_SIZE" ]; then
84+ echo "Error: File size mismatch! Local: $LOCAL_SIZE, Remote: \$REMOTE_SIZE"
8785 exit 1
8886 fi
8987
90- # JAR 파일 유효성 검증
88+ # JAR 파일 유효성 검증 (unzip 사용)
89+ echo "Testing JAR validity..."
9190 if ! unzip -t /home/ubuntu/app-new.jar > /dev/null 2>&1; then
92- echo "Error: Invalid or corrupted JAR file"
91+ echo "Error: Invalid or corrupted JAR file (Unzip test failed) "
9392 exit 1
9493 fi
9594
96- echo "JAR file validated successfully (size: $size bytes) "
95+ echo "JAR file validated successfully. "
9796
98- # 서비스 중지 후 파일 교체 및 재시작
99- echo "Restarting studylink service..."
97+ # 서비스 재시작
10098 sudo systemctl stop studylink
10199 sudo mv /home/ubuntu/app-new.jar /home/ubuntu/app.jar
102100 sudo chown ubuntu:ubuntu /home/ubuntu/app.jar
103101 sudo systemctl start studylink
104102
105- # 서비스 상태 확인
106103 sleep 5
107- if sudo systemctl is-active studylink > /dev/null; then
108- echo "Service is running successfully"
109- else
110- echo "Service failed to start. Checking logs..."
111- sudo journalctl -u studylink -n 50
112- exit 1
113- fi
104+ sudo systemctl is-active studylink
114105 EOF
115106
116107 - name : Clean up
117108 if : always()
118- run : rm -f private_key.pem
119-
120- - name : Send deployment notification
121- if : success()
122- run : echo "Deployment successful!"
109+ run : rm -f private_key.pem
0 commit comments