터보레포 캐시로 CI 속도 개선하기

회사에서 프론트엔드 모노레포에 터보레포를 사용하고 있다. 터보레포를 사용하고 있지만 제대로 활용하고 있지 않았는데, 터보레포를 활용해서 CI 속도를 개선한 경험을 기록한다.
Remote Cache
터보레포는 빌드 결과물을 캐싱해서 패키지가 변경되지 않았다면 캐싱된 빌드 결과물을 재사용하여 빌드 속도를 빠르게 할 수 있다.
CI에도 캐시를 적용할 수 있는데, CI 환경에서 캐시를 사용하려면 remote cache를 사용해야 한다.
Remote Cache 적용
remote cache를 활용하려면 vercel을 사용하거나 self-hosting 방식으로 사용할 수 있다.
github action cache를 이용해서 직접 self-hosting 방식을 구현해도 되지만 caching-for-turbo같은 액션을 사용하면 편하다.
아래처럼 워크플로우 파일에 간단하게 추가해주면 된다.
steps:
- name: Clone & Check repository
uses: actions/checkout@v3
- name: Setup Node.js environment
uses: actions/setup-node@v3
- name: Cache for Turbo
uses: rharkor/caching-for-turbo@v1.5
- name: Yarn install
run: yarn install --immutable
yml워크플로우를 설정했다면, CI가 수행될 때 터보레포 캐시가 저장될 것이다. 저장된 캐시는 깃헙 Actions > Caches
에서 확인할 수 있다.
그리고 다음 번 빌드에서 fingerprint(내용의 해시 값)이 같다면, 캐시를 재사용해서 빌드를 생략한다.
Github actions cache scope
github action의 캐시를 사용할 때는 보안상의 이유로 일부 캐시만 접근이 가능하다.
현재 브랜치와 기본 브랜치(보통 main
또는 master
), 그리고 PR의 베이스 브랜치에서 생성된 캐시만 사용할 수 있다.
회사에서는 트렁크 기반으로 개발하기 때문에 master
브랜치를 타켓으로 PR을 만드는데, master
브랜치의 캐시를 적절히 갱신해준다면 캐시의 hit ratio를 높일 수 있다.
그래서 master
브랜치에 커밋이 push됐을 때 각 패키지를 빌드해주는 워크플로우를 추가해서 사용하고 있다.
맺으며
변경된 패키지만 빌드하므로 체감상 CI가 꽤 빨라졌다. 그리고 CPU가 많은 고스펙의 CI 환경이라면, 빌드를 병렬로 수행해서 시간을 더 단축할 수 있을 것 같다.