Skip to content

Merge pull request #106 from umcMuses/dev #39

Merge pull request #106 from umcMuses/dev

Merge pull request #106 from umcMuses/dev #39

Workflow file for this run

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