CI/CD 배포 파이프라인

코드를 push하면 자동으로 배포되는 시스템의 전체 구조

PIPELINE OVERVIEW

🦊GitLab코드 Push
🔨Jenkins이미지 빌드
📦Docker이미지 생성
🚀ArgoCD배포 감지
☸️K8s Pod서비스 시작

전체 요약

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할 때마다
자동으로 빌드하고 테스트하는 것.

“내가 짠 코드가 전체 시스템을 망가뜨리지 않는지”
매번 확인하는 자동화 과정

push → 이미지 빌드 → 앱 빌드 → 테스트

CD

Continuous Deployment

빌드가 성공하면
자동으로 서버에 배포하는 것.

“빌드 통과했으니 운영 서버에 올려줘”를
사람 대신 시스템이 처리

빌드 성공 → ArgoCD 감지 → 새 Pod 배포

배포 과정 상세

develop 브랜치에 push하면 일어나는 일

1🦊

코드 Push

개발자가 GitLab의 develop 브랜치에 코드를 push한다.

GitLab은 GitHub과 같은 Git 저장소. 회사에서 자체 운영하는 경우가 많다. develop 브랜치에 push 이벤트가 발생하면 Webhook이 Jenkins에 “새 코드 왔어”라고 알려준다.

2🔨

Docker 이미지 빌드

Jenkins가 코드를 받아 Docker 이미지를 만든다.

Dockerfile이라는 레시피 파일을 읽고, 앱 실행에 필요한 모든 것(코드, node_modules, OS 환경)을 하나의 이미지로 패키징한다. npm install → npm run build를 Docker 안에서 실행하는 셈.

3📦

이미지 레지스트리 저장

만들어진 이미지를 저장소(Registry)에 올린다.

Docker Hub나 회사 내부 레지스트리에 이미지를 push한다. npm publish처럼 버전 태그를 달아서 저장. 이 이미지를 어떤 서버에서든 pull해서 실행할 수 있다.

4🚀

ArgoCD 감지

ArgoCD가 새 이미지를 감지하고 배포를 시작한다.

ArgoCD는 Git 저장소(배포 설정 파일)를 계속 감시한다. 새 이미지 태그가 업데이트되면 “현재 서버 상태와 다르다”고 판단하고 자동으로 Kubernetes에 배포 명령을 내린다.

5☸️

새 Pod 생성 & 배포 완료

Kubernetes가 새 Pod를 띄우고, 기존 Pod를 내린다.

새 이미지로 Pod(컨테이너)를 먼저 띄운다. 헬스체크를 통과하면 트래픽을 새 Pod로 전환하고, 기존 Pod를 종료한다. 이 과정을 Rolling Update라고 하며, 무중단 배포가 가능하다.

Docker 이미지란?

“이 앱을 실행하는 데 필요한 모든 것”을 담은 스냅샷

앱 코드 (빌드 결과물)
node_modules (의존성)
Node.js 런타임
Linux OS (Alpine 등)

이미지는 레이어 구조로 쌓인다. 변경된 레이어만 다시 빌드하므로 속도가 빠르다.

요약

npm run build를 하면 .next/ 폴더가 생기면
Docker 이미지는 그 결과물 + Node.js + OS까지 전부 묶어서
“어떤 컴퓨터에서든 똑같이 실행되는 패키지”로 만든 것.

Kubernetes & Pod

컨테이너를 자동으로 관리하는 오케스트레이션 시스템

Kubernetes Cluster

Node 1 (서버)

프론트 Pod
API Pod

Node 2 (서버)

프론트 Pod
DB Pod

Node 3 (서버)

프론트 Pod (new)
Worker Pod

Rolling Update (무중단 배포)

1. 새 이미지로 새 Pod를 먼저 띄운다

2. 새 Pod가 정상 동작(헬스체크 통과)하면

3. 트래픽을 새 Pod로 전환한다

4. 기존 Pod를 안전하게 종료한다

사용자 입장에서는 끊김 없이 새 버전이 적용된다.

개발자가 코드를 push하면
Jenkins가 이미지를 만들고
ArgoCD가 자동으로 배포한다