iOS·macOS 플랫폼 엔지니어와 CI 운영자가 빌드 풀을 싱가포르, 일본, 한국, 홍콩, 미국 동부, 미국 서부에 펼치면 Xcode 이전에 병목이 자주 납니다. pod install, pod repo update, swift package resolve는 잘못된 소스, 기본 타임아웃, 공유 캐시 경계가 겹치면 큐 전체 사고로 터집니다. 이 글은 재현 가능 클린 빌드 가이드와 Git·아티팩트 근접 매트릭스와 역할을 나눕니다. RCA에 넣을 수 있는 의존성 통증 여섯 클래스, 공식·미러·프라이빗 레지스트리 대조표 둘, 리전별 이그레스·재시도 표, 복사용 명령 블록, 여섯 단계 런북, 대시보드 지표 세 가지를 담고, 1TB/2TB 확장 판단에 쓰는 디스크 임계값을 같은 검토 페이지에 둡니다.
풀링된 원격 Mac은 로테이션하고, 동시 job 간에 캐시 디렉터리를 공유하며, 리전마다 이그레스 정책이 달라집니다. 모든 타임아웃을 「불안정한 네트워크」로만 라벨하면 버스트 대여 시간을 태웁니다. 다음 신호를 변경 티켓에 적고 러너 태그·계약 마일스톤 옆에서 검토하십시오.
Podfile.lock이나 Package.resolved는 해결 결과를 고정하지만, CI가 개발자 노트북과 다른 spec 엔드포인트·Git URL·레지스트리 호스트를 치면 「같은 라벨, job마다 다른 결과」가 됩니다.curl급 타임아웃이 몰리고 CPU는 놀며 대기열만 쌓입니다.CI=true, 키체인 계약, netrc 패턴이 없으면 GUI 세션에서는 되는 프라이빗 pod·SPM 저장소가 CI에서만 실패합니다.git·HTTP 작업에는 RTT를 고려한 한계가 필요합니다. 야간 job에 대화형 기본값을 그대로 물려주지 마십시오.이 항목들을 재현 가능 빌드 글과 겹쳐 읽으십시오. 그 글은 컴파일러와 파생 데이터 뷰를 고정하고, 이 글은 resolver 경로와 캐시 경계를 고정합니다. 아티팩트 근접은 무엇을 가져올지, 이 플레이북은 어디서 가져올지, 재시도가 어떻게 백오프할지, 캐시를 어디에 둘지를 정합니다.
만능 「최선」 소스 전략은 없습니다. 컴플라이언스·감사 가능성·롤백에 맞는 전략만 있습니다. 조달·설계 리뷰에 그대로 붙이십시오.
| 전략 | 신호 | 이점 | 리스크·계약 메모 |
|---|---|---|---|
| 공식 trunk·기본 SPM 해결 | 대부분 공개 의존성, 직접 인터넷 허용 정책 | 움직이는 부품 최소, 커뮤니티 기본과 일치 | 리전 지터에 백오프 없음. 파이프라인에 타임아웃을 코드화하고 암묵 지식에 두지 않음 |
| 엔터프라이즈 미러 또는 프라이빗 spec·레지스트리 | 감사 추적, 고정 스냅샷, 규제 이그레스 | 재현 가능한 pull, 공개 경로 비활성화 가능 | 오래된 메타데이터가 「로컬은 통과, CI는 실패」를 만듦. 미러 갱신 SLA 정의 |
| 공식+허용 목록 미러 하이브리드 | CDN 품질이 리전마다 다른 멀티리전 풀 | 완전 프라이빗화보다 저렴하게 리전별 템플릿 전환 | 템플릿 드리프트. 「리전→소스 맵」을 러너 라벨에 묶음 |
| 풀 벤더 또는 오프라인 번들 | 에어갭 또는 일회성 납품 | 결정성 최대 | 업데이트 비용 큼. 빠른 보안 패치에는 부적합 |
범위를 명시하십시오. 플레이스홀더는 자사 mtr나 파이프라인 백분위로 바꾸고, 기본값을 맹목적으로 복사하지 마십시오. 멀티리전·대여 조건 가이드와 함께 검토해 지연과 인보이스가 한 마일스톤을 공유하게 하십시오.
| 시나리오 | 전형적 증상 | 첫 조치 | 디스크·SKU 연결 |
|---|---|---|---|
| 리전 A 빌더, 리전 B에 Git·레지스트리 습관 | 꼬리 긴 git fetch, 간헐적 SPM resolve | 의존성 핫패스를 빌더 근처로 옮기거나 에지 캐시 추가. GIT_HTTP_LOW_SPEED_LIMIT 조정·동시성 상한 | CPU 전에 네트워크 최적화. M4 Pro 업셀 전 디스크 건강 확인 |
| CocoaPods CDN 지터 | job 전반에 curl 타임아웃 뭉침 | 미러나 프라이빗 캐시로 페일오버. 백오프 있는 파이프라인 재시도 | 동시 다운로드가 쓰기 부하 급증—1TB 호스트 주시 |
| 인증이 필요한 프라이빗 pod·SPM | 401/403 또는 CI에서만 행 | netrc, SSH 에이전트, OIDC 토큰 표준화. 대화형 GUI 의존 금지 | SSH 대 VNC 가이드의 전용 CI 사용자와 짝지음 |
| 손상 캐시·오래된 락 | 수동 퍼지 후 완화, 고병렬에서 재발 | job별 캐시 접두사 또는 격리 계정. 자동 정리 게이트 | 매트릭스 폭을 좁힌 뒤에만 2TB·전용 캐시 노드 검토 |
# CocoaPods: 비대화 플래그와 CDN 소스(URL은 정책에 맞게 교체) export COCOAPODS_DISABLE_STATS=true export CI=true pod install --verbose --no-repo-update # repo 업데이트는 전용 job에서—매 매트릭스 샤드마다 돌리지 않음 # pod repo update trunk # SPM: 해결 추적과 캐시 발자국(Xcode/SwiftPM 경로 확인) swift package resolve -v 2>&1 | tail -n 50 du -sh ~/Library/Caches/org.swift.swiftpm 2>/dev/null du -sh ~/Library/Developer/Xcode/DerivedData 2>/dev/null # Git 꼬리: 스로틀 예(RTT에 맞게 조정, 아티팩트 가이드와 병행) export GIT_HTTP_LOW_SPEED_LIMIT=1000 export GIT_HTTP_LOW_SPEED_TIME=60
경고: 미러는 지연을 줄이지만 메타데이터 편차를 줄 수 있습니다. Podfile.lock·Package.resolved와 미러 스냅샷 시각을 함께 검토하고, 느린 미러를 앱 회귀로 잘못 라벨하지 마십시오.
러너와 시크릿은 셀프호스티드 러너 체크리스트를 따른다고 가정합니다. 분리가 안 되어 있으면 먼저 그것을 고치십시오.
pod install·resolve P95, 실패 분류(TLS, 401, 5xx, 타임아웃), 주간 디스크 성장을 추적합니다. 데이터 없이 새 리전 추가 금지.이 지표는 「느린 빌드」를 실행 가능한 버킷으로 바꾸며 디스크 모니터와 함께 알림을 걸어야 합니다.
빌더 리전이 주 Git 리전과 맞지 않는지 여부도 불리언으로 저장하고, 지속적으로 false면 영웅적 재실행이 아니라 대여 배치 FinOps 리뷰를 트리거합니다.
참고 틀(벤치마크 아님): 콜드 해결·넓은 매트릭스는 주에 수십 GB 캐시 증가를 더할 수 있습니다. 무제한 병렬을 받기 전에 1TB SKU에는 재사용 정책을 명시하십시오.
개인 스크립트는 감사에 약하고 리전이 바뀌면 깨집니다. 무인 풀에는 「의존성이 설치됨」과 「매번 같은 의존성 그래프」가 다른 SLA입니다. 계약급 Apple Silicon CI에는 소스 템플릿, 디스크 텔레메트리, 인보이스를 한 워크시트에 담을 수 있는 전용 베어메탈, 멀티리전 배치, 조합 가능한 대여 조건이 필요합니다.
캐시 분리나 소스 맵 없는 단기 대여는 resolver 꼬리를 메인 풀 전체로 방송합니다. 안정 이그레스, 감사 가능 캐시 정책, 버스트 친화 규모가 필요한 팀은 즉흥 하드웨어보다 프로 Mac 클라우드가 유리한 경우가 많습니다. MACCOME은 싱가포르·일본·한국·홍콩·미국 동부·미국 서부에서 Mac mini M4·M4 Pro 베어메탈 노드를 유연한 조건으로 제공합니다. Git·레지스트리 습관에 맞춘 베이스·버스트 층으로 쓰고 대여 요금·리전 페이지로 확정하십시오.
파일럿 팁: 저장소가 이미 있는 곳에서 단기 대여, 헬스 블록과 이주일 베이스라인을 돌린 뒤 월간 조건이나 2TB를 결정합니다. 「저렴한 리전」 스왑으로 예측 불가 resolver 그래프를 사지 마십시오.
FAQ
재현 가능 클린 빌드 글과 어떻게 다른가요?
그 글은 Xcode·CLT·DerivedData·키체인 뷰를 고정합니다. 이 글은 CocoaPods·SPM 소스, 미러, 캐시 경계를 고정합니다. 예산은 대여 요금과 멀티리전 가이드를 같은 마일스톤에서 여십시오.
미러 먼저인가, 디스크 먼저인가?
실패가 타임아웃·5xx로 뭉치면 소스와 재시도를 조입니다. 위생 후에도 사용률이 ~85% 위에 머무르면 1TB→2TB나 전용 캐시 호스트를 계획합니다. 세부는 고객 센터를 참고하십시오.
아티팩트 근접과 어떻게 짝을 이룹니까?
아티팩트 근접은 레지스트리·Git 리전을 고릅니다. 이 플레이북은 pod·SPM 다운로드 경로와 캐시를 고릅니다. 같은 변경 패키지에 둘 다 넣으십시오.