2026 Flutter/React Native: iOS 작업만 macOS 클라우드, Linux와 섞는 CI 매트릭스와 임계값

Dart/TypeScript 모노레포일수록 Android가 Linux에서 돌아간다고 iOS도 같은 Runner에 넣고 싶지만 서명·Xcodeproj·Simulator는 2026년에도 macOS 전제가 강하다. 본문은 세 가지 비용, Linux/macOS 단계 표, Runner 태그·artifact 계약을 포함한 일곱 단계, 디스크·큐 SLO용 수치, 그리고 Linux iOS 한계 FAQ다중 Xcode 운영 글과의 역할 분담 FAQ를 정리한다.

크로스플랫폼 모바일 CI와 Mac 클라우드 러너

목차

1. iOS를 Linux처럼 돌릴 때 세 가지 대가

모바일을 백엔드와 같은 쿠버네티스 감각으로 보면 대기열·APFS 여유가 네트워크 불안이나 캐시 손상으로 보인다. 아래 세 줄을 Runbook에 박아 두면 Mac 예산 설득이 쉬워진다.

  1. 단계 불일치로 트리아지 팽창: Ubuntu에서 xcodebuild 직전까지 가는 스크립트는 무의미 로그를 늘리고 인증서 조사와 이미지 차이 왕복으로 유료 macOS 슬롯을 헛돌린다.
  2. artifact 계약 부재: Hermes 산출·codegen에 최소 Xcode 버전·슬라이스가 없으면 archive에서야 불일치가 터져 Linux에서 초록이던 신뢰를 깬다.
  3. Mac에서만 큐·디스크 폭주: 단일 mobile 태그는 무거운 Android 아카이브가 macOS 슬롯을 가져가고, 브랜치별 DERIVED_DATA_PATH 없이 병렬하면 APFS 여유가 한 자릿수 GB까지 떨어진다.

다음 표는 Linux에 남길 일과 macOS 필수 일을 가르는 2026년 기준선이다.

2. Flutter/RN 단계 매트릭스

컨테이너로 macOS를 대체하려면 먼저 Linux 한계 FAQ로 불법 지름길을 제거한다.

단계Flutter 예React Native 예권장 OS메모
정적 분석·VM 테스트dart analyze, VM만 flutter testESLint, 네이티브 없는 JestLinux고병렬·저비용
Pods/Xcodeproj빌드 전 플러그인 등록bundle exec pod installmacOSXcode 해석 필요
아카이브/IPAflutter build ipaxcodebuild+FastlanemacOS실제 서명 체인
Simulator UI통합 테스트Detox iOS, XCUITestmacOS헤드리스도 Simulator 필요
Android 패키징flutter build appbundleGradleLinux/컨테이너iOS와 태그 분리
태그: linux-mobilemac-ios-only로 쪼개고 포괄 mobile은 폐지한다.

3. 일곱 단계 도입

SSH로 닿는 Mac 클라우드 러너가 있다는 전제. 골든 이미지가 없다면 다중 Xcode 글의 헤더 3종부터 고정한다.

  1. 툴체인 고정: Xcode/Flutter 기대값을 문서화하고 macOS 잡 시작에 xcodebuild -version·flutter --version을 반드시 출력한다.
  2. Linux 가드: 환경변수로 pod install을 건너뛰어 서명 호스트인 척하지 않게 한다.
  3. Mac 입력 최소화: lockfile·중간 번들만 Linux에서 받아 workspace 전체 재업로드를 피한다.
  4. DerivedData 분리: DERIVED_DATA_PATH=$CI_WORKSPACE/dd/ios/$CI_COMMIT_SHORT_SHA처럼 브랜치별로 자르고 큐 글과 같은 임계로 정리한다.
  5. Hermes·Xcode 직렬화: 한 노드에서 캐시 디렉터리를 나눠 APFS 경합 스파이크를 줄인다.
  6. 가벼운/야간 이단: MR은 build-for-testing, 본격 archive는 main 야간만.
  7. Runbook 신호: YAML 변경 뒤 macOS 큐 p95·벽시계·여유 공간을 기록하고 노드 핫픽스보다 YAML 롤백을 우선한다.
stages: [lint_linux, ios_mac] lint: tags: [linux-mobile] script: ["flutter test --exclude-tags=ios-integration"] ipa: tags: [mac-ios-only] script: ["xcodebuild -version", "flutter build ipa --release"]

4. 2026 검토용 수치

중간 규모 모노레포 아카이브는 DerivedData·dSYM 포함 피크 여유 약 90~120GB를 보고 여유율 약 12% 미만이면 신규 archive를 중단한다. macOS 슬롯이 지속 큐 깊이의 4분의 1보다 작으면 대기 p95가 단위 테스트 중앙값의 세 배를 넘기 쉬워 Lint 축소보다 Mac 증설이 먼저다. Bitcode 없이 Pods·Swift 매크로에 따라 아카이브 벽시계는 약 18~35분대가 흔하다. Hermes 켜면 Linux JVM 구간 대비 평균 CPU를 약 1.4~1.8배로 보고 mac-ios-only 병렬을 별도 제한한다. 단일 파이프라인 iOS artifact는 약 2~6GB로 묶고 심볼과 IPA를 쪼개 다운로드 분을 아끼자.

5. FAQ

pod install을 Linux에서?

Podspec 훅이 Xcode 없이도 되는 드문 경우만. 대부분 RN은 macOS가 안전하고 아카이브 직전 실패를 줄인다.

Flutter 데스크톱 Linux 타깃은

범위 밖. 별 러너 풀을 둔다.

다중 Xcode 글과 경계

그 글은 xcode-select·SDK 공존, 본문은 OS 분할·태그 위생. 업그레이드 시 두 Runbook을 함께 갱신한다.

6. 하이브리드에서 Mac 기반 선택

노트북·임시 원격 데스크톱은 단기 릴리스엔 되지만 야간 전원·Xcode 기준선 분산·사내 프록시 재현성 세 가지로 운영 SLO를 깨기 쉽다. Linux는 고밀도 범용, 교체 가능한 macOS 노드는 Apple 전용 슬라이스로 두는 것이 정석이며 네이티브 macOS 없이 iOS 산출물을 억지로 만들면 로그 과금만 쌓인다. 예측 가능한 큐·SSH 운용·디스크 정책을 Linux SLO와 같은 표로 관리하려면 VPSMAC M4 Mac 클라우드 임대가 혼합 개인 기기보다 안정적이기 쉽다. 이미지·DerivedData·가시성은 SSH 이전·다중 Xcode 글과 한 줄로 맞출 수 있다.