#
🧩 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
댓글남기기