CI/CD 개념
지속적 통합(Continuous Integration)과 지속적 배포(Continuous Deployment)의 핵심 원리와 파이프라인 구성
지속적 통합(Continuous Integration)과 지속적 배포(Continuous Deployment)의 핵심 원리와 파이프라인 구성
목표: CI/CD 파이프라인을 설계하고 구현할 수 있는 수준
🎯 CI/CD 정의
지속적 통합 (CI)
graph LR
DEV["👨💻 개발자"] -->|"코드 푸시"| VCS["📁 Git"]
VCS -->|"트리거"| BUILD["🔨 빌드"]
BUILD -->|"성공"| TEST["🧪 테스트"]
TEST -->|"성공"| MERGE["🔀 머지"]
TEST -->|"실패"| FIX["🐛 수정"]
FIX --> DEV
핵심 원리:
- 코드 변경 시 자동 빌드
- 자동 테스트 실행
- 빠른 피드백
- 메인 브랜치 항상 배포 가능
지속적 배포 (CD)
graph LR
MERGE["🔀 머지된 코드"] -->|"자동"| STAGE["🚀 스테이징 배포"]
STAGE -->|"테스트 통과"| PROD["🌍 프로덕션 배포"]
PROD -->|"모니터링"| MONITOR["📊 모니터링"]
MONITOR -->|"문제 감지"| ROLLBACK["⏪ 롤백"]
핵심 원리:
- 자동 배포
- 스테이징 → 프로덕션
- 롤백 전략
- 모니터링 통합
📋 파이프라인 단계
표준 파이프라인
graph TB
subgraph "CI/CD 파이프라인"
A["📥 Checkout"] --> B["🔨 Build"]
B --> C["🧪 Unit Test"]
C --> D["📊 Code Quality"]
D --> E["🔒 Security Scan"]
E --> F["📦 Package"]
F --> G["🚀 Deploy to Staging"]
G --> H["🧪 Integration Test"]
H --> I["🌍 Deploy to Production"]
I --> J["📊 Monitor"]
end
각 단계 상세
| 단계 | 도구 예시 | 목적 |
|---|---|---|
| Checkout | Git | 소스 코드 가져오기 |
| Build | Maven, Gradle, npm | 애플리케이션 빌드 |
| Unit Test | Jest, JUnit, pytest | 단위 테스트 |
| Code Quality | SonarQube, ESLint | 코드 품질 검사 |
| Security Scan | Trivy, Snyk | 보안 취약점 |
| Package | Docker, Helm | 아티팩트 생성 |
| Deploy Staging | kubectl, Helm | 스테이징 배포 |
| Integration Test | Postman, Cypress | 통합 테스트 |
| Deploy Production | ArgoCD, Spinnaker | 프로덕션 배포 |
| Monitor | Prometheus, Grafana | 모니터링 |
🔄 브랜치 전략과 CI/CD
Git Flow
graph TB
MAIN["main"] -->|"릴리스"| REL["release/v1.0"]
MAIN -->|"핫픽스"| HOT["hotfix/bug-123"]
REL -->|"개발"| DEV["develop"]
DEV -->|"기능"| FEAT["feature/login"]
FEAT -->|"머지"| DEV
DEV -->|"머지"| REL
REL -->|"머지"| MAIN
HOT -->|"머지"| MAIN
GitHub Flow
graph LR
MAIN["main"] -->|"브랜치 생성"| FEAT["feature/xyz"]
FEAT -->|"PR 생성"| PR["Pull Request"]
PR -->|"CI 통과"| REVIEW["리뷰"]
REVIEW -->|"머지"| MAIN
MAIN -->|"자동 배포"| PROD["Production"]
🛠️ CI/CD 도구 비교
| 도구 | 호스팅 | 특징 | 사용처 |
|---|---|---|---|
| Jenkins | 자체 | 플러그인 생태계, 유연성 | 대규모, 온프레미스 |
| GitHub Actions | 클라우드 | GitHub 통합, YAML | GitHub 사용자 |
| GitLab CI | 자체/클우드 | GitLab 통합, 완전한 DevOps | GitLab 사용자 |
| CircleCI | 클라우드 | 빠른 빌드, 캐싱 | 클라우드 중심 |
| Travis CI | 클라우드 | 오픈소스 친화 | 오픈소스 프로젝트 |
| Azure DevOps | 클라우드 | Azure 통합 | Microsoft 생태계 |
| TeamCity | 자체 | JetBrains, 강력한 기능 | 엔터프라이즈 |
📋 파이프라인 설계 원칙
1. 빠른 피드백
# 병렬 실행 예시 (GitHub Actions)
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
test-group: [unit, integration, e2e]
steps:
- uses: actions/checkout@v3
- name: Run ${{ matrix.test-group }} tests
run: npm run test:${{ matrix.test-group }}
2. 불변 아티팩트
# Dockerfile 예시
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
3. 환경 일관성
# Docker Compose 예시
version: '3.8'
services:
app:
build: .
environment:
- NODE_ENV=${NODE_ENV:-development}
db:
image: postgres:15
environment:
- POSTGRES_DB=myapp
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
🚀 배포 전략
블루/그린 배포
graph TB
LB["🌐 Load Balancer"] -->|"현재"| BLUE["🔵 Blue (v1)"]
LB -.->|"준비"| GREEN["🟢 Green (v2)"]
subgraph "전환"
LB -->|"스위치"| GREEN
BLUE -->|"대기"| BLUE
end
치명적 공격
graph LR
LB["Load Balancer"] -->|"95%"| V1["v1"]
LB -->|"5%"| V2["v2"]
V2 -->|"성공"| INCR["점진적 증가"]
INCR -->|"100%"| FULL["v2 전체"]
롤링 업데이트
# Kubernetes 예시
kubectl set image deployment/myapp myapp=myapp:v2 --record
kubectl rollout status deployment/myapp
kubectl rollout history deployment/myapp
kubectl rollout undo deployment/myapp
📋 체크리스트
- CI/CD 개념 이해
- 파이프라인 단계 정의
- 브랜치 전략 선택
- 도구 선택
- 빠른 피드백 구현
- 불변 아티팩트
- 환경 일관성
- 배포 전략 선택
- 롤백 전략
- 모니터링 통합
🔗 관련 노트
- 01-02-버전관리-Git — Git 브랜치 전략
- 02-01-Jenkins-파이프라인 — Jenkins 구축
- 02-02-GitHub-Actions — GitHub Actions
- 03-01-GitOps-원칙 — GitOps 배포
마지막 업데이트: 2026-06-01