[FEAT] CI/CD 파일 수정 #9
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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!" |