Next.js 코어 팀이 Rust 기반 SWC 도입 후 멀티플랫폼 바이너리 빌드가 릴리스 파이프라인의 병목이 된 문제를 Turborepo Remote Caching으로 해결해 배포 시간을 80% 단축했다. 바이너리 커밋·개발용 바이너리·CI 레벨 캐싱 등 여러 접근법의 실패 원인을 분석하고, Remote Caching이 이를 근본적으로 해결한 방식을 상세히 설명한다.
핵심 포인트- 문제: Next.js 12에서 SWC 도입 후 멀티플랫폼 Rust 바이너리 컴파일이 릴리스 CI의 주요 병목으로 부상
- 1차 실패: SWC 바이너리를 git에 직접 커밋 → 레포 크기 폭증 + git clone 속도 저하로 철회
- 2차 실패: CI 레벨 캐싱 → 높은 캐시 미스율과 CI 캐시 제거 정책으로 불안정
- Remote Caching의 핵심: 태스크 입력(소스, 의존성, 환경변수, `--target` 플래그) 기반 해시로 플랫폼별 캐시 정확히 구분
- 영구 스토리지: 해시 기반 저장소는 CI 정책에 의한 캐시 제거 없이 과거 빌드도 복원 가능
- 사전 시딩 GitHub Action: 코드 변경 시 자동으로 SWC 바이너리를 미리 빌드해 논블로킹 + 조기 실패 탐지
상세 정리- Next.js 12에서 Rust 기반 SWC 도입으로 개발자 경험은 크게 향상됐으나, 멀티플랫폼 Rust 바이너리 컴파일이 릴리스 파이프라인의 새로운 병목으로 등장
- 1차 접근: 컴파일된 SWC 바이너리(Windows, Mac, Linux)를 레포에 직접 커밋 → 카나리 없이 테스트 가능하나 레포 크기 폭증 + clone 속도 저하로 철회
- 2차 접근: 개발용 바이너리로 전환 → 빌드 시간 소폭 개선이나 팀 불만족
- 3차 접근: CI 레벨 캐싱 → CI 캐시 제거 정책으로 높은 캐시 미스율 + 플랫폼 처리 차이로 카나리/스테이블 릴리스 실패 발생
- Turborepo Remote Caching 도입: 태스크 입력 기반 해시로 캐시 키 생성, `--target` 플래그를 입력에 포함시켜 플랫폼별 바이너리 혼재 문제 해결
- 영구 스토리지: 해시 기반 저장소는 내용 주소 방식이라 CI 정책에 의한 캐시 제거 없음, 과거 빌드도 해시만 알면 언제든 복원 가능
- 사전 시딩 GitHub Action: 코드 변경 감지 시 SWC 바이너리 빌드를 자동 트리거, 릴리스 프로세스와 독립적으로 백그라운드에서 진행
- 논블로킹 빌드: 사전 시딩이 개발 플로우와 독립적으로 진행되어 릴리스 대기 시간 없음
- 조기 실패 탐지: 실제 카나리 릴리스 도중이 아닌 사전 빌드 단계에서 플랫폼별 컴파일 문제를 먼저 식별
- FreeBSD 빌드 지원, 버전 변경 시 캐시 유효성 보존 등 팀 특수 요구사항을 위한 커스텀 스크립트 작성
- Remote Cache 히트 시 릴리스 배포 시간 80% 단축, 개발 이터레이션 속도 및 내부 개발·최종 사용자 기능 전달 가속화
왜 읽나CI/CD 파이프라인에서 네이티브 바이너리 빌드가 병목이 되는 문제에 직면한 팀에게 실용적인 해결책을 제시한다. Turborepo Remote Caching의 설계 원리(해시 기반 영구 저장소, 태스크 입력 기반 캐시 키)와 기존 CI 캐시 대비 장점을 이해하면 자체 빌드 파이프라인 최적화에 바로 적용할 수 있다.