Skip to content

[FEAT] CI/CD 파일 수정 #9

[FEAT] CI/CD 파일 수정

[FEAT] CI/CD 파일 수정 #9

Workflow file for this run

name: Deploy Backend to EC2
on:
push:
branches:
- main
workflow_dispatch:
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
cache: 'gradle'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: |
# Maven Central 403 에러 대비 재시도 로직 유지
for i in {1..3}; do
./gradlew clean build -x test && break || {
echo "Build attempt $i failed, retrying in 10 seconds..."
sleep 10
}
done
- name: Create SSH key file
run: |
echo "${{ secrets.EC2_SSH_KEY }}" > private_key.pem
chmod 600 private_key.pem
- name: Deploy to EC2
run: |
# 1. 빌드된 JAR 파일 찾기 (BE-로 시작하고 plain이 아닌 파일)
JAR_FILE_PATH=$(find build/libs/ -name "BE-*.jar" ! -name "*plain*" | head -n 1)
if [ -z "$JAR_FILE_PATH" ]; then
echo "Error: No JAR file found in build/libs/"
exit 1
fi
echo "Target JAR to transfer: $JAR_FILE_PATH"
# 2. EC2에서 기존 파일 및 잘못된 디렉토리 정리
# 특히 app-new.jar가 디렉토리인 경우를 대비해 rm -rf를 사용합니다.
ssh -i private_key.pem -o StrictHostKeyChecking=no -o ConnectTimeout=10 \
${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} << 'EOF'
# 기존에 잘못 생성된 디렉토리나 파일 삭제
sudo rm -rf /home/ubuntu/app-new.jar
# 기존 실행 중인 파일 백업 (파일이 존재할 때만)
if [ -f /home/ubuntu/app.jar ]; then
sudo cp /home/ubuntu/app.jar /home/ubuntu/app.jar.backup
fi
EOF
# 3. JAR 파일 전송
echo "Transferring JAR to EC2..."
scp -i private_key.pem -o StrictHostKeyChecking=no -o ConnectTimeout=10 \
$JAR_FILE_PATH ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }}:/home/ubuntu/app-new.jar
# 4. 파일 검증 및 서비스 재시작
ssh -i private_key.pem -o StrictHostKeyChecking=no -o ConnectTimeout=10 \
${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} << 'EOF'
set -e # 에러 발생 시 스크립트 중단
# 전송된 파일이 존재하는지 확인 (파일 형태인지 -f 체크)
if [ ! -f /home/ubuntu/app-new.jar ]; then
echo "Error: app-new.jar not found or is not a file"
exit 1
fi
# 파일 크기 확인 (최소 1MB 이상)
size=$(stat -c%s /home/ubuntu/app-new.jar)
if [ $size -lt 1000000 ]; then
echo "Error: JAR file too small ($size bytes). Transfer might have failed."
exit 1
fi
# JAR 파일 유효성 검증
if ! unzip -t /home/ubuntu/app-new.jar > /dev/null 2>&1; then
echo "Error: Invalid or corrupted JAR file"
exit 1
fi
echo "JAR file validated successfully (size: $size bytes)"
# 서비스 중지 후 파일 교체 및 재시작
echo "Restarting studylink service..."
sudo systemctl stop studylink
sudo mv /home/ubuntu/app-new.jar /home/ubuntu/app.jar
sudo chown ubuntu:ubuntu /home/ubuntu/app.jar
sudo systemctl start studylink
# 서비스 상태 확인
sleep 5
if sudo systemctl is-active studylink > /dev/null; then
echo "Service is running successfully"
else
echo "Service failed to start. Checking logs..."
sudo journalctl -u studylink -n 50
exit 1
fi
EOF
- name: Clean up
if: always()
run: rm -f private_key.pem
- name: Send deployment notification
if: success()
run: echo "Deployment successful!"