Xcode 없이 iOS·Mac 앱 빌드·배포하기 2026

iOS 개발이라고 하면 Xcode GUI에서 버튼 눌러 아카이브하는 그림이 떠오르죠. 하지만 2026년 실무의 상당수는 Xcode를 열지 않고 터미널과 CI로 빌드·서명·배포합니다. 반복을 없애고, 사람 실수를 줄이고, 릴리스를 일관되게 만들기 위해서입니다.

먼저 짚을 것: ‘GUI 없이’ ≠ ‘맥 없이’

⚠️ 오해 주의: Xcode IDE(GUI)는 안 열어도 되지만, Xcode 도구 체인(빌드 도구·SDK)은 필요합니다. iOS/Mac 컴파일·서명은 애플 도구 체인에 묶여 있어, 맥(또는 클라우드 맥)이 어딘가엔 있어야 합니다.

1. xcodebuild — 내장 커맨드라인 빌드

Xcode를 설치하면 함께 깔리는 도구로, 터미널에서 빌드·아카이브·테스트를 실행합니다.

# 빌드
xcodebuild -scheme MyApp -configuration Release build
# 아카이브
xcodebuild -scheme MyApp -archivePath build/MyApp.xcarchive archive
💡 핵심: xcodebuild는 스크립트에 넣기 좋아 CI 파이프라인의 기본 블록이 됩니다. 간단한 빌드는 이것만으로 충분합니다.

2. fastlane — 서명·업로드까지 한 번에

서명·아카이브·TestFlight 업로드로 이어지면 fastlane이 훨씬 편합니다.

작업 fastlane 액션
iOS 빌드·서명(ipa) `gym` (build_ios_app)
Mac 앱 빌드 `build_mac_app`
서명 자산 공유·동기화 `match`
TestFlight 업로드 `pilot`
💡 팁: gym은 서명된 ipa 생성의 번거로운 작업을 대신 처리합니다. ‘xcodebuild로 되는지 확인 → 반복 작업은 fastlane 레인으로 묶기’ 순서가 실전에 맞습니다.

3. 맥이 없다면 — 클라우드 맥 CI

로컬 맥이 없어도 클라우드 맥 기반 CI로 배포할 수 있습니다.

GitHub Actions macOS 러너 — 저장소와 통합, 무료 한도 존재
Appcircle / Codemagic — 맥 환경 빌드·서명·배포 특화

코드 서명이 자동화 최대 난관 (참고용, 높을수록 까다로움)
빌드(xcodebuild)

3점

아카이브

5점

코드 서명

9점

스토어 업로드

6점

최대 난관: 코드 서명

⚠️ 핵심: 인증서·프로비저닝 프로파일 관리가 iOS CI의 최대 난관입니다. fastlane match로 서명 자산을 팀이 공유·동기화하면 고통이 크게 줄어듭니다. CI에선 서명 자산을 안전한 시크릿으로 주입하고, 자동 서명보다 ‘명시적 서명’으로 재현성을 확보하세요.

자동화의 보상

커밋이 올라오면 CI가 빌드→서명→업로드→테스터 배포까지 처리합니다. 수동 아카이브·업로드·알림의 반복이 사라지고, 사람 실수가 줄고, 릴리스가 일관돼집니다. 파이프라인 사고방식은 Git 히스토리 활용Next.js 배포 5가지 비교도 함께 보면 좋습니다.

정리

GUI 없이 O, 맥 없이 X — 애플 도구 체인은 필수
– 간단 빌드는 xcodebuild, 서명·업로드는 fastlane(gym)
– 로컬 맥이 없으면 클라우드 맥 CI(GitHub Actions·Codemagic 등)
– 최대 난관은 코드 서명 → fastlane match로 관리
– 자동화 = 시간 절약 + 실수 감소 + 일관성

Xcode를 열지 않는 릴리스는 ‘고수의 사치’가 아니라, 릴리스가 잦아질수록 반드시 필요한 위생입니다. xcodebuild로 시작해 fastlane으로 묶고, CI에 얹으세요.

*※ 도구 명령·CI 정책은 버전에 따라 다릅니다. 도입 전 공식 문서(fastlane·GitHub Actions 등)에서 최신 사용법을 확인하세요.*

참고 자료

Build iOS apps from the command line with xcodebuild (Tricentis)
build_ios_app — fastlane docs
How to Build a CI/CD Pipeline for iOS (JetBrains)

Similar Posts

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다