대상: 국경 링크로 원격 Mac CI를 돌리는 빌드 엔지니어.
요약: shallow로 베이스를 고정하고 bundle 슬라이스로 객체를 이입한 뒤 alternates로 미러를 공유합니다. 표·카드·명령·캐시 키가 한 흐름입니다.
연관: OCI 매트릭스,
Gradle 캐시,
홈.
객체 전송이 흔들릴 때 반복되는 세 가지 병목
- 지터: 팩 협상이 길어지면 중간 끊김 비용이 큽니다.
- 얕은 범위: 브랜치를 넓히면 캐시 키가 흔들립니다.
- 중복: 워커마다 풀 미러를 복제하면 디스크와 링크가 낭비됩니다.
국경 불안정 대역폭 시나리오에서 왜 팩 전송이 자주 실패하는가
꼬리 지연이 길면 속도가 잠깐 나와도 타임아웃이 납니다. 얕은 클론으로 트리를 고정하고 필요한 커밋만 번들로 밀어 넣는 이중 단계가 안전합니다. 재시도 지표와 번들 검증 실패를 한 화면에 올려 원인을 나눕니다.
번들 슬라이스 전략으로 큰 푸시를 잘게 나누기
기간이 명확하면 주간 슬라이스가 읽기 쉽습니다. 파일명에 날짜를 붙이고 검증 실패 시 접미사만 바꿉니다.
git bundle create weekly-$(date +%Y%m%d).bundle --since=1.week --all git bundle verify weekly-$(date +%Y%m%d).bundle
객체 저장소 재사용과 alternates로 디스크·링크 비용 줄이기
공유 미러의 objects 경로를 alternates 한 줄로 가리키면 팩 재전송을 줄입니다. 미러가 밀리면 번들로 빈 구간을 채웁니다.
git clone --reference /Volumes/cache/git-mirror/REPO.git \ --dissociate --filter=blob:none --single-branch --depth=1 \ https://git.example.com/REPO.git work
전송 방식 비교와 의사결정 매트릭스
| 방식 | 적합 | 리스크 |
|---|---|---|
| 직접 fetch | 안정 링크·캐시 있는 상시 러너 | 국경 지터에 협상 반복 |
| 번들 이입 | 대용량 델타를 파일로 검증 | 생성 시각과 러너 시각 차 |
| shallow plus 번들 | 초기 최소 이후 보강 | 깊이·브랜치 미기록 시 캐시 흔들림 |
대역폭 불안
슬라이스 우선·짧은 타임아웃·낮은 동시성.
재현성
번들 해시·깊이·브랜치를 캐시 키에 넣습니다.
복붙 가능한 실행 순서와 검증 단계
- 미러:
git clone --mirror를 공유 스토리지에 둡니다. - 얕은 작업:
git clone --filter=blob:none --single-branch --depth=1로 브랜치를 고정합니다. - 번들:
git fetch ./delta.bundle '+refs/*:refs/remotes/bundle/*'로 합칩니다. - 검증:
git rev-parse HEAD와 기대 해시를 맞추고git cat-file -t로 타입을 봅니다. - 로그: 번들 파일명과 depth 를 남깁니다.
git -c http.lowSpeedLimit=1000 -c http.lowSpeedTime=60 \ fetch --prune --no-tags origin
실패 재시도 파라미터와 CI 캐시 키 설계
저속 한계로 무한 대기를 막고 캐시 키에 미러 스냅 해시·깊이·브랜치·번들 체크섬을 넣어 오염을 막습니다.
export GIT_HTTP_LOW_SPEED_LIMIT=5000 export GIT_HTTP_LOW_SPEED_TIME=120 git fetch origin --depth=50 --no-tags
- 번들마다 체크섬을 메타데이터에 남깁니다.
- 리전별 풀이면 키 접두에 리전 코드를 붙입니다.
- 동일 명령 세 번 백오프 후 새 번들로 전환합니다.
인용 가능한 운영 수치와 정책 문장
- 초기 깊이는 일로 고정하고 필요 시 오십까지 단계 확장합니다.
- 슬라이스 파일은 이백 메가바이트 이하를 권장합니다.
- 동시 fetch 는 러너당 이 세션 이하로 제한합니다.