CI/CD 배포 파이프라인
코드를 push하면 자동으로 배포되는 시스템의 전체 구조
PIPELINE OVERVIEW
전체 요약
Docker 이미지
= npm run build 결과물을 박스에 포장한 것
node_modules, OS 설정까지 통째로 담아서 어디서든 똑같이 실행 가능
컨테이너
= 그 박스를 열어서 실제로 실행한 상태
같은 이미지로 여러 컨테이너를 띄울 수 있음 (= 브라우저 탭 여러 개)
Kubernetes
= 컨테이너들을 관리하는 매니저
서버 여러 대에 컨테이너를 배분하고, 죽으면 다시 살리고, 트래픽을 분배
Pod
= 실제로 돌아가는 앱 인스턴스
K8s가 관리하는 최소 단위. 새 배포 시 새 Pod가 뜨고 기존 Pod가 내려감
Jenkins
= GitHub Actions 같은 자동화 도구
코드 push → 이미지 빌드 → 앱 빌드를 자동으로 실행하는 CI 서버
ArgoCD
= Git 상태를 보고 자동 배포하는 봇
새 이미지가 올라오면 K8s에 “이걸로 바꿔”라고 명령하는 CD 도구
CI
Continuous Integration
코드를 push할 때마다
자동으로 빌드하고 테스트하는 것.
“내가 짠 코드가 전체 시스템을 망가뜨리지 않는지”
매번 확인하는 자동화 과정
CD
Continuous Deployment
빌드가 성공하면
자동으로 서버에 배포하는 것.
“빌드 통과했으니 운영 서버에 올려줘”를
사람 대신 시스템이 처리
배포 과정 상세
develop 브랜치에 push하면 일어나는 일
코드 Push
개발자가 GitLab의 develop 브랜치에 코드를 push한다.
GitLab은 GitHub과 같은 Git 저장소. 회사에서 자체 운영하는 경우가 많다. develop 브랜치에 push 이벤트가 발생하면 Webhook이 Jenkins에 “새 코드 왔어”라고 알려준다.
Docker 이미지 빌드
Jenkins가 코드를 받아 Docker 이미지를 만든다.
Dockerfile이라는 레시피 파일을 읽고, 앱 실행에 필요한 모든 것(코드, node_modules, OS 환경)을 하나의 이미지로 패키징한다. npm install → npm run build를 Docker 안에서 실행하는 셈.
이미지 레지스트리 저장
만들어진 이미지를 저장소(Registry)에 올린다.
Docker Hub나 회사 내부 레지스트리에 이미지를 push한다. npm publish처럼 버전 태그를 달아서 저장. 이 이미지를 어떤 서버에서든 pull해서 실행할 수 있다.
ArgoCD 감지
ArgoCD가 새 이미지를 감지하고 배포를 시작한다.
ArgoCD는 Git 저장소(배포 설정 파일)를 계속 감시한다. 새 이미지 태그가 업데이트되면 “현재 서버 상태와 다르다”고 판단하고 자동으로 Kubernetes에 배포 명령을 내린다.
새 Pod 생성 & 배포 완료
Kubernetes가 새 Pod를 띄우고, 기존 Pod를 내린다.
새 이미지로 Pod(컨테이너)를 먼저 띄운다. 헬스체크를 통과하면 트래픽을 새 Pod로 전환하고, 기존 Pod를 종료한다. 이 과정을 Rolling Update라고 하며, 무중단 배포가 가능하다.
Docker 이미지란?
“이 앱을 실행하는 데 필요한 모든 것”을 담은 스냅샷
이미지는 레이어 구조로 쌓인다. 변경된 레이어만 다시 빌드하므로 속도가 빠르다.
요약
npm run build를 하면 .next/ 폴더가 생기면
Docker 이미지는 그 결과물 + Node.js + OS까지 전부 묶어서
“어떤 컴퓨터에서든 똑같이 실행되는 패키지”로 만든 것.
Kubernetes & Pod
컨테이너를 자동으로 관리하는 오케스트레이션 시스템
Kubernetes Cluster
Node 1 (서버)
Node 2 (서버)
Node 3 (서버)
Rolling Update (무중단 배포)
1. 새 이미지로 새 Pod를 먼저 띄운다
2. 새 Pod가 정상 동작(헬스체크 통과)하면
3. 트래픽을 새 Pod로 전환한다
4. 기존 Pod를 안전하게 종료한다
사용자 입장에서는 끊김 없이 새 버전이 적용된다.
개발자가 코드를 push하면
Jenkins가 이미지를 만들고
ArgoCD가 자동으로 배포한다