2026-05-12 임대 Apple Silicon 클라우드 Mac(HK / JP / KR / SG / US)에서 Xcode 스킴·빌드 구성·xcconfig 계층으로 멀티브랜치 CI를 격리
main, release/x.y, 수많은 feature/*가 동일한 임대 Mac mini M4에 몰릴 때 전형적인 실패는 “Xcode가 컴파일하지 못함”이 아니라조용한 구성 드리프트입니다. 어제 작업은 프로덕션 프로비저닝이 붙은 Release 스킴으로 통과했는데 오늘의 토픽 브랜치는 Debug 권한이라 믿거나, 래퍼가 작업별 접두사를 빠뜨려 두 병렬 작업이 같은 CONFIGURATION_BUILD_DIR에 쓰거나. 이 2026-05-12 플레이북은 인덱스 스토어 레인 격리, 병렬 xcodebuild 큐, GitHub Actions 셀프호스티드 Runner를 한 줄로 묶어 명시적 스킴 매핑, Git으로 관리되는 xcconfig 스택, 해석된 빌드 설정을 인프라 코드처럼 검증하는 CI를 완성합니다.
공유 임대 호스트에서 “스킴”이 로컬 노트북보다 더 중요한 이유
로컬에서는 UI로 스킴을 바꾸며 근육 기억이 오류를 잡습니다. 헤드리스 xcodebuild에는 촉각이 없고 오케스트레이터가 넘긴 문자열만이 진실입니다. 워크플로 YAML의 낡은 기본 이름은 잘못된 DEVELOPMENT_TEAM이나 PRODUCT_BUNDLE_IDENTIFIER를 끌고 가는 크로스 테넌트 서명 사고로 번질 수 있습니다. 프로덕션급 임대 CI는 브랜치 패턴에서 스킴+구성으로의긍정 매핑을 .xcconfig와 함께 Git에 두고, 빌더의 xcodebuild -list 출력과 대조해 드리프트가 있으면 머지를 막아야 합니다.
-scheme을 명시하고 NVMe를 몇 분 태우는 컴파일 전에 해석된 configuration이 의도와 일치하는지 검증한다.
브랜치 분류 → 스킴 매핑(스킴 폭발 피하기)
성숙한 팀은스킴 표면을 작게 유지합니다: 소비자 앱 하나, 확장 번들, 필요 시 위젯, App Store보내기 설정이 크게 다를 때만 전용아카이브 스킴.main은 App-CI+Debug로 유닛, release/*는 App-Store+Release처럼 정책으로 고릅니다. 정규식(예 ^release/)을 워크플로와 같은 디렉터리의 Markdown에 두어 리뷰가 Git 조건과 스킴 문자열을 한 diff에서 보게 합니다. 같은 호스트에 OpenClaw 같은 자동화가 있으면 오작동해도 프로덕션 서명에 닿지 않는 스킴 집합을 별도로 둡니다.
- 트렁크 스킴 — 빠른 피드백, 디버그 심볼, 다소 관대한 경고.
- 릴리스 트레인 — 경고를 조이고 dSYM·ASC 업로드 설정과 맞춤.
- 핫픽스 — 기한이 있는 항목을 CI 티켓으로 자동 만료.
xcconfig 계층: 베이스, 환경, 레인, 시크릿
.xcconfig를 합성 정책으로 봅니다.Base.xcconfig로 Swift 언어 모드와 경고 프로파일을 고정하고, Staging.xcconfig로 PRODUCT_BUNDLE_IDENTIFIER에 접미사, LaneJob.xcconfig(작업 생성·비커밋)로 CONFIGURATION_BUILD_DIR·OBJROOT를 DerivedData 전략에 맞춥니다. include는 깊이 우선이라 순서가 중요하며 휘발 파일은 마지막에, 비밀은 시크릿 매니저 템플릿으로 리포 밖에 둡니다. include 체인에 code owner를 두어 ATS 예외나 서명 자재가 층을 넘을 때 모바일 인프라와 보안이 모두 승인하도록 합니다.
스킴 결정과 함께 넘겨야 할 xcodebuild 인자
-scheme과 -configuration 외에 임대 운영에서는 -derivedDataPath, -resultBundlePath, SwiftPM이면 -clonedSourcePackagesDirPath가 흔합니다. 이들은 인덱스·모듈 캐시 레인 글과 맞춰 APFS 진동을 줄입니다.xcodebuild archive에서는 테스트와 아카이브가동일 스킴 매핑을 공유하지 않으면 “테스트 녹색·아카이브 적색”으로 갈라집니다. 작업마다 xcodebuild -showBuildSettings -json을 산출물로 남겨 단일 커밋으로 bisect하기 어려운 회귀도 차이 증거를 남깁니다.
xcodebuild -scheme "App-CI" -configuration Debug -destination 'platform=iOS Simulator,name=iPhone 16' -derivedDataPath "$DD" -resultBundlePath "$RESULT" build
머지 큐, 스택 PR, “스킴 안정 계약”
머지 큐는 브랜치 팁 대비 커밋 순서를 바꿉니다. 매핑이 브랜치 이름뿐이면 대체로 안전하지만 합성 브랜치 이름에 의존하면 명시적 폴백을 추가합니다. 스택 diff 도구가 히스토리를 바꿀 때마다 스킴 탐지를 다시 실행해 CI 전제 단계로 올립니다.안정 계약으로 스킴 이름 변경은 이단계(별칭 스킴 추가→워크플로 이전→구삭제)로 문서화해 Runner YAML이 반쯤인 채로 개발자가 로컬에서 legacy를 지우는 사고를 막습니다.
자동 서명과 수동: xcconfig가 돕는 곳·방해하는 곳
CODE_SIGN_STYLE = Automatic은 노트북에선 편하지만 공유 호스트에서는 DEVELOPMENT_TEAM의 결정성과 로그의 프로파일 UUID가 여전히 중요합니다. 수동 스타일은 디스크/키체인 프로파일을 요구합니다——Runbook과 맞추고 feature 브랜치의 include가 스타일을 뒤집지 않게 합니다.-showBuildSettings에 대한 grep 게이트로 위험한 조합(예 Debug + App Store 배포 프로파일)을 금지합니다. 모노레포 다앱은 타깃별로 xcconfig를 네임스페이스 분할합니다.
결정 표: 정책을 어디에 둘까
| 정책 | 가장 좋은 위치 | 이유 |
|---|---|---|
| 컴파일러 경고 수준 | 추적 xcconfig | 앱 코드와 같은 방식으로 diff·리뷰 |
| 작업별 빌드 디렉터리 접두사 | CI 생성 xcconfig 또는 환경 변수 | Git에 넣지 않고 작업 ID에 묶음 |
| 브랜치별 테스트 실행 | 워크플로 YAML + 테스트 플랜 | 오케스트레이션에 가까움 |
| 아카이브보내기 방식 | ExportOptions.plist + 전용 스킴 | 기존 ASC 업로드 런북과 일치 |
8단계: 스킴 인지 멀티브랜치 CI 롤아웃
- 각 리전 이미지에서
xcodebuild -list -json을 실행해 JSON을 인프라 repo에 보관. - 브랜치 정규식 → 스킴/구성 표를 만들고 PR 템플릿 체크리스트에 연결.
- xcconfig를 계층화하고 타깃을 하나씩 옮기며 항상 그린 유지.
- Release류 구성에 해석된 빌드 설정 JSON을 쓰는 CI 단계 추가.
DERIVED_DATA_PATH와 빌드 디렉터리보내기를 병렬 레인 관례에 맞춤.- 합성 머지 브랜치 이름이 있으면 머지 큐용 명명 폴백 보강.
- 릴리스 온콜에 핫픽스 스킴과 기한 만료 교육.
- 분기마다 리전 간 스킴 목록 diff로 템플릿 드리프트 제거.
구성 거버넌스 SLO 신호
| 신호 | 임계값 | 조치 |
|---|---|---|
명시 -scheme 누락 작업 |
0 허용 | 빌드 실패, 워크플로 템플릿 재배포 |
해석된 DEVELOPMENT_TEAM이 허용 목록과 불일치 |
모든 불일치 | 산출물 승격 중단, 서명 담당자 호출 |
| 이중 기록 기간 없는 스킴 이름 변경 | 모든 미신고 변경 | 릴리스 브랜치 머지 동결, 매핑 갱신까지 |
FAQ
| 질문 | 실무 답(2026-05-12) |
|---|---|
Debug와 Release를 다른 스킴으로 쪼개야 하나? |
보통 아님. 한 스킴에 두 구성이 있으면 -configuration으로 고른다. |
| 레인마다 별도 저장소가 필요한가? | 아님. 디렉터리 접두사와 xcconfig 접미를 일관되게 쓰면 격리된다. |
고부하에서 스킴 정책을 반복하기 쉬운 Mac mini M4 임대의 이유
빠른 NVMe와 넉넉한 통합 메모리로 -showBuildSettings 프로브, 시뮬레이터 콜드 빌드, 아카이브 드라이런을 연속 실행하며 APFS 할당을 볼 수 있어 릴리스 프리즈 전에 xcconfig 스택을 조이는 피드백 루프가 짧아집니다. 지역 용량은 요금으로 비교하고, 스킴 표면을 넓히기 전에 망설이는 엔지니어를 SSH/VNC 가이드로 안내하세요.