GitLab CI에서 cache 키워드 완벽 이해하기
DevSecOps 환경에서 CI/CD의 실행 속도와 리소스 효율성을 개선하는 핵심 기술 중 하나는 바로 cache입니다. cache는 Job 실행 간 불필요한 재설치를 줄이고, 의존성 다운로드나 빌드 시간을 단축하는 데 필수적인 기능입니다.
이 글에서는 GitLab CI의 cache 키워드에 대한 구조적 설명과 실무 적용 사례, 주의할 점까지 모두 정리해드립니다.
1. cache란 무엇인가
개념
cache는 Job 간 공유되는 파일 또는 디렉터리를 로컬 또는 GitLab Runner의 저장소에 저장하여, 다음 Job에서 재활용할 수 있도록 하는 기능입니다. 일반적으로 빌드 툴의 의존성 폴더(.m2, node_modules, pip cache 등)를 캐싱하는 데 사용합니다.
이는 artifacts와 달리 결과물 보존이 아니라 속도 최적화가 목적입니다.
2. 기본 문법과 구조
cache:
key: some-cache-key
paths:
- .m2/repository
- target/
주요 필드 설명
- paths: 캐시할 디렉터리 또는 파일 경로 목록
- key: 캐시 식별자. 동일한 key를 가진 Job 간에 캐시가 공유됩니다
- policy: pull-push, pull, push 중 선택. 캐시의 업로드/다운로드 동작을 제어합니다
3. 실무 사용 예시
3.1. Java Maven 프로젝트
stage: build
script:
- mvn install
cache:
key: maven-cache
paths:
- .m2/repository
→ .m2/repository에 저장된 Maven 의존성 라이브러리를 캐시하여 매 빌드 시 다운로드 생략.
3.2. Python 가상환경 의존성 캐시
key: pip-cache
paths:
- ~/.cache/pip
job:
script:
- pip install -r requirements.txt
→ 보안 스캐닝 도구나 테스트 툴 설치 시간이 줄어듭니다.
3.3. 동적 키 활용
key: "$CI_COMMIT_REF_SLUG"
paths:
- node_modules/
→ 브랜치별로 서로 다른 캐시를 유지. 실험적인 브랜치와 main 브랜치가 캐시를 섞지 않도록 할 수 있습니다.
4. cache vs artifacts
목적 | 속도 향상 (의존성 재사용) | 결과물 전달 및 보존 |
저장 위치 | Runner에 로컬 또는 S3 등 외부 캐시 | GitLab 서버 (UI에서 다운로드 가능) |
Job 간 공유 | 명시적 키로 브랜치/Runner 간 공유 가능 | Job 간 직접 전달 (dependencies 필요) |
수명 관리 | 오래 보존되며 명시적 삭제 없음 | 기본 30일, expire_in으로 제어 |
→ 정적 의존성은 cache, **리포트나 중간 산출물은 artifacts**가 원칙입니다.
5. 주의사항 및 Best Practice
5.1. Runner 간 캐시 공유 제한
Runner가 공유 캐시 저장소(S3, NFS 등)를 사용하지 않으면 Runner 간 cache 공유가 되지 않습니다. 즉, 같은 키여도 캐시를 못 찾는 경우가 발생합니다.
대응 방법
- S3 캐시 백엔드 구성 고려
- Job 단위로 fallback 처리 로직 삽입
5.2. 캐시 오염 방지
동일한 key를 여러 Job이 동시에 사용할 경우, 캐시가 깨지거나 의존성이 꼬일 수 있습니다.
대응 방법
- 커밋 해시나 브랜치명 기반으로 동적 키 구성 ($CI_COMMIT_REF_SLUG, $CI_COMMIT_SHA 등)
- policy: pull 설정으로 캐시 덮어쓰기 방지
5.3. DevSecOps 맥락에서의 응용
- SAST, DAST 도구 의존성 캐싱: 반복 설치를 줄이고 스캔 속도 향상
- Terraform 모듈 다운로드 캐싱: ~/.terraform.d 또는 .terraform 폴더를 캐싱하여 plan/apply 속도 개선
- 정적 파일 분석 도구 캐시: Trivy, Grype 등의 DB 다운로드를 캐시하여 초기 실행 시간 단축
결론
GitLab CI에서 cache는 단순한 속도 향상 기능이 아니라, 실질적으로 CI 리소스 최적화와 생산성 향상에 기여하는 핵심 도구입니다. 특히 DevSecOps처럼 반복적으로 스캐닝, 빌드, 테스트가 이루어지는 환경에서는 정확한 키 전략과 경로 설정이 성능에 큰 영향을 미칩니다.