30초 요약
- 근본 원인: macOS beta가 이제 CI 실행 레이어의 일부입니다. 부가 테스트 이미지가 아닙니다.
- 증상: 동일 commit이 로컬 통과 → CI 실패 → 재실행 통과. flaky test로 치지 마세요.
- 해결: 프로덕션 CI는 안정 macOS 유지. beta는 전용 Mac mini에서만 돌리고 PASS/FAIL만 반환.
1. 무엇이 바뀌었나
WWDC 2026 이후 macOS 27 beta와 Xcode 18 beta는 한 세트로 배포됩니다. 새 SDK를 검증하려면 CI 호스트도 beta 트랙에 올라야 하므로 파이프라인은 더 이상
code → build → test → artifact
가 아니라 다음과 같아집니다:
code + Xcode beta + macOS beta + Simulator + Keychain → build
문제는 diff가 아닙니다. beta가 런타임이 되었고, beta는 매주 바뀝니다.
2. 네 가지 실패 모드 (WWDC 이후)
| 메커니즘 | 현장에서 보이는 것 |
|---|---|
| Xcode가 macOS beta에 묶임 | Runner에서 버전 고정 불가. 로컬 안정판 vs CI beta 불일치 |
| 시뮬레이터 지터 | 콜드 부트 +30–80%, UI 테스트 타임아웃, 커널 스케줄링 변동 |
| 서명 / Keychain 드리프트 | 간헐적 codesign 실패 후 재시도 통과 — 서명 가이드 |
| Swift 툴체인 강화 | 증분 빌드 누락. clean build 필요 |
3. 익숙한 증상
- 시간 드리프트: 동일 commit에서
xcodebuild가 18분→37분으로 튐 - 결과 드리프트: 로컬 성공 → CI 실패 → 재실행 성공 (환경 노이즈, 테스트 flakiness 아님)
- 거짓 안심: CPU 유휴, 스택 트레이스 없는데 테스트가 랜덤 실패
이는 CI가 로컬보다 2–3배 느린 이유 와 다릅니다. 그건 캐시 튜닝이고, 여기는 OS 수준 불확실성 — YAML로는 해결 안 됩니다.
4. 해결: beta 실행 격리
프로덕션 CI에 beta 설치 금지. 일회용 Mac mini에서 실행하고 결과만 스트리밍.
안정 CI (릴리스 macOS + Xcode)
↓
원격 Mac mini (beta 전용)
↓
PASS / FAIL + IPA 반환
네 단계:
- beta 전용 Mac mini 프로비저닝 (별도 사용자 + Keychain)
- 메인 Runner는 안정 macOS에 고정 (merge / release)
- 격리 노드에 beta 스택 설치.
[beta, ios]라벨 또는 야간 SSH 트리거 - 결과만 반환 — beta 캐시를 프로덕션 Runner에 마운트하지 않음
Runner 라벨은 Mac mini 셀프호스팅 Runner 가이드. 릴리스 스프린트 beta 매트릭스는 임시 빌드 매트릭스 참고.
5. 어떤 선택이 맞나
| 접근 | 안정성 | 판정 |
|---|---|---|
| 일상 Mac에 beta | ❌ Keychain 오염, 롤백 어려움 | ❌ |
| GitHub-hosted runner | ⚠️ 큐 대기 + beta 이미지 지연 | ⚠️ 보조용 |
| VM / 스냅샷 | ❌ 시뮬레이터 GPU 불안정 | ❌ |
| 원격 Mac mini beta 노드 | ✅ 격리·폐기 가능 | ✅ |
6. FAQ
macOS beta가 CI에 영향을 주나요?
예. 시뮬레이터, 툴체인 기본값, 서명이 드리프트해 동일 commit 결과가 뒤집힙니다.
일상 Mac에서 beta CI를 돌려도 되나요?
개인 실험은 가능. 공유·프로덕션 빌드 머신은 피하세요.
GitHub Actions만으로 충분한가요?
큐는 완화되지만 beta 비결정성은 제거 못 합니다.
베스트 프랙티스는?
전용 beta Mac mini + 메인 CI 고정. WWDC 이후 핵심은 통제 불가 환경이지 '빌드 실패'가 아닙니다.