diff --git a/.github/workflows/server-prod-deploy.yml b/.github/workflows/server-prod-deploy.yml index b8870c34c..13a8367f2 100644 --- a/.github/workflows/server-prod-deploy.yml +++ b/.github/workflows/server-prod-deploy.yml @@ -5,21 +5,40 @@ on: branches: [ "main" ] jobs: + # [1] 테스트 단계: 배포 전에 먼저 실행됨 + test: + runs-on: self-hosted + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Run Tests with Gradle + # Host에 자바가 없으므로, Gradle 도커 이미지를 받아와서 테스트만 수행하고 종료 + # --rm: 테스트 끝나면 컨테이너 삭제 + # -v: 현재 소스코드를 컨테이너에 마운트 + run: | + docker run --rm \ + -v ${{ github.workspace }}:/project \ + -w /project \ + gradle:8.5-jdk17 \ + gradle test --no-daemon + + # [2] 배포 단계: 테스트가 성공해야만 실행됨 deploy: runs-on: self-hosted + needs: test # [핵심] 'test' 잡이 성공해야만 이 잡을 실행한다. env: PROFILES: prod steps: - - name: Checkout code - uses: actions/checkout@v4 + - name: Checkout code + uses: actions/checkout@v4 - - name: Deploy with Docker Compose - working-directory: ./server - run: | - docker compose up -d --build + - name: Deploy with Docker Compose + run: | + docker compose up -d --build - - name: Clean up unused Docker images - run: | - docker image prune -f + - name: Clean up unused Docker images + run: | + docker image prune -f diff --git a/server/Dockerfile b/server/Dockerfile index 811b04623..6ca1a9000 100644 --- a/server/Dockerfile +++ b/server/Dockerfile @@ -1,4 +1,4 @@ -# [Stage 1] Build 환경: Gradle과 Java 17이 포함된 이미지 사용 +# [Stage 1] Build 환경: Gradle 공식 이미지 사용 FROM gradle:8.5-jdk17 AS builder WORKDIR /project @@ -8,14 +8,17 @@ COPY build.gradle settings.gradle ./ COPY src ./src # 빌드 실행 -RUN gradle clean build --no-daemon +# --no-daemon: 일회성 빌드에서 데몬을 띄우지 않아 메모리 절약 +RUN gradle clean build --no-daemon -x test -# [Stage 2] Run 환경: 가벼운 Java 17 런타임 이미지 사용 -FROM openjdk:17-jdk-slim +# [Stage 2] Run 환경: AWS 및 일반 환경에서 가장 안정적인 Amazon Corretto 17 사용 +# 기존 openjdk:17-jdk-slim은 Deprecated 되어 삭제됨 +FROM amazoncorretto:17 WORKDIR /app # Stage 1에서 빌드된 Jar 파일만 복사해옴 COPY --from=builder /project/build/libs/*.jar app.jar -# 실행 +# 실행 명령어 +# exec를 사용하여 PID 1을 Java 프로세스가 가져가도록 함 (Graceful Shutdown 지원) ENTRYPOINT ["sh", "-c", "exec java -Dspring.profiles.active=${PROFILES} -jar app.jar"] \ No newline at end of file