피드로 돌아가기
뱅크샐러드 기술블로그DevOps
원문 읽기
뱅크샐러드 Web chapter에서 GitHub Action 기반의 CI 속도를 개선한 방법
뱅크샐러드 웹팀이 GitHub Action 의존성 캐싱, Job 병렬화, 변경사항 기반 테스트로 CI 실행시간을 5분에서 40초로 단축
AI 요약
Context
GitHub Action에서 매 push마다 실행되는 CI 워크플로우의 의존성 설치에 5분 이상이 소요되고 있었다. 20명의 개발자가 각각 3분의 action을 기다린다면 월간 1시간 이상의 생산성 손실이 발생한다.
Technical Solution
- 의존성 캐싱:
actions/cache@v3를 사용하여node_modules디렉토리를package-lock.json해시값을 키로 캐싱하고, 변경이 없으면 캐시된 데이터 사용 (설치 시간: 5분 8초 → 21초) - Job 병렬화: lint, test, build를 단일 job의 순차적 step에서 3개 job으로 분리하여 병렬 실행 (전체 실행시간: 30초 → 10초)
- 변경사항 기반 테스트:
git diff를 사용한 lint 스크립트와 Jest의--changedSince=origin/main옵션으로 수정된 파일만 검증 (작은 변경사항 기준: lint 26초, test 2분 18초 단축) - Nx 도구 활용: Nx의
nx affected명령어로 변경사항의 영향범위를 자동 계산하고 C++/Node.js 기반의 내부 캐싱으로 이전 실행 결과 재사용 - 브랜치별 격리된 캐시 전략: GitHub Action의 각 브랜치에서 독립적으로 캐시를 생성하여 2번째 commit부터 캐시 활용 가능
Impact
- 의존성 설치 시간: 1분 8초 → 21초 (약 68% 단축)
- 전체 CI 실행시간: 3분 이상 → 40초 (약 87% 단축)
- 작은 변경사항 기준 lint 단계: 26초 단축
- 작은 변경사항 기준 test 단계: 2분 18초 단축
Key Takeaway
Node.js 기반 프로젝트의 GitHub Action CI에서 의존성 캐싱, Job 병렬화, 변경사항 기반 테스트의 3가지를 조합하면 개발자당 월 1시간 이상의 대기시간을 제거할 수 있다. 복잡한 캐싱 로직은 Nx와 같은 전문 도구에 위임하는 것이 유지보수 오류를 줄인다.
실천 포인트
GitHub Action을 사용하는 Node.js 프론트엔드팀에서 `actions/cache@v3`로 node_modules를 package-lock.json 해시값으로 캐싱하고, lint/test/build를 별도 job으로 분리하여 병렬 실행하며, Jest `--changedSince` 옵션으로 변경사항만 검증하면 CI 실행시간을 기존 대비 70~87% 단축할 수 있다.