헤드리스 임대 클라우드 Mac에서의 iOS 시뮬레이터 xcodebuild test(2026)
홍콩·일본·한국·싱가포르·미국에서 베어 메탈 Apple Silicon 클라우드 Mac을 임대한 팀은 종종 SSH만으로 자동화합니다. CLT와 전체 Xcode, 병렬 작업 운용 다음 단계는 실제 기기 팜 없이 iOS 시뮬레이터 XCTest입니다. 이 글은 헤드리스 환경에서의 xcodebuild test, 안정적인 -destination, 1 TB / 2 TB에서 시뮬레이터의 NVMe 사용, UI 테스트 불안정 완화를 정리합니다. 릴리스 레인은 원격 Archive, 의존성은 캐시 관리와 함께 읽으세요.
전용 클라우드 Mac에서 시뮬레이터 테스트를 하는 이유
- 병렬 폭 — 단위 테스트 위주 스위트에서 USB 실기기보다 많은 논리 시뮬레이터를 돌리기 쉽습니다.
- 재현 가능한 OS 매트릭스 —
iOS 18.x와iOS 17.x를 버전마다 하드웨어 없이 고정. - 지역 — SG 또는 US에서 API 목·컴플라이언스 경계에 가깝게 실행.
- 비용 — 시뮬레이터 시간은 실기기 슬롯을 쓰지 않지만 NVMe는 계획하세요.
xcrun simctl list runtimes를 남기며, 공유 빌더에서 여유 공간이 50 GB 아래로 떨어지면 알림.
헤드리스 현실(VNC 없음)
CoreSimulator와 XCTest는 WindowServer 없이도 대부분 동작하지만, 메인 화면 기하, SpringBoard, 카메라/마이크 권한에 의존하는 테스트는 진단을 위해 짧은 VNC가 필요할 수 있습니다. 매일 밤은 아닙니다. 접근성 식별자를 명시하고, 애니메이션을 끄며, 렌더링에 묶인 sleep을 피하세요.
xcodebuild test 전에 simctl bootstatus가 준비될 때까지 기다리는 단계를 추가하세요.
안정적인 -destination 문자열
Xcode 업데이트 후 “최신 iPhone”이 달라져 CI가 흔들릴 수 있습니다. 지원 OS의 major/minor를 고정하고, 아무 일치 시뮬레이터나 되면 일반 플랫폼 destination을 우선하세요:
xcodebuild test -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 16,OS=18.2' -derivedDataPath /tmp/dd-$BUILD_ID
업그레이드 후 xcrun simctl list devices available를 다시 실행하고 파이프라인 변수를 갱신하세요. JP/KR 팀도 기기 이름은 영어 그대로(로캘이 식별자를 바꾸지 않음).
CI 일곱 단계
- SwiftUI Previews나 특정 시뮬레이터 번들이 필요하면 전체 Xcode(CLT만 아님).
- 임대 호스트에 Xcode가 여러 개면
DEVELOPER_DIR명시. - 작업마다 새
-derivedDataPath로 동일 사용자의 Archive 작업과 간섭 방지. - 셋업에서 부팅하거나
xcodebuild에 맡김—어제 부팅 상태를 가정하지 않음. - 대시보드에 맞게
-resultBundlePath또는-enableCodeCoverage YES. .xcresult를 압축해 보관, 14일 이상 트리아지용으로 유지.- 부팅 실패 시 단언이 아니라
simctl diagnose첨부.
판단: 시뮬레이터 vs 실기기
| 요구 | 시뮬레이터 | 실기기 |
|---|---|---|
| 빠른 단위/로직 테스트 | ✓ 호스트당 높은 병렬 | 과함; UDID/케이블 마찰 |
| Metal/카메라/푸시 현실성 | 제한적 | ✓ 디바이스 랩 또는 로컬 HW |
| 프로비저닝/서명 | 첫 게이트로 적합 | ✓ App Store 경로 전에 대개 필요 |
NVMe 예산: 1 TB vs 2 TB
| 항목 | 범위 | 완화 |
|---|---|---|
| iOS 런타임 1세트 | 메이저당 약 8–15 GB | 매트릭스에 필요한 런타임만 유지 |
| 작업별 DerivedData+ModuleCache | 3–25 GB | 7일보다 오래된 /tmp/dd-* 삭제 |
| 시뮬레이터 기기 데이터 | UI 스위트로 증가 | 주간 simctl delete unavailable |
iOS 세 버전 × scheme 다섯을 Mac mini M4 한 대에서 돌리면 2 TB가 디스크 풀 빨간 빌드를 줄이기 쉽습니다—Xcode 네 개 병렬 전에 요금을 확인하세요.
증상과 첫 점검
| 증상 | 확인 | 조치 |
|---|---|---|
Unable to boot device |
여유 공간; 좀비 CoreSimulatorService | 재부팅 또는 killall -9 com.apple.CoreSimulator.CoreSimulatorService |
| destination 없음 | 패치 후 런타임 삭제 | 플랫폼 재설치; YAML 기기명 갱신 |
| SSH 호스트에서만 UI 타임아웃 | 애니메이션; SpringBoard | 애니메이션 끔; 실행 타임아웃은 신중히 |
FAQ
| 질문 | 답변 |
|---|---|
| 한 사용자에서 시뮬레이터 테스트와 Archive 혼합? | -derivedDataPath 분리 및 병렬 빌드 가이드 큐 규칙 준수 시 가능. |
| 매번 VNC? | 아니요—로그에 WindowServer 전용 실패일 때만. |
| CI를 늦추지 않고 디버깅? | 스테이징에서 SSH 가이드로 대화형 재현. |
MacXCode Mac mini M4가 맞는 이유
시뮬레이터 부하는 CPU·메모리 대역·랜덤 I/O의 조합입니다. 임대 Mac mini M4는 통합 메모리와 빠른 NVMe를 제공하고, 과할당 VM보다 이웃 노이즈가 적습니다—HK·JP·KR·SG·US 매트릭스에 적합. UI 스위트가 두 배면 두 번째 노드. 자동화는 SSH, 시각 디버깅은 VNC를 최후 수단으로.
디스크 등급은 보존 정책과 맞추세요: 1 TB는 공격적 정리·단일 제품, 2 TB는 다팀 공유에 여유. 노드와 스토리지, 클라우드 CI면 GitHub Actions 러너와 함께.
정리: destination 고정, DerivedData 분리, 시뮬레이터 디스크를 1급 예산으로 보면 헤드리스 xcodebuild test도 운영 가능합니다. 다음은 TestFlight 전 원격 서명 최적화.