통증: 캐시 동기화는 부차 이슈가 아니다
통증 1: DerivedData를 정적 폴더로 취급.중간 인덱스·모듈 캐시·Swift 프런트 상태가 rsync 성공 중에도 반쯤 일관될 수 있고 재컴파일 랜덤 성공이 레이스를 가립니다.
통증 2: 컴파일러 캐시와 워크스페이스 전체를 한 프로필로.ccache·sccache는 형태가 읽기 쉬운 반면 DerivedData는 Xcode 마이너·Swift 툴체인·플러그인·플래그에 강하게 묶여 업그레이드 후 한 설정이 무너집니다.
통증 3: 한 볼륨에서 CI 매트릭스가 겹침.sqlite와 잠금 디렉터리에서 충돌합니다. SSH 전송 건강이 컴파일 건강을 뜻하지 않습니다.
통증 4: APFS 의미를 무시.xattr·권한은 디스크 간에도 물립니다. 먼저 APFS 매트릭스를 읽으세요.
통증 5: 더러운 캐시 플레이북 부재.매시간 전부 삭제 혹은 영구 보관의 극단. 번호 롤백 카드를 아티팩트 매니페스트와 맞추고 캐시는 볼륨 델타로 다룹니다.
통증 6: GUI SFTP를 운영 동기화로.스팟에는 좋으나 재현성은 약합니다. 호스트 핀과 OIDC와 세트로 설계하세요.
통증 7: 아티팩트 승격과 캐시 예열 혼선.서명 트리는 휘발 캐시와 쓰기 가능한 동일 루트를 공유하면 안 됩니다.
위협 모델: 두 신뢰 사슬
아티팩트는 감사·암호 검증·원자 릴리스 롤백을 요구합니다. 캐시는 빨리 실패하고 지워도 되며 서명 번들만 오염시키지 않으면 콜드 빌드로 떨어져도 됩니다.
볼륨이나 SSH 계정으로 물리 분리하면 조사가 빨라집니다. WAN 지연은 rsync 스캔 비용을 키우므로 캐시 레인과 아티팩트 레인의 대역 예산을 나눕니다. 축출 권한과 티켓을 문서화하고 partial 잔여는 용량을 모니터링합니다.
분기마다 스테이징 Mac에서 롤백 카드를 연습하고, 관측성으로 콜드·웜·강등 캐시를 라벨링합니다.
측정 기준선: 논쟁을 끝내는 수치
클린·웜 시간, ccache 적중, sccache 큐, DerivedData 기울기, 종료 코드, partial 잔여, 동시 작업 수, 플레이크 밀도를 추적합니다.
Xcode 변경마다 골든 프로젝트를 재실행하고 rsync --version을 로그에 묶습니다. 시간은 스캔·델타·네트워크·fsync로 쪼갭니다.
캐시 이상이 자격 증명 로테나 호스트 키 변경과 같은 주면 설정을 한꺼번에 돌렸는지 의심합니다. 캐시 디렉터리를 온라인·배수·동결·퇴역 상태로 다루고 FinOps는 egress와 ingress를 분리합니다.
결정 매트릭스: 콜드, 컴파일러만, 가지친 DerivedData, 풀 미러, 전용 볼륨
| 모델 | 적합 | 이점 | 리스크 |
|---|---|---|---|
| 동기화 없음, 원격 단독 빌드 | 소규모·저빈도 | 가장 단순 | 콜드 스타트 느림 |
ccache·sccache 루트만 | Clang 비중, 축출 허용 | 경계 명확 | 업그레이드 위생 필요 |
선택 DerivedData 서브트리 | SPM 해결 통증, 제외 관리 | 재페치 감소 | 레이아웃 결합 높음 |
| 풀 DerivedData 미러 | 단일 작성자 유지창 | 최대 증분 재사용 | 잠금·인덱스 충돌 최대 |
| 작업·팀 전용 SSD | 공유 풀 | 격리·쿼터 | 비용·자동화 부담 |
캐시 오염이 서명 아티팩트에 닿을 수 있으면 계정을 즉시 분리하고 codesign 런북 체크포인트로 삭제 범위를 연습합니다.
실무 단계: 붙여 넣어 조정할 명령 골격
# Per-job cache root (example)
# export CACHE_ROOT=/Volumes/cache/job-${CI_JOB_ID}
# mkdir -p "$CACHE_ROOT/ccache" "$CACHE_ROOT/DerivedData"
# rsync compiler cache only
# rsync -a --partial --partial-dir=.rsync-partial \
# ./ccache-dir/ user@remote-mac:"$CACHE_ROOT/ccache/"
# Trimmed DerivedData with aggressive excludes (verify paths)
# rsync -a --partial --partial-dir=.rsync-partial \
# --exclude '**/ModuleCache.noindex/**' \
# ./DerivedData/SubTree/ user@remote-mac:"$CACHE_ROOT/DerivedData/SubTree/"
# Artifact lane still runs checksum manifests
# shasum -a 256 -c manifest.sha256
# Dirty-cache rollback for one job
# ssh user@remote-mac "rm -rf \"$CACHE_ROOT\""
스니펫은 재사용 액션으로 감싸고 제외 목록은 CI 핀과 같은 리뷰에서 갱신합니다.
읽는 순서와 CTA 정렬
본문 후 APFS, 무결성, 동시 SFTP, 서명, 원자 릴리스, 마지막 홈에서 용량 계획.
건너뛰기는 거짓 트레이드오프를 낳습니다. 캐시 루트·제외·롤백 ID를 명시하고 온콜은 캐시 사고를 네트와 동급 Runbook에 둡니다.
FAQ와 SFTPMAC 호스팅 원격 Mac
매일 밤 풀 DerivedData는 현실적인가
전용 창·단일 작성자만. 주간 매트릭스와 겹치면 충돌 위험이 남습니다.
Redis 필수인가
아니오. 중앙 백엔드가 지표에 유리하고 분할 시 강등을 정의하세요.
캐시 실패가 릴리스를 막나
아티팩트는 체크섬·서명으로 막고 캐시는 콜드로 떨어지며 라벨로 표시합니다.
IDE 워처와 관계는
본문은 컴파일러 캐시 무결성에 초점. 에디터 알림은 다른 글의 범위입니다.
요약:2026년 원격 Mac 링크에서 Xcode 캐시를 움직이려면 작업 격리·신뢰 사슬 분리·명시 롤백이 필요합니다. 풀 미러 전에 컴파일러 루트를 우선하세요.
한계:자체 함대는 볼륨·계정·모니터링·청소를 끊임없이 조정하고 인력 교체로 정책이 조용히 표류합니다.
SFTPMAC:호스팅 원격 Mac은 안정된 Apple 빌드 표면과 운영 가능한 전송 레인을 묶어 서명 아티팩트 출하에 집중하게 합니다.
계정 수준에서 캐시와 아티팩트를 분리하면 쿼터·감사·회귀 샘플을 맞추기 쉽습니다.
