Skip to content

09. CI CD 및 배포

Jiyoung Hwang edited this page May 1, 2025 · 1 revision

Spring Boot 백엔드 배포 (CI/CD 파이프라인: GitHub Actions & Docker)

이 페이지에서는 Spring Boot 백엔드를 GitHub ActionsDocker를 사용하여 자동화된 CI/CD 파이프라인을 설정하는 방법에 대해 설명합니다. 이 파이프라인은 애플리케이션의 빌드, 테스트, 배포를 자동화하여 효율적인 운영을 지원합니다.


🛠️ 기술 스택 & 시스템 아키텍처


🔄 CI/CD 파이프라인 흐름

1. 코드 푸시 / Pull Request (PR) 트리거

  • main 브랜치에 푸시되거나 PR이 생성될 때마다 CI/CD 파이프라인이 자동으로 실행됩니다.
  • 현재는 test/workflow 브랜치에 테스트 중입니다.

2. 빌드

  • Docker 이미지를 빌드하여 애플리케이션 환경을 구성합니다.
  • Spring Boot 애플리케이션의 의존성을 설치하고, 실행 가능한 상태로 준비합니다.

3. 테스트

  • 빌드된 Docker 컨테이너 내에서 자동화된 테스트가 실행됩니다.
  • 테스트가 성공하면 배포 단계로 넘어갑니다.

4. 배포

  • 빌드된 Docker 이미지를 Docker Hub에 푸시합니다.(이때 EC2에 Docker가 설치되어 있어야합니다)
  • EC2에서 docker pull-> docker run또는 docker-compose를 실행합니다.

⚙️ GitHub Actions 워크플로우 yml

name: CI/CD Pipeline

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Set up JDK 11
        uses: actions/setup-java@v2
        with:
          java-version: '11'

      - name: Cache Maven dependencies
        uses: actions/cache@v2
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: |
            ${{ runner.os }}-maven-

      - name: Build the project
        run: mvn clean install -DskipTests

      - name: Build Docker image
        run: |
          docker build -t my-springboot-app .

      - name: Run tests in Docker
        run: |
          docker run --rm my-springboot-app mvn test

  deploy:
    runs-on: ubuntu-latest
    needs: build
    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Deploy to Docker Hub
        run: |
          docker tag my-springboot-app myusername/my-springboot-app:latest
          docker push myusername/my-springboot-app:latest

      - name: Notify deployment success
        run: echo "Deployment Successful!"

📝 설명

  • on: main 브랜치에 푸시되거나 PR이 생성될 때마다 트리거됩니다.
  • jobs:
    • build: Docker 이미지를 빌드하고, gradle을 사용하여 Spring Boot 애플리케이션을 빌드 및 테스트합니다.
    • deploy: 빌드된 Docker 이미지를 Docker Hub와 같은 레지스트리에 푸시하여 배포합니다.

🐳 Dockerfile 템플릿

# 1. Use the official OpenJDK image as the base image
FROM openjdk:11-jre-slim

# 2. Set the working directory inside the container
WORKDIR /app

# 3. Copy the Spring Boot jar file
COPY target/my-springboot-app.jar /app/my-springboot-app.jar

# 4. Expose the port
EXPOSE 8080

# 5. Run the Spring Boot application
CMD ["java", "-jar", "my-springboot-app.jar"]

📝 설명

  1. FROM openjdk:11-jre-slim: OpenJDK 11을 기반으로 한 이미지를 사용합니다.
  2. WORKDIR /app: 컨테이너 내에서 작업할 디렉토리를 /app으로 설정합니다.
  3. COPY target/my-springboot-app.jar: 빌드된 Spring Boot 애플리케이션의 .jar 파일을 컨테이너로 복사합니다.
  4. EXPOSE 8080: Spring Boot 애플리케이션이 8080 포트를 사용한다고 가정하여 해당 포트를 열어줍니다.
  5. CMD ["java", "-jar", "my-springboot-app.jar"]: 컨테이너 시작 시 Spring Boot 애플리케이션을 실행합니다.

📈 최종 성과

자동화된 배포

  • GitHub Actions와 Docker를 이용하여 자동화된 배포가 가능해졌습니다. 이를 통해 개발팀은 수동 배포의 부담을 줄이고, 빠르게 안정적인 배포를 진행할 수 있습니다.

성능 개선

  • Docker를 활용하여 애플리케이션을 경량화하고, 다양한 환경에서 동일한 방식으로 실행할 수 있도록 했습니다.

🛠️ 문제 해결 (트러블슈팅)

CI/CD 파이프라인에서 발생한 문제들은 다음과 같은 방식으로 해결했습니다:

  1. Gradle 빌드 오류: chmod +x 로 gradle 권한을 부여합니다.
  2. application을 도커 이미디로: jar에서 직접 실행하는 방식에서 컨테이너 기반 방식을 사용하여 docker 이미지를 EC2에 push하는 형식으로 수정했습니다.