CI/CD 파이프라인 최적화: 의존성 캐싱으로 빌드 시간 절약하기
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
DevOps
대상자
- 개발자/DevOps 엔지니어: CI/CD 파이프라인의 느린 빌드 시간 문제를 해결하고자 하는 중급 이상의 개발자
- 난이도: 중급 (CI/CD 도구와 캐싱 전략에 대한 기본 지식 필요)
핵심 요약
- 의존성 캐싱 적용:
node_modules
/.venv
/.m2
등 의존성 디렉터리 캐싱으로 빌드 시간 70% 감소 가능 - 스테이지 분리 전략:
dependencies
/build
/test
스테이지 분리 후 중복 빌드 제거 - 캐시 키 최적화:
hashFiles('package-lock.json')
사용으로 의존성 변경 시 자동 캐시 무효화
섹션별 세부 요약
1. CI/CD 파이프라인의 주요 병목 현상
- 의존성 설치 시간: 대부분의 빌드 시간이
npm install
/pip install
등 의존성 설치에 소모 - 중복 작업: 작은 코드 수정 시 전체 프로젝트 재빌드로 15분 대 10초의 시간 낭비
- 캐시 미사용: 매번
node_modules
/.venv
재설치로 컴퓨터 자원 낭비
2. 의존성 캐싱 구현 방법
- Node.js 예시:
```yaml
- name: Cache node_modules
uses: actions/cache@v3
with:
path: node_modules
key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}
```
- 다른 언어 지원:
- Python: ~/.cache/pip
or .venv
- Java: ~/.m2
or .gradle/caches
- Ruby: vendor/bundle
3. 파이프라인 스테이지 분리 전략
- 스테이지 구조:
```yaml
stages:
- dependencies
- build
- test
```
- 캐시 공유:
- dependencies
스테이지에서 node_modules
설치 후 build/test
스테이지에서 캐시 재사용
- policy: push
(업로드) / policy: pull
(다운로드) 설정
4. 고급 캐싱 패턴
- Fallback Cache: 정확한 키 없을 시
restore-keys
로 기본 캐시 복구 - 병렬 작업 캐싱:
```yaml
jobs:
test:
strategy:
matrix:
os: [ubuntu-latest, macos-latest]
cache:
key: ${{ matrix.os }}-node-${{ hashFiles('package-lock.json') }}
```
- 모노레포 캐싱:
frontend-${{ hashFiles('apps/frontend/package-lock.json') }}
로 서브프로젝트 범위 제한
5. 주의사항 및 최적화 팁
- 과도한 캐싱:
build/
디렉터리(이진 파일) 등 대용량 데이터는 캐싱 금지 - 캐시 무효화:
hashFiles
로 의존성 변경 시 자동 캐시 무효화 - GitLab 정책:
pull-push
vspull
설정 오류로 성능 저하 가능성
결론
- 핵심 팁:
hashFiles
로 캐시 무효화,node_modules
캐싱으로 70% 빌드 시간 절약 - 실무 적용:
npm install
/pip install
의존성 설치 작업에 캐싱 적용, 스테이지 분리 후 CI/CD 비용 40% 감소 가능 - 도구 추천: GitHub Actions
actions/cache@v3
사용,CI_COMMIT_REF_SLUG
키로 다중 환경 지원