Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 28 additions & 9 deletions .github/workflows/server-prod-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
13 changes: 8 additions & 5 deletions server/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# [Stage 1] Build 환경: Gradle과 Java 17이 포함된 이미지 사용
# [Stage 1] Build 환경: Gradle 공식 이미지 사용
FROM gradle:8.5-jdk17 AS builder
WORKDIR /project

Expand All @@ -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"]