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

각 단계 상세

단계도구 예시목적
CheckoutGit소스 코드 가져오기
BuildMaven, Gradle, npm애플리케이션 빌드
Unit TestJest, JUnit, pytest단위 테스트
Code QualitySonarQube, ESLint코드 품질 검사
Security ScanTrivy, Snyk보안 취약점
PackageDocker, Helm아티팩트 생성
Deploy Stagingkubectl, Helm스테이징 배포
Integration TestPostman, Cypress통합 테스트
Deploy ProductionArgoCD, Spinnaker프로덕션 배포
MonitorPrometheus, 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 통합, YAMLGitHub 사용자
GitLab CI자체/클우드GitLab 통합, 완전한 DevOpsGitLab 사용자
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