플랫폼, 데브옵스와 클라우드

CI/CD 개요

meellon 2026. 6. 28. 05:40

학습 목표

CI(Continuous Integration)와 CD(Continuous Delivery/Deployment) 차이를 설명할 수 있다.

build → test → scan → deploy 파이프라인 단계와 실패 시 중단 원칙을 설명할 수 있다.

아티팩트(이미지·바이너리) 불변성환경별 설정 분리를 설명할 수 있다.

Kubernetes Deployment·ConfigMap·Secret과 CI/CD가 어디서 만나는지 설명할 수 있다.

문제 상황

  • main에 merge했는데 로컬에서만 돌아갔다
    • 통합 빌드·테스트 없음 — CI 부재
  • staging은 OK인데 production 배포 후 설정·버전이 달랐다
    • 다른 바이너리를 다시 빌드해 배포
  • 배포마다 서버에 SSH로 수동 docker pull·kubectl apply
    • 자동화·감사 추적 없음
  • 취약점 스캔 없이 이미지만 올렸더니 CVE가 프로덕션까지
    • scan 단계 누락
  • dev·staging·prod가 같은 DB·같은 Secret을 공유
    • 환경 분리·설정 주입 실패
  • “CI/CD 했다”는데 배포는 여전히 수동 — CD가 없음

앞서 Kubernetes 워크로드·스케줄링까지 봤다. Part 3 DevOps는 코드가 클러스터에 도달하기까지의 파이프라인이다.

1. CI vs CD

  CI CD
목적 변경을 자주·안전하게 통합 검증된 빌드를 환경에 전달
시점 commit·PR마다 CI 성공 후 (또는 태그·승인)
산출 테스트 결과·아티팩트 배포된 런타임 상태
실패 merge·배포 차단 롤백·이전 아티팩트
CI   — every change: build · test · scan → artifact
CD   — verified artifact → staging → production
  • Continuous Integration — 팀 코드를 하루에 여러 번 main에 통합, 자동 검증
  • Continuous Delivery — production 배포 직전까지 자동, prod는 승인 가능
  • Continuous Deployment — CI 통과 시 prod까지 자동 (조직·규제에 따라 선택)
  • 오리엔테이션 Delivery Pipeline — Code → CI → Artifact → CD → Runtime — 이번 편에서 단계를 쪼갠다

2. 파이프라인 단계

단계 역할 실패 시
build 컴파일·이미지 빌드·패키징 파이프라인 중단
test unit·integration·contract merge/deploy 차단
scan SAST·이미지 CVE·의존성 정책 위반 시 중단
deploy K8s·클라우드에 적용 롤백·알림
stages:
  - build    # docker build, mvn package
  - test     # pytest, go test
  - scan     # trivy, semgrep
  - deploy   # kubectl apply, helm upgrade
  • build — Dockerfile·앞서 본 레이어 캐시·멀티 스테이지
  • test — PR에서 먼저 실행 (shift-left)
  • scan — Security 시리즈 SBOM·취약점과 연결
  • deploy같은 이미지를 환경만 바꿔 promote
# 실패한 job은 이후 stage 실행 안 함 (fail fast)
# logs · artifacts · commit SHA 로 추적

3. 아티팩트

아티팩트 — 파이프라인이 만든 불변 결과물.

종류 저장
컨테이너 이미지 my/api:abc123f registry (ECR, GCR, Harbor)
바이너리/JAR app-1.2.0.jar artifact store
Helm chart api-1.2.0.tgz OCI·chart repo
manifest bundle kustomize output Git·artifact
  • 태그latest만 쓰지 말고 Git SHA·semver (v1.2.0)
  • 한 번 빌드 — staging·prod는 동일 digest promote
  • prod에서 재빌드하면 “같은 버전 다른 바이너리” — 재현 불가
  • K8s Deployment image: — CI가 push한 digest 참조

4. 환경 분리

레이어 dev staging production
코드/이미지 동일 아티팩트 promote 동일 동일
설정 dev ConfigMap/Secret staging values prod values
클러스터 dev cluster/namespace staging prod
데이터 mock·소량 anonymized real
  • 12-factor — 설정은 환경에, 코드·이미지는 공통 (앞서 ConfigMap·Secret)
  • ConfigMap/Secret — env별 values·External Secrets (Security)
  • namespace·cluster 분리 — blast radius 축소
  • 승인 gate — staging 통과 → prod deploy (CD Delivery)
# same image, different config per env
# staging
image: registry/my/api:abc123f
envFrom:
  - configMapRef:
      name: api-config-staging
# production — same digest, prod config only

5. Kubernetes와 CI/CD

Developer → Git push → CI (build test scan) → push image
                              ↓
                    CD → kubectl/helm → Deployment
                              ↓
                    Pod · Service · Ingress (앞서 Part 2)
K8s 리소스 CI/CD에서
Deployment CD가 image tag·replicas 갱신
ConfigMap/Secret env별 별도 apply 또는 Helm values
Ingress staging/prod 호스트·TLS 분리
HPA 배포 후 런타임 스케일 (CI와 별개)
  • CI는 클러스터 밖 (runner·agent)에서 실행되는 경우가 많음
  • CD는 kubeconfig·service account — 최소 권한 RBAC
  • GitOps (14편) — desired state를 Git에, controller가 sync

6. 실무 체크리스트

항목 권장
PR test + scan 필수, main merge 전 green
이미지 태그 SHA 또는 semver, latest prod 금지
환경 동일 아티팩트 promote, 설정만 분리
Secret CI 변수·vault, Git 평문 금지
롤백 이전 digest·Deployment rollback
관측 deploy 후 health·메트릭 (Observability)
안티패턴 문제
prod에서만 빌드 staging과 다른 바이너리
scan skip CVE 프로덕션 유입
SSH 배포 선언적·감사 불가
CI만 있고 CD 없음 수동 apply 지연·휴먼 에러

7. 정리

  • CI — 변경 통합·검증 · CD — 검증된 아티팩트 배포
  • build → test → scan → deploy — 실패 시 중단
  • 아티팩트 불변 — env는 설정·클러스터만 다름
  • K8s Deployment·ConfigMap·Secret과 CD 단계에서 만남
  • Part 3 시작 — 다음은 GitHub Actions·GitLab CI 구현

다음에 다룰 것

  • GitHub Actions와 GitLab CI
  • workflow·trigger·job·step·cache·배포 연동

해당 내용은 Production Kubernetes (O'Reilly) 및 GitHub Actions / GitLab CI 공식 문서를 참고했습니다.

'플랫폼, 데브옵스와 클라우드' 카테고리의 다른 글

배포 전략  (0) 2026.06.30
GitHub Actions와 GitLab CI  (0) 2026.06.29
스케줄링과 리소스  (0) 2026.06.27
스토리지와 StatefulSet  (0) 2026.06.26
ConfigMap과 Secret  (0) 2026.06.25