Skip to content

REFACTOR: blue green CICD 해보기 #107

@oculo0204

Description

@oculo0204

🎯 목표

현재 단순 재시작 방식의 배포를 Blue-Green 방식으로 전환하여 무중단 배포(Zero Downtime Deployment)를 구현한다.


📌 배경

현재 배포 방식은 기존 컨테이너를 중단 후 새 컨테이너를 실행하는 구조로, 배포 시 서비스 다운타임이 발생한다.

# 현재 방식 — 다운타임 발생
docker rm -f $(docker ps -qa)
docker pull ...
docker-compose up -d

Blue-Green 배포를 적용하면 새 버전을 먼저 띄우고 헬스체크 통과 후 트래픽을 전환하므로 다운타임 없이 배포가 가능하다.


🔧 구현 내용

인프라 구성

  • EC2 단일 서버에서 NGINX + Docker Compose로 구현
  • Blue 컨테이너 (8080), Green 컨테이너 (8081) 두 개 운영
  • NGINX가 현재 active 컨테이너로 트래픽 라우팅
NGINX (80/443)
    ↓
Blue (8080) 또는 Green (8081)  ← 트래픽 전환

배포 흐름

1. 새 Docker 이미지 빌드 & DockerHub push
2. 현재 inactive 컨테이너(Blue or Green)에 새 이미지 실행
3. /actuator/health 헬스체크 통과 확인
4. NGINX 설정 변경 → 트래픽 전환 (nginx -s reload)
5. 기존 컨테이너 종료
6. 배포 실패 시 → 기존 컨테이너 유지 (자동 롤백)

✅ 체크리스트

인프라

  • EC2에 NGINX 설치 및 기본 설정
  • NGINX upstream 설정 (포트 전환 가능하도록)
  • docker-compose.yml blue/green 컨테이너 구성

애플리케이션

  • spring-boot-starter-actuator 의존성 추가
  • /actuator/health 엔드포인트 활성화 확인

배포 스크립트

  • deploy.sh 작성 (active 컨테이너 감지 → 전환 → 헬스체크 → NGINX reload)
  • 헬스체크 실패 시 롤백 로직 추가
  • 수동 실행 테스트

GitHub Actions

  • CD workflow에 deploy.sh 실행 스텝 연결
  • 배포 성공/실패 슬랙 알림 추가 (선택)

📎 참고 사항

  • Self-hosted Runner 방식과 함께 적용하면 SSH 키 없이 EC2에서 직접 deploy.sh 실행 가능
  • 단일 EC2 환경이므로 Blue/Green 전환 시 메모리 여유 확인 필요 (컨테이너 2개 동시 실행)
  • 롤백은 NGINX upstream을 이전 포트로 되돌리고 nginx -s reload 하면 즉시 가능

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions