refactor: CI/CD 스크립트 수정 #83
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: 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 & | |