[FEAT] 로그인 시 동일 계정 발견 시 계정 연동 로직 추가 #23
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: | | |
| 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 파일 찾기 | |
| 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" | |
| exit 1 | |
| fi | |
| # 로컬(GitHub Runner)에서 파일 크기 확인 | |
| LOCAL_SIZE=$(stat -c%s "$JAR_FILE_PATH") | |
| echo "Local JAR size: $LOCAL_SIZE bytes" | |
| # 2. EC2 사전 준비 (unzip 설치 및 기존 파일 정리) | |
| ssh -i private_key.pem -o StrictHostKeyChecking=no \ | |
| ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} << 'EOF' | |
| # unzip이 없으면 설치 | |
| if ! command -v unzip &> /dev/null; then | |
| sudo apt-get update && sudo apt-get install -y unzip | |
| fi | |
| 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 \ | |
| "$JAR_FILE_PATH" ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }}:/home/ubuntu/app-new.jar | |
| # 4. 파일 검증 및 서비스 재시작 | |
| ssh -i private_key.pem -o StrictHostKeyChecking=no \ | |
| ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} << EOF | |
| set -e | |
| # 전송된 파일 크기 확인 | |
| REMOTE_SIZE=\$(stat -c%s /home/ubuntu/app-new.jar) | |
| echo "Remote JAR size: \$REMOTE_SIZE bytes" | |
| # 로컬과 원격 크기 비교 (다르면 전송 오류) | |
| if [ "$LOCAL_SIZE" -ne "\$REMOTE_SIZE" ]; then | |
| echo "Error: File size mismatch! Local: $LOCAL_SIZE, Remote: \$REMOTE_SIZE" | |
| exit 1 | |
| fi | |
| # JAR 파일 유효성 검증 (unzip 사용) | |
| echo "Testing JAR validity..." | |
| if ! unzip -t /home/ubuntu/app-new.jar > /dev/null 2>&1; then | |
| echo "Error: Invalid or corrupted JAR file (Unzip test failed)" | |
| exit 1 | |
| fi | |
| echo "JAR file validated successfully." | |
| # 서비스 재시작 | |
| 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 | |
| sudo systemctl is-active studylink | |
| EOF | |
| - name: Clean up | |
| if: always() | |
| run: rm -f private_key.pem |