2026-04-16 iOS CI 디스크 정리: 시뮬레이터 런타임, 아카이브, 임대 클라우드 Mac의 launchd
홍콩·도쿄·서울·싱가포르·미국 동부에 임대한 Mac mini M4 빌더는 df -h가 데이터 볼륨 여유를 약 12% 아래로 보일 때까지 디스크가 무한해 보입니다. 그 뒤의 각 xcodebuild test는 추첨과 같습니다. 본문(2026-04-16)은 컴파일 캐시를 격리해도 왜 디스크가 차는지, 큰 디렉터리 지도, 복사해 쓰는 simctl 유지보수, 아카이브 보존 수학, launchd 템플릿을 다루고 잡별 DerivedData 격리(2026-04-15)와 헤드리스 시뮬레이터 테스트로 연결해 위생 스토리를 끝까지 맞춥니다.
「DerivedData는 이미 치운다」는데 클라우드 Mac 디스크가 찰 때
잡마다 DERIVED_DATA_PATH는 컴파일 경합을 막지만 전역 소비자는 막지 못합니다. Xcode 16.x용으로 설치한 각 iOS 런타임은 여전히 /Library/Developer/CoreSimulator에 있고, UI 테스트는 기기 데이터에 300–900 MB를 더할 수 있으며, 아카이브마다 dSYM과 비트코드 슬라이스가 복제됩니다. 한 호스트에서 세 개의 Xcode 마이너를 돌리며 오래된 런타임을 제거하지 않으면 팀은 종종 80–140 GB를 잃은 뒤에야 알아챕니다. 디스크 원격 측정과 큐 깊이를 짝지어 janitor가 한계에 닿은 뒤에만 가격으로 확장하세요.
- 오래 부팅된 시뮬레이터가 CoreSimulator 마운트를 살려 삭제를 막습니다.
- 오래된 watchOS / tvOS 런타임은 iOS만 빌드해도 남습니다.
- 아카이브는 공유 SSH 호스트에서 보존 담당이 없으면 쌓입니다.
- 일부 이미지에서
/tmp로 옮긴 xcresult 묶음은 재부팅 후에도 남습니다—명시적으로 치우세요.
발자국 지도: 기가바이트가 숨는 곳
| 경로 / 영역 | 전형적 범위 | 자동화 안전? |
|---|---|---|
~/Library/Developer/Xcode/Archives |
누적 15–120 GB | 예—연령 정책 + 객체 스토리지 업로드 선행 |
~/Library/Developer/CoreSimulator/Devices |
8–60 GB | 부분—unavailable 삭제 + 미디어 캐시 정리 |
/Library/Developer/CoreSimulator/Volumes(런타임) |
다중 버전 25–90 GB | 주의—필요 SDK 매트릭스와 조율 |
~/Library/Developer/Xcode/iOS DeviceSupport |
5–25 GB | 정책이 허락하면 180일보다 오래된 버전은 예 |
/Users와 /Volumes/builds를 담는 NVMe에서 여유가 50 GB 미만이면 페이지, 25 GB 미만이면 새 잡을 중단해 아카이브 중 커널 쓰기 실패를 피하세요.
운영자가 실제로 실행하는 simctl
CI 큐가 시뮬레이터 활성 0일 때만 실행하거나 유지보수 라벨으로 러너를 먼저 비우세요.
xcrun simctl shutdown all
xcrun simctl delete unavailable
xcrun simctl erase all # 일회용 프리뷰 호스트만—승인 없이 공유 프로덕션형 빌더에서 금지
xcrun simctl list runtimes를 주간으로 설정 저장소에 넣어 도쿄와 싱가포르 노드를 맞춥니다.
아카이브: 재무가 이해하는 보존 계산
.xcarchive를 규제 아티팩트처럼 다루고 객체 스토리지에 업로드한 뒤 로컬은 롤백 정책에 따라 14 또는 30일 보존 후 삭제합니다. 법적 요구로 90일 로컬이면 디스크 헤드룸을 명시적으로 구매하세요. 이미 압축된 슬라이스에 zip이 35%를 넘기기 어렵습니다.
| 보존 | 대략 월 증가(단일 앱, 주간 아카이브) | 완화 |
|---|---|---|
| 로컬 7일 | 12–20 GB | 야간 tar + 업로드 + 삭제 |
| 로컬 30일 | 45–70 GB | 계층 스토리지 + 체크섬 검증 |
| ∞ 「혹시 몰라」 | 무제한 | 공유 임대 Mac에서는 금지 |
launchd janitor(클릭 운영 없음)
CI 사용자 소유 비대화 스크립트로 감싸고 ~/Library/Logs/ci-janitor.log에 기록합니다. 한 패스에서 15 GB 초과 삭제 시 비영 종료로 Slack 흔적을 남깁니다. 리전별 일요일 03:00 현지—홍콩 일요 이른 아침은 캘리포니아에선 여전히 토요 저녁이므로 시차를 두세요.
~/Library/Developer/Xcode/UserData 전체를 삭제하지 마세요—스니펫과 중단점이 있고 엔지니어가 반발하며 미스터리 빨간 빌드 티켓이 돌아옵니다.
DerivedData 및 테스트 전략과 짝짓기
전역 정리 후에도 각 파이프라인은 2026-04-15 격리 글처럼 잡마다 DERIVED_DATA_PATH를 설정하세요. UI 무거운 스위트는 헤드리스 시뮬레이터 테스트로 병렬 destination을 제한해 janitor가 활성 SimulatorTrampoline과 싸우지 않게 합니다.
공격적 정리 후 관찰점
첫 정리 후 잡은 심볼 재다운로드나 DeviceSupport 재구축으로 +4~+11분 더 걸릴 수 있습니다. p95 빌드 시간을 48시간 추적하고 22% 이상 튀면 정책이 과격합니다—백업에서 복구하거나 보존을 넓히세요.
FAQ: 임대 Apple Silicon의 디스크 위생
| 질문 | 짧은 답 |
|---|---|
| Archives를 NFS로 심볼릭 링크? | 저지연 링크일 때만; 아니면 업로드 후 로컬 삭제. |
| Apple Silicon이 CoreSimulator 데이터를 압축? | APFS 클론이 일부 템플릿에 도움—회계에 의존하지 마세요. |
| janitor 스크립트 소유자는? | 플랫폼 팀 + on-call 로테이션을 도움말에 문서화. |
리전, NVMe, Mac을 하나 더 둘 때
디스크 압박은 종종 한 호스트에 워크로드가 과다한 프록시입니다. janitor가 주간 >40 GB를 회수해도 여유가 20% 근처면 JP 대 SG 빌더로 팀을 나누거나 둘째 미국 동부 노드를 추가하세요—Git과 ASC 지연도 바이트만큼 중요합니다. 가격으로 베어 메탈 티어를 비교하고 블로그 색인으로 서명·공증·OpenClaw 런북을 북마크하세요.
한 줄: 공유 임대 Mac에서 전역 시뮬레이터 + 아카이브 위생은 선택이 아니라 야간 빌드가 예측 가능한지「누군가 SSH 할 때까지 빨강」인지를 가릅니다. 자동화하고 측정하고 잡별 DerivedData 규율과 짝을 이루세요.