카테고리 없음

[회고] CI/CD 파이프라인 구축 및 자동화 배포 후기

shootingstar-1117 2026. 2. 6. 16:47

1. CI/CD 파이프라인 설계 (Data Flow)

  1. Local (Dev Environment)
    • 개발자는 로컬에서 docker-compose up -d pace-db pace-redis를 통해 인프라를 띄우고, IntelliJ에서 서버를 실행하여 개발합니다.
    • 코드 수정 후 develop 브랜치에 push 하면 파이프라인이 시작됩니다.
  2. GitHub Actions (CI)
    • Build: 소스 코드를 체크아웃하고 Dockerfile을 기반으로 이미지를 빌드합니다.
    • Push: 빌드된 이미지를 Docker Hub 레지스트리로 전송합니다. (push)
  3. AWS EC2 (CD)
    • Connect: SSH(appleboy/ssh-action)를 통해 서버에 접속합니다.
    • Pull: Docker Hub에서 최신 이미지를 pull 받아옵니다.
    • Env Generation: GitHub Secrets에 저장된 민감한 정보들을 사용하여 서버 내부에서 .env 파일을 동적으로 생성합니다.
    • Run: docker-compose up -d 명령어로 변경된 컨테이너만 스마트하게 교체하고 실행합니다.
    • Health Check: 서버가 정상적으로 떴는지 curl 명령어로 확인 후 배포를 완료합니다.

2. 주요 트러블슈팅 및 해결 과정 (Learning Points)

🛠 Issue 1: "포트가 이미 사용 중입니다" (Bind for 0.0.0.0:3306 failed)

  • 현상: 배포 스크립트 실행 시 MySQL 포트 충돌 에러(driver failed programming external connectivity)가 발생하며 배포가 실패했습니다.
  • 원인:
    1. 초기 설정에서 DB 포트를 0.0.0.0:3306으로 열어두었는데, 이를 보안 강화를 위해 127.0.0.1:3306으로 변경하는 과정에서 Docker의 네트워크 설정(iptables)이 꼬였습니다.
    2. docker-compose down을 해도 docker-proxy 프로세스가 좀비처럼 남아 포트를 점유하고 있었습니다.
  • 해결:
    • 서버에 직접 접속하여 sudo lsof -i :3306으로 범인 프로세스를 색출하고 kill 했습니다.
    • docker network prune -fsudo systemctl restart docker 명령어로 꼬인 네트워크 규칙을 강제로 초기화하여 해결했습니다.
    • 배운점: 설정이 크게 바뀔 때는 prune이나 서비스 재시작 같은 작업이 필요함을 배웠습니다.

🛠 Issue 2: 환경변수의 미로 (.env vs yaml vs compose)

  • 현상: 로컬에서는 잘 되는데 배포만 하면 DB 접속이 안되는 에러가 발생했습니다.
  • 원인: application.yaml, docker-compose.yml, 그리고 실제 주입되는 환경변수의 이름이 서로 미묘하게 달랐습니다.
  • 해결: "Single Source of Truth (.env)" 전략을 도입했습니다.
    • 모든 변수명을 .env 기준으로 통일했습니다.
    • docker-compose.yml.env를 읽어 컨테이너에 주입하고, 앱은 그 값을 그대로 받도록 설정을 일원화하여 혼란을 잠재웠습니다.

🛠 Issue 3: Redis 보안과 데이터 증발

  • 현상: 코드 리뷰 중 "Redis 포트가 외부에 열려있어 위험하다"는 지적과 "컨테이너 재시작 시 데이터가 날아간다"는 문제를 확인했습니다.
  • 해결:
    • 보안: ports: 127.0.0.1:6379:6379 설정을 통해 외부 접속을 원천 차단하고, 로컬(앱)에서만 접속 가능하게 변경했습니다.
    • 데이터: volumes 설정을 추가하고, redis-server --appendonly yes 옵션을 통해 데이터 영속성을 확보했습니다.

3. 성찰 및 향후 계획

  • 깨달은 점: 단순히 "배포가 된다"를 넘어 "안전하고 효율적으로" 배포하는 것이 얼마나 어려운지 깨달았습니다. 특히 Docker Compose가 제공하는 코드로써의 인프라 덕분에, 팀원들이 복잡한 설치 과정 없이 명령어 한 줄로 동일한 개발 환경을 갖게 된 것이 가장 큰 수확인 것 같습니다.
  • 아쉬운 점: 현재는 배포 시 약 10~30초 정도의 다운타임(서버 끊김)이 발생합니다. 프론트엔드 팀원들이 테스트 중에 불편을 겪기도 했습니다.
  • 향후 계획: 다음 단계로는 Blue/Green 배포 전략을 도입하여, 사용자가 배포 중에도 끊김 없이 서비스를 이용할 수 있는 무중단 배포 환경을 구축하고 싶습니다.
  • 후기: 정말 좋은 경험이었습니다!! 인프라 구축을 바닥부터 하나하나 쌓아가며 경험을 얻은 귀중한 시간이었습니다.