Merge pull request #108 from umcMuses/dev #40
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: Muses Backend CI/CD | |
| on: | |
| push: | |
| branches: [ "main" ] | |
| jobs: | |
| build-and-deploy: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v3 | |
| - name: Set up JDK 17 | |
| uses: actions/setup-java@v3 | |
| with: | |
| java-version: '17' | |
| distribution: 'temurin' | |
| # Gradle 빌드 | |
| - name: Build with Gradle | |
| run: | | |
| chmod +x gradlew | |
| ./gradlew clean build -x test | |
| ls -l build/libs/ | |
| - name: Prepare deployment directory | |
| uses: appleboy/ssh-action@master | |
| with: | |
| host: ${{ secrets.EC2_HOST }} | |
| username: ubuntu | |
| key: ${{ secrets.EC2_SSH_KEY }} | |
| script: | | |
| echo "🧹 배포 디렉토리 정리 중..." | |
| sudo rm -rf /home/ubuntu/muses/*.jar | |
| mkdir -p /home/ubuntu/muses | |
| sudo chown -R ubuntu:ubuntu /home/ubuntu/muses | |
| chmod 755 /home/ubuntu/muses | |
| echo "✅ 디렉토리 준비 완료" | |
| ls -la /home/ubuntu/muses/ | |
| # JAR 파일을 EC2로 전송 | |
| - name: Copy JAR to EC2 | |
| uses: appleboy/scp-action@master | |
| with: | |
| host: ${{ secrets.EC2_HOST }} | |
| username: ubuntu | |
| key: ${{ secrets.EC2_SSH_KEY }} | |
| source: "build/libs/*.jar" | |
| target: "/home/ubuntu/muses" | |
| strip_components: 2 | |
| overwrite: true | |
| # EC2에서 기존 서버 죽이고 새 서버 실행 | |
| - name: Deploy to EC2 | |
| uses: appleboy/ssh-action@master | |
| env: | |
| RDS_USERNAME: ${{ secrets.RDS_USERNAME }} | |
| RDS_PASSWORD: ${{ secrets.RDS_PASSWORD }} | |
| JWT_SECRET: ${{ secrets.JWT_SECRET }} | |
| GOOGLE_CLIENT_ID: ${{ secrets.GOOGLE_CLIENT_ID }} | |
| GOOGLE_CLIENT_SECRET: ${{ secrets.GOOGLE_CLIENT_SECRET }} | |
| KAKAO_CLIENT_ID: ${{ secrets.KAKAO_CLIENT_ID }} | |
| KAKAO_CLIENT_SECRET: ${{ secrets.KAKAO_CLIENT_SECRET }} | |
| TOSS_SECRET_KEY: ${{ secrets.TOSS_SECRET_KEY }} | |
| AWS_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY }} | |
| AWS_SECRET_KEY: ${{ secrets.AWS_SECRET_KEY }} | |
| S3_BUCKET_NAME: ${{ secrets.S3_BUCKET_NAME }} | |
| with: | |
| host: ${{ secrets.EC2_HOST }} | |
| username: ubuntu | |
| key: ${{ secrets.EC2_SSH_KEY }} | |
| envs: RDS_USERNAME,RDS_PASSWORD,JWT_SECRET,GOOGLE_CLIENT_ID,GOOGLE_CLIENT_SECRET,KAKAO_CLIENT_ID,KAKAO_CLIENT_SECRET,TOSS_SECRET_KEY,AWS_ACCESS_KEY,AWS_SECRET_KEY,S3_BUCKET_NAME | |
| script: | | |
| # 배포 스크립트 생성 | |
| cat > /home/ubuntu/muses/deploy.sh << 'DEPLOY_SCRIPT' | |
| #!/bin/bash | |
| cd /home/ubuntu/muses | |
| # 기존 프로세스 PID 파일로 관리 | |
| if [ -f app.pid ]; then | |
| OLD_PID=$(cat app.pid) | |
| if ps -p $OLD_PID > /dev/null 2>&1; then | |
| echo "🔄 기존 프로세스($OLD_PID) 종료 중..." | |
| kill $OLD_PID 2>/dev/null | |
| sleep 5 | |
| kill -9 $OLD_PID 2>/dev/null || true | |
| fi | |
| rm -f app.pid | |
| fi | |
| # 추가로 8080 포트 사용 프로세스 확인 | |
| PORT_PID=$(lsof -t -i:8080 2>/dev/null || true) | |
| if [ -n "$PORT_PID" ]; then | |
| echo "🔄 8080 포트 사용 프로세스($PORT_PID) 종료 중..." | |
| kill $PORT_PID 2>/dev/null || true | |
| sleep 3 | |
| fi | |
| sleep 2 | |
| # 실행 | |
| echo "🚀 서버를 실행합니다..." | |
| nohup java -jar /home/ubuntu/muses/*.jar \ | |
| --spring.profiles.active=prod \ | |
| --RDS_USERNAME="$1" \ | |
| --RDS_PASSWORD="$2" \ | |
| --JWT_SECRET="$3" \ | |
| --GOOGLE_CLIENT_ID="$4" \ | |
| --GOOGLE_CLIENT_SECRET="$5" \ | |
| --KAKAO_CLIENT_ID="$6" \ | |
| --KAKAO_CLIENT_SECRET="$7" \ | |
| --TOSS_SECRET_KEY="$8" \ | |
| --AWS_ACCESS_KEY="$9" \ | |
| --AWS_SECRET_KEY="$10" \ | |
| --S3_BUCKET_NAME="$11" \ | |
| > /home/ubuntu/muses/app.log 2>&1 & | |
| echo $! > app.pid | |
| echo "✅ 서버 시작됨 (PID: $(cat app.pid))" | |
| DEPLOY_SCRIPT | |
| chmod +x /home/ubuntu/muses/deploy.sh | |
| # 스크립트를 백그라운드로 실행하고 즉시 종료 | |
| nohup /home/ubuntu/muses/deploy.sh "$RDS_USERNAME" "$RDS_PASSWORD" "$JWT_SECRET" "$GOOGLE_CLIENT_ID" "$GOOGLE_CLIENT_SECRET" "$KAKAO_CLIENT_ID" "$KAKAO_CLIENT_SECRET" "$TOSS_SECRET_KEY" > /home/ubuntu/muses/deploy.log 2>&1 & | |
| sleep 3 | |
| echo "📋 배포 스크립트 실행 완료" | |
| - name: Verify deployment | |
| uses: appleboy/ssh-action@master | |
| with: | |
| host: ${{ secrets.EC2_HOST }} | |
| username: ubuntu | |
| key: ${{ secrets.EC2_SSH_KEY }} | |
| script: | | |
| sleep 10 | |
| echo "📋 배포 로그:" | |
| cat /home/ubuntu/muses/deploy.log | |
| echo "" | |
| echo "📋 앱 로그 (최근 30줄):" | |
| tail -30 /home/ubuntu/muses/app.log | |
| echo "" | |
| if [ -f /home/ubuntu/muses/app.pid ]; then | |
| PID=$(cat /home/ubuntu/muses/app.pid) | |
| if ps -p $PID > /dev/null 2>&1; then | |
| echo "✨ 배포 성공! (PID: $PID)" | |
| exit 0 | |
| fi | |
| fi | |
| echo "❌ 배포 실패!" | |
| exit 1 |