본문으로 건너뛰기
Previous
Next
CI/CD 완벽 가이드 — 파이프라인·캐시·병렬 테스트·배포 전략·프로덕션 패턴

CI/CD 완벽 가이드 — 파이프라인·캐시·병렬 테스트·배포 전략·프로덕션 패턴

CI/CD 완벽 가이드 — 파이프라인·캐시·병렬 테스트·배포 전략·프로덕션 패턴

이 글의 핵심

CI/CD 파이프라인 오케스트레이션, 아티팩트 캐시, 테스트 병렬화, 블루그린·카나리·롤링 배포 전략까지 실무 심화 정리. GitHub Actions·GitLab CI·Jenkins 비교와 프로덕션 안정성 패턴 포함.

워크플로우 YAML 예쁘게 짜놓고 main에 머지될 때마다 체크 초록불 켜지는 거, 그게 다가 아님. 테스트 없는 CI는 배포 자동화일 뿐이야. 그린 뱃지가 “품질 보증”이 아니라 “빌드 끝” 신호로만 먹히는 팀 보면 진짜 답답해. 머지는 되는데 장애는 그 다음에 터지고.

예전에 비슷한 꼴 봤거든. 린트랑 npm run build만 돌리고, 통합 테스트는 “로컬에서 했으니까”로 넘어간 파이프라인. PR 올릴 땐 다들 바쁘다고 E2E 스킵한 주도 있었고. 어느 금요일 밤, 캐시 키가 꼬여서(락파일이랑 실제 node_modules가 안 맞는데도 옛 캐시를 물고 와서) CI에선 npm ci가 조용히 통과한 것처럼 보이고, 프로덕션에선 런타임에서만 터지는 모듈 버전 꼬임이 났지. 슬랙엔 “배포는 됐는데 뭐가 이상한데요?”가 연쇄로. 로그 뒤지다 보니 DAG 상으로는 deploy 잡이 build에만 needs 걸려 있고, test 잡이 실패해도(아니 아예 없어도) 그대로 갔던 구조. 그날 밤늦게 “그래서 우리 CI는 뭘 보증하냐”가 처음으로 제대로 나왔어. 실패는 파이프라인이 틀렸다고 말해주는 게 정상인데, 아무것도 안 터지면 그건 자동화가 잘돼서가 아니라 검증이 비어 있어서인 경우가 많다.

CI 엔진이 하는 일을 한마디로 줄이면, 작업을 DAG(방향 비순환 그래프)로 펼쳐서 러너에 태우는 거야. needs로 엮인 잡 하나가 죽으면 아래는 보통 스킵되게 두는 게 기본인데, 여기서 함정은 “중요한 잡”을 그래프 밖에 두거나, 실패해도 continue-on-error로 뭉개서 초록으로 보이게 만드는 패턴. 스케줄러 눈엔 “완료”인데 품질 게이트는 비어 있는 거지. 트리거 → 정책(브랜치 보호, path filter) → 잡 스케줄 → 스텝 실행 → 아티팩트·캐시, 이 흐름 안에서 “어디서 멈출지”를 먼저 설계하는 게 오케스트레이션이고, 도구가 GitHub이든 GitLab이든 말이 같아야 팀이 덜 싸워.

캐시는 빌드 빨라지게 해주는 친구인 줄 알았다가, 키 잘못 잡으면 옛날 산출물 들고와서 “로컬에선 됐는데”의 원흉이 되기도 해. 락파일 해시, 툴체인 버전, 빌드에 영향 주는 env까지 키에 섞는 이유가 그거고, 불변 아티팩트(태그·SHA·해시로 주소 잡는 산출물)는 “같은 레지스트리 URL인데 내용이 달라지는” 상황을 막으려는 거. PR에서 캐시 막 쓰기 쓰면 캐시 포이즈닝 얘기도 나옴 — 공유 캐시는 공격면이기도 하니까, 기본 브랜치에서만 쓰기, PR은 읽기만 같은 식으로 쪼개는 팀이 많지.

테스트 병렬은 Jest 샤딩, 매트릭스로 OS·런타임 쪼개기, E2E 워커 나누기 같은 식인데, 샤드 하나에 느린 시나리오만 몰리면 파이프라인 전체는 그 샤드 속도에 묶여. 그래서 유형별로 잡을 쪼개거나(단위 / 통합 / E2E), 타이밍 잡혀서 다음 실행에 골고루 퍼뜨리는 도구 쓰는 식이 나와. 플레이크 나오면 “재시도를 테스트 논리에” 붙이지 말고, 네트워크·클러스터 쪽에만 제한하는 편이 장기적으로 덜 꼬여.

배포는 결국 트래픽을 언제·어떻게 바꾸냐 문제야. 블루-그린은 환경 두 벌 쓰고 스위치 한 번에 넘기니까 롤백이 빠른 대신 자원은 세고, 스키마를 양방향 호환 없이 갈기면 박살 잘 남. 카나리는 소량만 새 버전에 흘려서 지표 보면서 키우는 거고, SLO·자동 롤백이랑 엮을 때 효율이 제일 잘 드러나. 롤링은 돈은 아끼는데 구·신이 한동안 같이 떠 있으니까 API·세션·캐시 가정이 어긋나면 배포 중에만 터지는 버그가 나와. 뭐가 됐든 헬스 프루프랑 “무슨 아티팩트가 떴는지” 추적이 없으면, 배포 자동화는 잘 죽이는 자동화로 남는다.

GitOps(원하는 상태를 Git에 두고 에이전트가 맞추기) 쓰면 CD 쪽이 선언적으로 가볍게 보이는 대신, CI는 빌드·테스트·스캔에서 여전히 두꺼워야 해. 이미지 서명이나 SBOM은 “빌드된 그게 맞는지” 끈을 잡아주는 쪽이고, DORA 말이 나오면 파이프라인 자체도 SLI 잡고 개선 루프를 돌리라는 뜻에 가깝지.


운영에서 자주 쓰는 질문들만 훑어볼게. 관측은 요청 단위 ID, 에러율·지연, 의존성 타임아웃이 보이냐. 안전은 입력 검증·권한·시크릿이 경로마다 일관하냐. 신뢰는 재시도가 멱등한 데만 가냐, 서킷 브레이커·백오프가 있냐. 성능은 캐시·배치·백프레셔가 데이터에 맞냐. 배포는 롤백·카나리·DB 마이그레이션이 룬북으로 남아 있냐. 표로 써놓을 게 아니라, 장애 나면 이 다섯 축으로 머릿속에 슥 도는지가 중요해.

뭔가 이상할 때는 최소 재현 먼저, 그다음 최근에 바꾼 것 좁히고, 환경·의존성 diff(CI vs 로컬, 컨테이너 버전 핀) 본 다음, 로그·트레이스로 가설 잡는 순서. 빌드만 깨지면 CI 로그랑 로컬 diff가 답이고, 간헐적이면 레이스·타임아웃·바깥 서비스부터 의심.


더 “버튼 누르는 쪽”으로 GitHub Actions를 보고 싶으면 GitHub Actions CI/CD 완벽 가이드랑 엮어서 읽으면 흐름이 이어져.

CI/CD, DevOps, 파이프라인, 배포, GitOps, 테스트 자동화 이런 키워드로 찾다 들어왔을 때, 위 내용이 도움이 됐으면 좋겠다.