git clone과 npm install이 지연을 만듭니다. 본문은 비교표(shallow vs partial clone), npm·Homebrew 캐시와 CI 재사용, 3단계 가속 체크리스트와 복붙 명령, 흔한 실패·점검을 담았습니다. 코드·의존성 자주 풀는 개발자·CI·다국적 팀용, 실행·재현 가능합니다.
원격 Mac에서 캐시 전략이 빌드 속도에 미치는 이유
원격 Mac 노드는 데이터센터에 있어 GitHub·npm까지 네트워크 왕복이 쌓입니다. 전체 clone·콜드 npm install이 작업 시간을 잠식합니다. 캐시 전략이 없으면 매번 같은 데이터를 다시 받고, shallow·partial clone과 공유 npm·Homebrew 캐시로 전송량을 줄이고 재사용하면 피드백이 빨라집니다.
- 전체 clone: 전체 이력 다운로드; 느리고 공간 낭비.
- npm 캐시 없음: 매 작업이 같은 패키지를 레지스트리에서 가져옴.
- 캐시 + shallow/partial: 실행당 데이터 감소; CI 재사용 시 수 초 내 완료.
Git shallow clone과 partial clone 비교·파라미터
아래 표로 Git clone 전략을 선택하세요. Shallow는 깊이 제한, partial(blobless)은 커밋·트리 먼저, blob은 필요 시. 전체 이력이 없어도 되면 둘 다 초기 전송을 줄여 CI 가속.
| 항목 | Shallow clone | Partial(blobless) clone |
|---|---|---|
| 명령 | git clone --depth=1 <url> |
git clone --filter=blob:none <url> |
| 받는 데이터 | 마지막 N개 커밋만 | 모든 커밋·트리; blob은 필요 시 |
| CI 용도 | 헤드만 빌드 | 빌드 + 가끔 이력 필요 시 |
| 깊이/필터 | --depth=1(또는 10, 50) |
--filter=blob:none 또는 object:type=commit |
| 나중에 unshallow | git fetch --unshallow |
필요 시 blob 자동 fetch |
- Shallow:
git clone --depth=1 --single-branch https://github.com/org/repo.git . - Blobless:
git clone --filter=blob:none --no-checkout https://github.com/org/repo.git . && git sparse-checkout set --cone '/*' && git checkout main
npm·Homebrew 캐시 설정과 CI 환경 재사용
원격 Mac·CI 러너에 공유 캐시 디렉터리를 두고 재사용하세요. npm: .npmrc 또는 env로 cache 설정; CI는 lockfile 해시로 복원 후 npm ci. Homebrew: HOMEBREW_CACHE 설정; 이미지에 포뮬러를 넣으면 작업마다 brew install 생략 가능.
- npm:
npm config set cache /shared/npm-cache; CI에서 lockfile 해시로 복원·저장. - Homebrew:
export HOMEBREW_CACHE=/shared/brew-cache; 또는 이미지에 포뮬러 넣기.
3단계 가속 체크리스트와 실행 가능한 명령
원격 Mac·CI 러너에 아래 세 단계를 적용하세요. 복붙 후 실행 가능.
Shallow 또는 blobless clone. git clone --depth=1 --single-branch "$REPO_URL" . 또는 blobless: git clone --filter=blob:none --no-checkout "$REPO_URL" . && git sparse-checkout set --cone '/*' && git checkout "$BRANCH".
npm 캐시 설정·재사용. npm config set cache "$HOME/.npm-cache". CI: lockfile 해시로 복원 → npm ci → 저장. Homebrew도 HOMEBREW_CACHE 설정 후 CI 복원·저장.
캐시 키 일관 적용. lockfile 해시·OS·도구 버전을 키에 넣어 의존성 변경 시에만 무효화. 예: npm-${{ hashFiles('package-lock.json') }}-${{ runner.os }}.
흔한 실패 상황과 점검
- Shallow clone "remote did not send all necessary objects". shallow 미지원 시
--filter=blob:none또는--depth증가 후 재시도. - npm ECONNRESET·타임아웃. 지역 미러·
.npmrc설정; 원격 Mac은 레지스트리와 같은 리전 노드 선택. - CI 캐시 미적중. 키에 lockfile 해시 포함·설치 성공 후 저장 job 확인; 타임스탬프 등 매번 바뀌는 키 금지.
- Homebrew fetch 느림.
HOMEBREW_BREW_GIT_REMOTE·HOMEBREW_CORE_GIT_REMOTE미러 설정 또는 이미지에 포뮬러 사전 설치.