From 239570a905232134a187b53854c4c3b00de58a0f Mon Sep 17 00:00:00 2001 From: roode Date: Wed, 20 Aug 2025 17:16:34 +0900 Subject: [PATCH] =?UTF-8?q?hotfix=20-=20docker=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/deploy.yml | 85 ++++++++++++++++++------------------ backendProject/Dockerfile | 26 +++-------- docker-compose-prod.yml | 3 +- 3 files changed, 50 insertions(+), 64 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 1013b97..b4fbac4 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -3,8 +3,6 @@ name: Deploy to Amazon Linux EC2 (compose-prod) on: push: branches: [ main ] # main 브랜치 푸시 시 배포 - pull_request: - branches: [ main ] workflow_dispatch: {} jobs: @@ -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: @@ -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 diff --git a/backendProject/Dockerfile b/backendProject/Dockerfile index 02c4e62..4e849b0 100644 --- a/backendProject/Dockerfile +++ b/backendProject/Dockerfile @@ -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"] diff --git a/docker-compose-prod.yml b/docker-compose-prod.yml index 41d9260..8bbfc89 100644 --- a/docker-compose-prod.yml +++ b/docker-compose-prod.yml @@ -1,10 +1,10 @@ version: '3.8' services: - api1: build: context: ./backendProject + dockerfile: Dockerfile container_name: mlb-api-1 ports: - "8080:8080" @@ -21,6 +21,7 @@ services: api2: build: context: ./backendProject + dockerfile: Dockerfile container_name: mlb-api-2 ports: - "8081:8080"