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
85 changes: 43 additions & 42 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ name: Deploy to Amazon Linux EC2 (compose-prod)
on:
push:
branches: [ main ] # main 브랜치 푸시 시 배포
pull_request:
branches: [ main ]
workflow_dispatch: {}

jobs:
Expand All @@ -16,31 +14,37 @@ jobs:
- name: Checkout
uses: actions/checkout@v4

# 2) EC2로 소스/설정 전송 (JAR 빌드 불필요)
- name: Upload project to EC2
uses: appleboy/scp-action@v0.1.7
# 2) JDK 설치 후 JAR 빌드
- name: Set up JDK
uses: actions/setup-java@v4
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_SSH_KEY }}
source:
backendProject/**
target: ${{ secrets.EC2_APP_DIR }}
debug: true
java-version: '17'
distribution: 'temurin'

# 2-1) (추가) .env 파일 생성
- name: Create .env on EC2
uses: appleboy/ssh-action@v1.0.3
- name: Build with Gradle
run: ./gradlew clean build -x test
working-directory: backendProject

# 3) JAR 파일을 backendProject/app.jar 로 이름 변경
- name: Rename JAR
run: |
cp backendProject/build/libs/*.jar backendProject/app.jar

# 4) EC2로 파일 업로드 (JAR, docker-compose-prod.yml, Dockerfile, .env)
- name: Upload files to EC2
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_SSH_KEY }}
script: |
APP_DIR="${{ secrets.EC2_APP_DIR }}"
cd "$APP_DIR"
echo "${{ secrets.APP_ENV }}" > .env
source: |
backendProject/app.jar
backendProject/Dockerfile
docker-compose-prod.yml
.env
target: ${{ secrets.EC2_APP_DIR }}

# 3) EC2에서 배포 실행
# 5) EC2에서 Docker Compose 실행
- name: Deploy on EC2
uses: appleboy/ssh-action@v1.0.3
with:
Expand All @@ -52,35 +56,32 @@ jobs:
APP_DIR="${{ secrets.EC2_APP_DIR }}"
cd "$APP_DIR"

# Docker/compose 설치 (없으면)
# Docker 설치 확인
if ! command -v docker >/dev/null 2>&1; then
if command -v dnf >/dev/null 2>&1; then
sudo dnf -y update
sudo dnf -y install docker
else
sudo yum -y update
sudo yum -y install docker
if command -v dnf >/dev/null 2>&1; then
sudo dnf -y update
sudo dnf -y install docker
else
sudo yum -y update
sudo yum -y install docker
fi
sudo systemctl enable docker
sudo systemctl start docker
sudo usermod -aG docker ec2-user || true
fi
sudo systemctl enable docker
sudo systemctl start docker
sudo usermod -aG docker ec2-user || true
fi

# docker-compose 직접 설치 (v2 최신 안정화 버전)

# docker-compose 설치 확인
if ! command -v docker-compose >/dev/null 2>&1; then
sudo curl -SL https://github.com/docker/compose/releases/download/v2.29.7/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo curl -SL https://github.com/docker/compose/releases/download/v2.29.7/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
fi

# 기존 컨테이너 중지 후 재빌드/재기동
sudo docker-compose -f docker-compose-prod.yml down || true
sudo docker-compose -f docker-compose-prod.yml build --no-cache
sudo docker-compose -f docker-compose-prod.yml up -d

# (옵션) 안 쓰는 이미지 정리
# 기존 컨테이너 중지 후 새 빌드 실행
sudo docker-compose -f docker-compose-prod.yml down || true
sudo docker-compose -f docker-compose-prod.yml up -d --build
sudo docker image prune -f

# 4) (선택) CloudFront 캐시 무효화
# 6) (선택) CloudFront 캐시 무효화
- name: Set CloudFront ID as env var
run: echo "CF_ID=${{ secrets.CF_DISTRIBUTION_ID }}" >> $GITHUB_ENV

Expand Down
26 changes: 5 additions & 21 deletions backendProject/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,30 +1,14 @@
# ---- Build stage (Gradle 포함) ----
FROM gradle:8.5-jdk17 AS builder
WORKDIR /app

# 캐시 효율을 위해 설정/래퍼 먼저 복사
COPY settings.gradle build.gradle gradlew ./
COPY gradle ./gradle

# 소스
COPY src ./src

# 권한 & 빌드
RUN chmod +x ./gradlew \
&& ./gradlew clean build -x test --no-daemon

# ---- Runtime stage (JRE 최소) ----
# ---- Runtime stage ----
FROM eclipse-temurin:17-jre-alpine

WORKDIR /app

# 필요 시 JVM 메모리 한도 (t3.medium 고려)
# JVM 메모리 옵션 (EC2 인스턴스에 맞게 조절)
ENV JAVA_TOOL_OPTIONS="-XX:+UseG1GC -Xms256m -Xmx512m"

COPY --from=builder /app/build/libs/*.jar /app/app.jar
EXPOSE 8080
# CI/CD에서 복사해 올 JAR
COPY app.jar /app/app.jar

# 헬스체크(선택: Spring Actuator 사용 시)
# HEALTHCHECK --interval=30s --timeout=3s --retries=3 CMD curl -fsS http://localhost:8080/actuator/health || exit 1
EXPOSE 8080

ENTRYPOINT ["java","-jar","/app/app.jar"]
3 changes: 2 additions & 1 deletion docker-compose-prod.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
version: '3.8'

services:

api1:
build:
context: ./backendProject
dockerfile: Dockerfile
container_name: mlb-api-1
ports:
- "8080:8080"
Expand All @@ -21,6 +21,7 @@ services:
api2:
build:
context: ./backendProject
dockerfile: Dockerfile
container_name: mlb-api-2
ports:
- "8081:8080"
Expand Down