CI/CD

Sirius·2025년 9월 12일

프로젝트

목록 보기
8/8

CI/CD 파이프라인 개요

  • git push origin main → GitHub Actions 실행
  • deploy.yml 기반 자동으로:
    1. Gradle 빌드 → JAR 생성
    2. Docker 이미지 빌드 → GHCR push
    3. SSH로 EC2 접속 → docker compose pull && up -d
  • 성공하면 EC2에서 바로 최신 컨테이너 실행

EC2 배포 요약

1️⃣ EC2 인스턴스 생성

  1. AWS 콘솔 → EC2
  2. 선택:
    • AMI: Ubuntu
    • 키페어: 새로 생성 (잘 저장하기)
    • 보안 그룹:
      • 22/tcp (SSH)
      • 80/tcp (HTTP)
      • 443/tcp (HTTPS)
      • 8080/사용자 지정 등등
  3. 생성 완료 후 퍼블릭 IPv4 주소 확인

RDS

  1. AWS 콘솔 → RDS
    • 엔진: MySQL 8.x LTS
    • 배포 옵션: 단일 인스턴스
    • 스토리지: gp3
    • 퍼블릭 접근: 비활성화 → EC2와 같은 VPC/Subnet에 두고 보안 그룹으로만 접근 허용
  2. DB 인스턴스 파라미터
    • 타임존: Asia/Seoul
    • 문자셋: utf8mb4 / utf8mb4_0900_ai_ci
  3. 보안 그룹
    • EC2 인스턴스 보안 그룹을 인바운드 소스로 추가 (즉, EC2만 DB 접근 허용)
  4. DB 생성 후
    • 엔드포인트 주소
    • 사용자명/비밀번호 기록
    • Flyway/Liquibase로 스키마 관리
      • RDS는 수동으로 init.sql 같은 걸 집어넣기 불편하므로,
      • 백엔드 앱에서 Flyway 또는 Liquibase를 붙여 자동 마이그레이션 → DB 스키마 관리

EC2에서 RDS로 로컬 DB 복원

# 로컬에서 MYSQLdump 생성
mysqldump -h 127.0.0.1 -u root -p ^
  --databases devmate ^
  --single-transaction --routines --triggers --events ^
  --default-character-set=utf8mb4 --set-gtid-purged=OFF --hex-blob ^
  --result-file="C:devmate_dump.sql"

# 로컬 -> EC2 업로드
scp -i devmate.pem C:devmate_dump.sql ubuntu@<EC2_IP>:/srv/app/

# EC2에서 복원
sudo apt -y install mysql-client
mysql -h <RDS-ENDPOINT> -P 3306 -u admin -p --default-character-set=utf8mb4 < /srv/app/devmate_dump.sq

# 점검
mysql -h <RDS-ENDPOINT> -u admin -p

2️⃣ EC2 기본 세팅

# 로컬 PC에서
ssh -i <만든키이름>.pem ubuntu@<ec2 IP>

# 서버 접속 후
sudo apt update && sudo apt -y upgrade

# Docker 권한 부여
sudo usermod -aG docker ubuntu
exit
# 다시 접속해서 적용됨 확인
ssh -i <만든키이름>.pem ubuntu@<ec2 IP>

echo <github PAT> | docker login ghcr.io -u sirius147 --password-stdin

3️⃣ Spring Boot 앱 Docker 이미지 준비

  • Dockerfile(위치는 root바로 아래, build.gradle과 같은 경로)을 통해 앱 이미지 생성 후
  • 컨테이너에 빌드 + 푸시
GHCR 로그인 (Personal Access Token write:packages 체크):

echo GH_PAT | docker login ghcr.io -u sirius147 --password-stdin

docker build -t ghcr.io/<계정이름>/devmate-backend:latest .
docker push ghcr.io/<계정이름>/devmate-backend:latest

4️⃣ EC2에서 앱 실행

4-1. 배포 디렉토리 생성

mkdir -p ~/app && cd ~/app

4-2.(EC2 /srv/app/.env) .env 작성

DB_URL=jdbc:mysql://devmate-db.....amazonaws.com:3306/devmate?useSSL=false&serverTimezone=Asia/Seoul&characterEncoding=UTF-8
DB_USERNAME=admin
DB_PASSWORD=....
JWT_SECRET=...
SPRING_PROFILES_ACTIVE=prod
...

4-3. docker-compose.yml 작성

services:
  backend:
    image: ghcr.io/<username>/devmate-backend:latest
    container_name: devmate-backend
    restart: always # 서버 재가동
    env_file: .env # env를 사용하는 코
    ports:
      - "18080:8080"   # 포트 포워딩
....

4-4. 실행

docker compose pull   # 이미지 다운로드
docker compose up -d
docker image prune -f # 이전 이미지 삭제

# 상태/로그 확인
docker compose ps
docker compose logs -f backend

.....

→ curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:18080/actuator/health 확인

0개의 댓글