#

🧩 Spring Boot CI/CD with Docker & GitHub Actions (Dev 환경 구축)

📘 개요

이 글에서는 Spring Boot 백엔드를 Docker 이미지로 빌드 → Docker Hub 업로드 → EC2 자동 배포 까지 완전 자동화하는 과정을 다룹니다.


🛠️ 1. 프로젝트 구조

boardmate-backend/
 ├─ src/
 │   └─ main/resources/
 │       ├─ application.yaml
 │       ├─ application-dev.yml
 │       └─ application-prod.yml
 ├─ Dockerfile
 └─ .github/workflows/deploy.yml

⚙️ 2. Dockerfile

FROM eclipse-temurin:21-jdk
WORKDIR /app
COPY target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

🌿 3. application-dev.yml

spring:
  datasource:
    url: jdbc:mysql://${DB_HOST}:${DB_PORT}/${DB_NAME}?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul&characterEncoding=UTF-8
    username: ${DB_USER}
    password: ${DB_PASS}
    driver-class-name: com.mysql.cj.jdbc.Driver

  jpa:
    hibernate:
      ddl-auto: update
      dialect: org.hibernate.dialect.MySQL8Dialect
    properties:
      hibernate:
        format_sql: true
    show-sql: true

server:
  port: 8080

🔹 allowPublicKeyRetrieval=true 추가로 MySQL 8 인증 문제 해결 🔹 환경변수 기반으로 DB 연결정보 관리


🧰 4. EC2 서버 구조

/srv/boardmate/dev/
 ├─ docker-compose.yml
 ├─ .env
 └─ deploy.sh

📄 .env 예시

DB_HOST=mysql-dev
DB_PORT=3306
DB_NAME=boardmate_dev
DB_USER=devuser
DB_PASS=devpass
SPRING_PROFILES_ACTIVE=dev

📄 docker-compose.yml

version: "3.8"

services:
  mysql-dev:
    image: mysql:8.0
    container_name: boardmate-mysql-dev
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: boardmate_dev
      MYSQL_USER: devuser
      MYSQL_PASSWORD: devpass
    ports:
      - "3307:3306"
    volumes:
      - ./data/mysql:/var/lib/mysql
    networks:
      - boardmate-dev-net

  app-dev:
    image: devsungyeon1103/boardmate-dev:latest
    container_name: boardmate-app-dev
    restart: always
    ports:
      - "8081:8080"
    environment:
      SPRING_PROFILES_ACTIVE: dev
      DB_HOST: mysql-dev
      DB_PORT: 3306
      DB_USER: devuser
      DB_PASS: devpass
      DB_NAME: boardmate_dev
    depends_on:
      - mysql-dev
    networks:
      - boardmate-dev-net

networks:
  boardmate-dev-net:
    driver: bridge

🔄 5. GitHub Actions (deploy.yml)

name: Deploy to EC2 (Dev)

on:
  push:
    branches:
      - dev

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Set up JDK 21
        uses: actions/setup-java@v4
        with:
          distribution: temurin
          java-version: 21

      - name: Build with Maven
        run: mvn clean package -DskipTests

      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: $
          password: $

      - name: Build and Push Docker image
        run: |
          docker build -t $/boardmate-dev:latest .
          docker push $/boardmate-dev:latest

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-access-key-id: $
          aws-secret-access-key: $
          aws-region: $

      - name: Allow GitHub Runner IP temporarily
        run: |
          GITHUB_IP=$(curl -s ifconfig.me)
          aws ec2 authorize-security-group-ingress \
            --group-id $ \
            --protocol tcp --port 22 --cidr ${GITHUB_IP}/32

      - name: SSH to EC2 and deploy
        uses: appleboy/ssh-action@v1.2.0
        with:
          host: $
          username: $
          key: $
          script: |
            cd /srv/boardmate/dev
            bash deploy.sh

      - name: Revoke GitHub Runner IP
        if: always()
        run: |
          GITHUB_IP=$(curl -s ifconfig.me)
          aws ec2 revoke-security-group-ingress \
            --group-id $ \
            --protocol tcp --port 22 --cidr ${GITHUB_IP}/32

🧠 6. CI/CD 전체 플로우 요약

1️⃣ git push origin dev 2️⃣ GitHub Actions가 실행되어  - Maven build → Docker build → Docker Hub push 3️⃣ EC2의 /srv/boardmate/dev/deploy.sh 자동 실행  - 최신 이미지 pull  - docker compose down && up -d 재기동 4️⃣ App 정상 실행 확인  bash  docker logs -f boardmate-app-dev  curl http://localhost:8081/actuator/health  

댓글남기기