Skip to content

Build and Run

JEONG edited this page Aug 24, 2026 · 2 revisions

Build & Run

빌드 명령, 시크릿 설정, 테스트, CI. 모듈 구조 상세는 Module Structure 참고.

요구 사항

  • Xcode 26.4+ (CI는 러너의 Xcode_26.4*를 선택)
  • Deployment Target iOS 26.4 / watchOS 26.4
  • Swift 6.3
  • mise — Tuist 버전 고정용 (UMCApp/mise.toml4.155.0)

UMCApp (Tuist) — 표준 진입점

모든 신규·유지보수 작업은 UMCApp/에서 수행합니다. Makefile이 mise exec -- 래퍼를 제공하므로 로컬 tuist 버전 차이가 발생하지 않습니다.

cd UMCApp

# 최초 1회 (신규 팀원)
brew install mise      # mise가 없다면
make bootstrap         # mise.toml 기반 tuist 설치
make install           # SPM 의존성 (tuist install)

# 일상 작업
make generate          # 워크스페이스/프로젝트 생성 (별칭: make gen)
make open              # Xcode 워크스페이스 열기
make generate-open     # 생성 후 바로 열기
make build             # 빌드
make test              # 빌드 + 테스트
make doctor            # 환경 진단 (mise/tuist/xcode 버전)
make help              # 전체 타겟 목록

전체 Make 타겟

타겟 설명
help 도움말 출력
bootstrap 최초 환경 구축 (mise로 tuist 설치)
check-mise mise 설치 여부 확인
doctor 개발 환경 진단
install SPM 의존성 설치 (tuist install)
generate / gen 워크스페이스/프로젝트 생성
generate-open 생성 후 Xcode로 열기
edit Tuist 매니페스트 편집 모드
graph 의존성 그래프(graph.png) 생성
cache-warm Tuist 바이너리 캐시 워밍업
open Xcode 워크스페이스 열기
build 빌드 (CONFIGURATION)
pick 스킴을 골라 빌드 (fzf 있으면 fuzzy, 없으면 번호 선택)
test 테스트 실행
test-pick 스킴을 골라 테스트
test-network CoreNetwork 단위+통합 테스트 (서버 살아있으면 통합도 자동 실행)
clean Tuist Derived/빌드 산출물 제거
clean-dd 로컬 DerivedData 제거
reset 전체 초기화 (clean + clean-dd)

환경 변수 오버라이드

make build SCHEME=AuthDomain                          # 모듈 단위 빌드
make test  SCHEME=AuthDomain                          # 모듈 단위 테스트
make test  DESTINATION='platform=iOS Simulator,name=iPhone 17'
make build CONFIGURATION=Release
TUIST_BUILD_NUMBER=42 make generate                   # 아카이브용 빌드 번호

자세한 사용법은 저장소의 UMCApp/MAKEFILE_GUIDE.md 참고.

🔑 시크릿 설정

시크릿은 xcconfig → Info.plist → Config(UMCFoundation) 경로로 주입됩니다.

파일 경로 커밋 역할
Shared.xcconfig UMCApp/Secrets/ 앱 타겟이 참조하는 진입 xcconfig. 비밀 아닌 기본값 + 환경별 BASE_URL
Secrets.xcconfig.template UMCApp/Secrets/ 플레이스홀더 템플릿
Secrets.xcconfig UMCApp/Secrets/ 개발자별 실제 키 (KAKAO_KEY, TMAP_SECRET_KEY, GOOGLE_CLIENT_ID, GOOGLE_REVERSED_CLIENT_ID, BASE_URL)
GoogleService-Info.plist UMCApp/UMCApp/Resources/ Firebase (FCM 푸시 · RemoteConfig)
cd UMCApp/Secrets
cp Secrets.xcconfig.template Secrets.xcconfig
# 팀 공유 채널에서 받은 실제 값 입력
cd ..

# Firebase 설정 파일 배치 (buildableFolders 로 자동 포함)
cp ~/Downloads/GoogleService-Info.plist UMCApp/Resources/

make generate
  • 두 파일 모두 팀 공유 채널에서 수령합니다. (GoogleService-Info.plist는 Firebase 콘솔 → 프로젝트 설정 → iOS 앱 com.umc.product에서도 내려받을 수 있습니다.)
  • 실제 키·설정 파일은 원격 저장소에 업로드하지 않습니다.
  • xcconfig에서 //는 주석이므로 URL은 https:/$()/... 형태로 escape 합니다.
  • BASE_URL[config=Debug] / BASE_URL[config=Release]로 서버가 자동 선택됩니다.

누락 가드 (Scripts/verify-secrets.sh)

앱 타겟 Pre-action 스크립트가 빌드 전에 키 누락·플레이스홀더 잔존·plist 유효성을 검사합니다.

Configuration 동작
Release error:로 빌드 실패 — 키 없는 아카이브가 스토어로 나가는 것을 막는다
Debug warning:만 출력하고 통과 — 신규 클론·CI는 시크릿 없이도 빌드돼야 한다

시크릿이 없으면 카카오/구글 로그인·TMap 지오코딩·FCM 푸시가 빌드는 성공한 채 런타임에만 죽기 때문에, 이 가드가 유일한 조기 경보입니다.

테스트

cd UMCApp
make test                       # 전체
make test SCHEME=AuthDomain     # 모듈 단위
make test-pick                  # 스킴 골라서
make test-network               # CoreNetwork 단위 + (서버 살아있으면) 통합

테스트 타겟은 Tuist 매니페스트에서 레이어별로 켭니다 (includesTests / includesDomainTests / includesDataTests / includesPresentationTests).

CI

tuist-ci.yml — 단일 빌드/테스트 게이트

develop 푸시와 develop 대상 PR에서 실행됩니다 (macos-26 러너).

  1. Xcode 26.4+ 선택
  2. Secrets.xcconfig 플레이스홀더 복사 · GoogleService-Info.plist 복원 (GOOGLE_SERVICE_INFO_PLIST_BASE64 시크릿 — 없으면 스킵, fail-open)
  3. mise/Tuist 설치 + SwiftPM/Tuist 캐시 복원
  4. make installmake generatemake test
  5. 결과를 Discord 웹훅으로 알림

레거시 AppProduct만 감시하던 ios.yml은 폐기됐습니다. 필요하면 태그 v2.2.0에서 복원합니다.

api-coverage.yml — API 커버리지

매주 월요일 00:00 UTC · develop 푸시(Stella/Router 변경 시) · 수동 실행. 자세한 내용은 Stella · API 커버리지 참고.

AppProduct (레거시 · 동결)

AppProduct/v2.2.0에 동결되어 있습니다. 열람·참고 전용이며 수정하지 않습니다.

open AppProduct/AppProduct.xcodeproj

트러블슈팅 메모

  • 빌드/생성이 꼬이면 cd UMCApp && make reset 후 다시 make generate.
  • SwiftData CloudKit init failed 로그는 CloudKit 실패 후 로컬 폴백 상황일 수 있습니다.
  • 시뮬레이터에서는 APNS 토큰 미설정으로 FCM 토큰 발급이 제한될 수 있습니다.
  • Preview에서 ModelContainer 오류가 발생하면 in-memory 컨테이너 주입 여부를 확인하세요.
  • ENABLE_USER_SCRIPT_SANDBOXING=YES이므로 Run Script가 읽는 파일은 inputPaths에 선언해야 합니다(미선언 시 EPERM).

관련 문서: Module Structure · Git Workflow

Clone this wiki locally