1. 왜 캐시 최적화인가?
CI 시간이 느리면:
• 피드백 루프 지연 → 개발 속도 저하
• 병렬 러너 비용 증가
• 개발자 경험(DevEx) 악화
캐시 전략이란 CI에서 *“한번 계산한 것 다시 하지 않기”*를 구현하는 핵심입니다.
Node.js, Python, Rust 등 빌드 시 종속성, Docker 이미지, 테스트 결과를 적극 캐싱하면
빌드 시간 50~90% 단축도 가능합니다.
⸻
2. 종속성 캐싱 기본: Node.js 예시 (actions/cache)
- name: Cache Node.js modules
uses: actions/cache@v3
with:
path: ~/.npm
key: npm-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
npm-
핵심:
• key: lock 파일 해시로 정확한 변경 감지
• restore-keys: fallback 키로 유사 버전 복원 가능
• path: 실제 캐시 대상 폴더 (.npm, pip, cargo, .gradle, 등)
⸻
3. 고급 패턴 ① Docker 레이어 캐싱
GitHub Actions의 build-push-action을 사용한 Docker 캐시 최적화:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Cache Docker layers
uses: actions/cache@v3
with:
path: /tmp/.buildx-cache
key: docker-${{ runner.os }}-${{ hashFiles('**/Dockerfile') }}
restore-keys: docker-
- name: Build and Push
uses: docker/build-push-action@v5
with:
context: .
push: false
tags: myapp:ci
cache-from: type=local,src=/tmp/.buildx-cache
cache-to: type=local,dest=/tmp/.buildx-cache
효과:
• 각 단계별 레이어 캐싱 → 베이스 이미지 업데이트 없이 무효화 방지
• /tmp/.buildx-cache 로컬 경로 재사용 가능
⸻
4. 고급 패턴 ② 테스트 결과 캐싱
jest, pytest, cargo test 등은 이전 테스트 성공 데이터를 캐시해 실행 생략 가능
예: Jest
{
"cacheDirectory": "./.jest-cache"
}
- name: Cache Jest Results
uses: actions/cache@v3
with:
path: .jest-cache
key: jest-${{ hashFiles('**/*.test.js') }}
restore-keys: jest-
⸻
5. 고급 패턴 ③ 병렬 워크플로우 간 캐시 공유 (artifact 활용)
다른 워크플로우에서 미리 빌드한 결과를 artifact로 업로드 → 다른 Job에서 재사용
# Job A: Upload
- name: Upload Build
uses: actions/upload-artifact@v3
with:
name: app-binary
path: ./build/app
# Job B: Download
- name: Download Build
uses: actions/download-artifact@v3
with:
name: app-binary
path: ./build
⸻
6. 캐시 무효화 조건 튜닝
잘못된 key 전략 = 캐시 미스 유발 or 오염
• hashFiles('**/package-lock.json'): 권장
• runner.os 포함 시 플랫폼별 분리
• restore-keys: 다소 느려도 fallback 고려
Tip: 브랜치 별로 캐시 분리하고, main 기준 재활용
⸻
7. 캐시 최적화 측정 기준
• Cache hit/miss 로그 주기적 모니터링
• Job 실행 시간 비교 (빌드, 테스트 등)
• Storage 소비량 → 캐시 정리 정책 수립 (gh cache delete)
⸻
결론
GitHub Actions에서의 캐시 전략은 단순히 빠르게 하는 차원을 넘어
조직 전체의 개발 생산성과 인프라 비용에 영향을 주는 운영 기술입니다.
CI 병목이 발생하거나 러너 비용이 과도하다면,
도커·종속성·테스트 결과까지 전방위적으로 캐싱하는 전략이 필수입니다.
단, 무분별한 캐시는 상태 오염/디버깅 난이도를 높일 수 있으므로
명확한 키 설계 + 주기적 캐시 정비가 핵심입니다.
⸻
필요하시면 GitHub Actions에서 cache와 artifact를 조합한 모놀리식 → 마이크로서비스 전환 시의 캐시 계층화 전략도 이어서 제공해 드릴 수 있습니다.
카테고리 없음