Skip to content

refactor: CI/CD 스크립트 수정 #83

refactor: CI/CD 스크립트 수정

refactor: CI/CD 스크립트 수정 #83

Workflow file for this run

name: Java CI with JAR deploy
on:
push:
branches: [ develop ] # develop 브랜치에 push될 때 실행
permissions:
contents: read
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
# 1. 소스 코드 체크아웃
- uses: actions/checkout@v3
# 2. JDK 17 설치
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
# 3. Gradle 실행 권한 부여
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
# 4. Gradle 빌드 (JAR 파일 생성)
- name: Build with Gradle
run: ./gradlew clean build
# 5. 빌드된 JAR 파일을 EC2로 복사
- name: Copy JAR to EC2
uses: appleboy/scp-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
source: "build/libs/*.jar" # 빌드 후 생성된 JAR 파일
target: "/home/${{ secrets.EC2_USERNAME }}/" # EC2 인스턴스의 홈 디렉토리
strip_components: 2 # JAR 파일만 복사하기 위해 상위 경로(build/libs/) 제거
# docker-compose-dev.yml 파일을 EC2로 복사
- name: Copy docker-compose.yml to EC2
uses: appleboy/scp-action@v0.1.7 # scp-action을 사용하여 파일을 EC2로 복사
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
source: "docker-compose.yml" # Runner의 현재 작업 디렉토리에 있는 파일
target: "/home/ubuntu/" # EC2 인스턴스의 대상 디렉토리 (파일이 복사될 위치)
# 6. EC2에 배포 및 애플리케이션 실행
- name: Deploy to EC2
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
script: |
# 1. 환경변수 파일(.env) 생성
# Docker가 없으므로 DOCKER_IMAGE_NAME은 제외합니다.
cat << EOF > .env
DB_URL=${{ secrets.DB_URL }}
DB_USER=${{ secrets.DB_USER }}
DB_PASS=${{ secrets.DB_PASS }}
JWT_SECRET=${{ secrets.JWT_SECRET }}
REDIRECT_URL=${{ secrets.REDIRECT_URL }}
CLIENT_ID=${{ secrets.CLIENT_ID }}
TEAM_ID=${{ secrets.TEAM_ID }}
KEY_ID=${{ secrets.KEY_ID }}
S3_ACCESS_KEY=${{ secrets.S3_ACCESS_KEY }}
S3_SECRET_KEY=${{ secrets.S3_SECRET_KEY }}
COOLSMS_KEY=${{ secrets.COOLSMS_KEY }}
COOLSMS_SECRET=${{ secrets.COOLSMS_SECRET }}
FROM_NUMBER=${{ secrets.FROM_NUMBER }}
EOF
# 2. 인증 키 파일 생성 (경로 문제 해결)
cat << EOF > firebase-service-account.json
${{ secrets.FIREBASE_SERVICE_KEY }}
EOF
cat << EOF > authkey.p8
${{ secrets.AUTH_KEY_P8 }}
EOF
# 3. 기존에 실행 중이던 애플리케이션 프로세스 종료
PID=$(ps -ef | grep java | grep *.jar | awk '{print $2}')
if [ -n "$PID" ]; then
echo "기존 프로세스(PID: $PID)를 종료합니다."
kill -15 $PID
sleep 5
fi
# 4. .env 파일의 환경변수를 로드하고 새 JAR 파일을 백그라운드에서 실행
# nohup: SSH 접속이 끊겨도 서버가 계속 실행되도록 함
export $(grep -v '^#' .env | xargs)
JAR_FILE=$(ls /home/${{ secrets.EC2_USERNAME }}/*.jar | grep -v -- '-plain.jar' | head -n 1)
# ✅ 옵션(--spring.redis.host)을 JAR 파일 이름 뒤로 이동
nohup /usr/bin/java -jar $JAR_FILE --spring.redis.host=localhost > app.log 2>&1 &