TypeScript CI/CD

빠른 배포보다 먼저 멈출 기준을 세운다

Monorepo 파이프라인은 server와 client를 함께 검증한다. 안정화의 핵심은 캐시로 속도를 줄이면서도, 태그·마이그레이션·롤백·알림을 배포 게이트로 분리하는 것이다.

속도 의존성 캐시와 Docker layer cache로 반복 작업을 줄인다.
추적 latest 대신 커밋 SHA 태그와 배포 로그를 남긴다.
복구 헬스 체크 실패 시 이전 이미지로 되돌릴 절차를 둔다.

릴리스 경로별 통과 조건

CI · image · schema · deploy · observe
01 CI 빌드와 테스트가 같은 커밋을 검증
통과 신호 server/client build, test, lint가 모두 성공한다.
가속 장치 pnpm store와 Docker layer cache를 재사용한다.

실패하면 deploy job은 시작하지 않는다.

02 Image 이미지 태그가 롤백 지점을 만든다
통과 신호 server와 client 이미지가 SHA 태그로 push된다.
추적 기준 배포 로그가 이미지 태그, 커밋, 워크플로 실행을 연결한다.

latest만 있으면 장애 시 되돌릴 근거가 약하다.

03 Schema 마이그레이션은 배포 순서와 호환되어야 한다
통과 신호 이전 버전과 새 버전이 동시에 살아도 데이터가 깨지지 않는다.
점검 대상 nullable 추가, backfill, 제거 순서를 분리한다.

되돌릴 수 없는 변경은 별도 승인 지점으로 둔다.

04 Deploy Secrets와 환경 변수를 배포 단계에서만 주입
통과 신호 staging과 production 변수가 분리되어 있고 로그에 새지 않는다.
실행 기준 컨테이너 재시작 정책, 포트, 헬스 체크를 함께 적용한다.

환경 차이가 있으면 배포보다 설정 검증이 먼저다.

05 Observe 배포 후 관측과 롤백을 같은 절차로 묶기
통과 신호 헬스 체크, 에러율, 응답 시간이 안정 범위에 있다.
복구 기준 알림을 받은 사람이 이전 태그로 재배포할 수 있다.

관측 없는 자동 배포는 실패를 늦게 알게 만든다.

위험 요소별 대응

guardrails
cache

느린 빌드

package filter와 캐시 키를 분리해 변경된 범위만 다시 계산한다.

env

환경 차이

development, staging, production의 변수 출처를 명확히 나눈다.

schema

DB 변경

앱 버전과 DB 버전이 엇갈리는 구간을 먼저 설계한다.

notice

늦은 대응

워크플로 실패와 배포 후 장애를 Slack, 이메일, 이슈로 연결한다.

배포 직전 세 질문

release review
무엇이 막는가 테스트 실패, 마이그레이션 위험, secret 누락의 중단 기준을 정한다.
무엇으로 확인하는가 헬스 체크, 로그, 대시보드, 알림 채널을 배포 절차에 묶는다.
어디로 되돌리는가 성공했던 이미지 태그와 이전 설정값을 바로 찾을 수 있게 둔다.