1인 iOS 개발자에게 풀 클린 빌드는 15~30분이 흔히 걸립니다. 밤에 스케줄로 빌드를 돌려 두면 낮에는 코딩에만 집중하고, 아침에는 TestFlight에 새 빌드가 올라가 있습니다. 이 글에서는 OpenClaw와 원격 Mac으로 야간 빌드를 구현하는 방법을 정리합니다. 트리거 조건, Fastlane 연동, 로컬 Mac 대신 원격 Mac을 쓰는 이유까지 최신 기술과 해외 출시에 유리한 구성을 담았습니다.
1인 개발자에게 야간 빌드가 중요한 이유
솔로·소규모 팀은 전용 CI 박스를 갖기 어렵습니다. Xcode Cloud는 월 25시간 무료 컴퓨팅을 주지만 커스텀 도구·환경 제어에 한계가 있습니다. 밤에 고정 스케줄로 빌드를 돌리면 노트북을 묶지 않으면서도 예측 가능한 베타 빌드를 받을 수 있습니다. 자기 전에 푸시하고, 아침에 TestFlight에서 새 빌드를 확인하면 됩니다.
원격 Mac을 쓰면 24/7 가동, 해외 노드로 TestFlight·App Store Connect 업로드 지연 감소, 같은 머신에서 OpenClaw로 메시지 기반 「지금 빌드」 트리거까지 한 번에 구성할 수 있어, 최신 자동화와 해외 출시에 모두 유리합니다.
야간 빌드 두 가지 방식
빌드를 스케줄하는 방법은 크게 두 가지입니다. (1) 시스템 스케줄링(cron 또는 launchd)만으로 Fastlane을 호출하는 방식, (2) OpenClaw를 붙여서 Telegram·Slack 등 메시지로도 「지금 빌드」를 트리거하는 방식입니다. 둘 다 원격 Mac에서 실행 가능합니다.
방식 A: 스케줄 Fastlane (OpenClaw 없음)
빌드를 돌릴 Mac에 Fastlane을 설치하고, 아카이브 후 TestFlight 업로드까지 하는 lane을 만듭니다. launchd(macOS) 또는 cron으로 매일 새벽 2시 등 고정 시간에 그 lane을 실행합니다. UI·OpenClaw 없이 백그라운드에서만 돌아갑니다. 인증 정보는 키체인 또는 CI/호스트 시크릿으로 관리합니다.
- 장점: 구성이 단순하고, AI 에이전트에 의존하지 않음.
- 단점: 채팅에서 즉시 트리거 불가; 스케줄 변경 시 plist·cron 수정 필요.
방식 B: OpenClaw를 트리거 레이어로 사용
같은 Mac에서 OpenClaw를 실행해 셸 명령·Xcode 실행·스크립트를 수행하게 합니다. 기본 야간 빌드는 launchd로 유지하고, Telegram(또는 다른 플랫폼) 트리거를 추가해 「지금 빌드」 요청 시 같은 Fastlane lane을 실행하게 할 수 있습니다. 「매일 새벽 2시」와 「지금 빌드」 두 진입점을 동시에 갖게 됩니다.
- 장점: 트리거 유연, 한 대 Mac으로 스케줄·온디맨드 빌드 모두 처리, OpenClaw를 이미 쓰고 있다면 자연스럽게 통합.
- 단점: OpenClaw·메시징 웹훅·프롬프트 설계 등 설정이 더 필요하고, 에이전트 가동에 의존.
워크플로 구조: 무엇이 어디서 돌아가는가
원격 Mac 한 대(예: VNCMac M4 Mac mini)를 가정합니다. 해당 머신에 Xcode·Fastlane·(선택) OpenClaw가 설치되어 있고, Git 클론 경로가 정해져 있으며, 서명·노타라이즈는 App Store Connect API 키 또는 키체인의 Apple ID 자격으로 처리합니다.
스케줄 야간 빌드 흐름은 다음과 같습니다. 새벽 2시(또는 지정한 시간)에 launchd가 스크립트를 실행합니다. 스크립트는 프로젝트 디렉터리로 이동한 뒤 git pull로 최신 main(또는 릴리스 브랜치)을 받고, bundle exec fastlane nightly_beta(또는 사용하는 lane 이름)를 실행합니다. lane에서 빌드 번호 증가·xcodebuild 아카이브·IPA 내보내기·TestFlight 업로드·(선택) Slack 알림을 수행하고, 스크립트가 종료되면 작업이 끝납니다.
launchd plist 예시 (매일 새벽 2시 실행)
# ~/Library/LaunchAgents/com.you.overnight-ios-build.plist
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key><integer>2</integer>
<key>Minute</key><integer>0</integer>
</dict>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/env</string>
<string>bash</string>
<string>-c</string>
<string>cd /path/to/YourApp && git pull && bundle exec fastlane nightly_beta</string>
</array>
launchctl load ~/Library/LaunchAgents/com.you.overnight-ios-build.plist로 로드합니다. 사용자가 로그인된 상태(또는 키체인을 쓸 수 있는 사용자 세션)이어야 하거나, App Store Connect API 키만으로 비대화형 업로드가 되도록 구성합니다.
야간 TestFlight용 Fastlane lane
야간 실행에 맞는 최소 lane은 다음을 수행합니다. 빌드 번호 증가 → 빌드·아카이브 → App Store용 내보내기 → TestFlight 업로드 → (선택) 알림. App Store Connect API 키를 쓰면 Mac에 Apple ID 비밀번호를 저장하지 않아도 됩니다.
lane :nightly_beta do
increment_build_number(xcodeproj: "YourApp.xcodeproj")
build_app(scheme: "YourApp", export_method: "app-store")
upload_to_testflight(
skip_waiting_for_build_processing: true,
changelog: "Nightly build " + Time.now.strftime("%Y-%m-%d %H:%M")
)
# optional: slack(message: "TestFlight nightly uploaded")
end
OpenClaw로 같은 빌드를 온디맨드 트리거할 때도 프로젝트 디렉터리에서 bundle exec fastlane nightly_beta만 실행하면 됩니다. 로직을 중복할 필요 없이 lane 하나가 단일 진실 공급원이 됩니다.
OpenClaw 트리거: 메시지로 빌드 실행
OpenClaw와 메시징 연동(예: Telegram)을 쓰면 「야간 빌드 돌려줘」 같은 문구로 에이전트가 Fastlane lane을 실행하게 할 수 있습니다. OpenClaw는 Mac의 접근성·셸을 이용해 명령을 실행하므로, 사용자가 빌드를 요청했을 때 해당 스크립트를 실행하도록 스킬·지시를 설정하면 됩니다. 같은 원격 Mac으로 스케줄 빌드와 온디맨드 빌드를 모두 처리할 수 있습니다.
보안: 빌드 트리거 권한을 제한하세요(예: Telegram 사용자 ID 또는 웹훅 공유 시크릿). 인증·속도 제한 없이 Mac·OpenClaw를 공개 인터넷에 노출하지 마세요.
로컬 Mac vs 원격 Mac: 비용·안정성
본인 MacBook·iMac에서 야간에 돌리는 것도 가능합니다. pmset으로 새벽 2시에 기기를 깨우고 launchd로 Fastlane을 실행하면 됩니다. 단점은 기기를 켜 두거나 깨워야 하고, 전력·발열이 발생하며, 슬립·업데이트·사용이 작업을 방해할 수 있다는 점입니다. 그 Mac이 일상 작업용이면, 빌드가 길 때 아침에 일찍 작업을 시작하면 체감 속도가 느려질 수 있습니다.
빌드 전용 원격 Mac을 쓰면 위 문제를 피할 수 있습니다. 머신은 항상 켜져 있거나(또는 제공자가 스핀업) 스케줄이 안정적이고, 노트북을 묶지 않으며, M4 등 빌드에 맞춘 스펙을 선택해 야간 빌드가 예측 가능한 시간 안에 끝나게 할 수 있습니다. 시간/월 단위 임대(VNCMac 등)로 비용이 예측 가능하고, 1인 개발자에게는 월 몇십 달러가 로컬에서 무거운 빌드를 돌리는 부담·장비 마모보다 나은 경우가 많습니다.
로컬 Mac vs 원격 Mac 비교
| 항목 | 로컬 Mac (pmset + launchd) | 원격 Mac (예: VNCMac) |
|---|---|---|
| 장비 마모 | 본인 기기가 밤새 동작 | 본인 기기 무부하 |
| 전력·냉각 | 사무실/집에서 발생 | 데이터센터에서 처리 |
| 안정성 | 슬립·업데이트·사용과 충돌 가능 | 빌드 전용, 로컬 사용과 충돌 없음 |
| OpenClaw + 메시징 | 가능하나 일상 작업과 같은 머신 | 같은 Mac에서 OpenClaw 24/7 트리거 가능 |
| 비용 | 무료(전기료 제외) | 임대료; 월/시간 단위 예측 가능 |
빌드 시간·비용 요약
중급 M4 Mac mini에서 일반적인 1인 개발 iOS 앱(수만 줄, 수십 개 의존성)은 클린 빌드에 보통 10~18분 정도 걸립니다. TestFlight 업로드는 몇 분 더 소요됩니다. 따라서 야간 한 번 빌드는 1시간 미만 컴퓨팅으로 충분합니다. 매일 한 번만 빌드하고 Mac을 그때만 켜 두면 시간 과금이 풀타임 러너보다 저렴할 수 있고, 같은 Mac에서 OpenClaw 등 다른 작업도 돌리면 야간 빌드의 한계 비용은 낮아집니다.
- M4 Mac mini (전용): 클린 빌드 10~18분; 야간 1회 빌드는 1시간 이내.
- Xcode Cloud: 비슷한 규모 프로젝트 15~25분/빌드; 월 25시간 무료로 많은 야간 빌드 가능; 초과 시 유료.
- 로컬 MacBook: 기기별 상이; 임대 비용 없으나 전력·마모 발생.
안정적인 상시 빌드 환경과 OpenClaw 기반 메시지 트리거 같은 확장을 원하거나, 개인 Mac을 매일 밤 켜 두고 돌리기 싫다면 원격 Mac 구성이 가장 합리적입니다. 해외 출시 시 원격 노드 선택으로 TestFlight·App Store Connect 업로드도 가속할 수 있습니다.
보안·자격 증명
App Store Connect API 키는 시크릿(CI 시크릿 또는 Mac 키체인)에 보관하세요. Apple ID 비밀번호 대신 API 키를 쓰면 비대화형 실행이 가능합니다. 원격 Mac SSH는 키 기반만 허용하고, OpenClaw를 웹훅으로 노출했다면 발신자(예: Telegram 사용자 ID) 검증과 HTTPS를 사용하세요. 자격 증명은 저장소에 커밋하지 말고 환경 변수 또는 시크릿 매니저를 사용하세요.
실전 정리
단순히 「매일 밤 빌드」만 필요하다면: 전용 Mac을 임대하거나 확보한 뒤, 저장소 클론·Fastlane·Xcode 설치·nightly_beta lane 구성·새벽 2시 launchd 등록만 하면 됩니다. 매일 아침 기기 건드리지 않고 TestFlight에 새 빌드가 올라갑니다.
「지금 빌드」까지 붙이려면: 같은 Mac에 OpenClaw를 설치하고 Telegram(또는 다른 플랫폼)을 연결한 뒤, 빌드 요청 시 fastlane nightly_beta를 실행하도록 에이전트를 설정합니다. lane 하나로 스케줄·온디맨드 두 트리거를 모두 만족합니다. 빌드를 지키지 않고 본인 Mac을 밤새 켜 두고 싶지 않은 1인 개발자에게는, 원격 Mac에서 스케줄 + OpenClaw 트리거 조합이 실용적이고 비용 대비 효과가 좋은 구성입니다.
요약
야간 iOS 빌드는 Mac에서 스케줄된 Fastlane lane으로 구현할 수 있고, OpenClaw를 붙이면 Telegram·Slack 등 메시지 기반 「지금 빌드」 트리거까지 추가할 수 있습니다. 그 워크플로를 원격 전용 Mac(예: VNCMac)에서 돌리면 로컬 장비 마모·전력 이슈를 피하고 일상용 기기를 비울 수 있습니다. 기본 야간 실행은 launchd, 비대화형 업로드는 App Store Connect API 키, 선택 사항으로 OpenClaw 연동으로 휴대폰에서 「지금 빌드」를 걸어 두면, 잠들었다가 깨면 TestFlight에 새 빌드가 올라가 있습니다. 최신 기술과 해외 출시를 동시에 고려한다면 원격 전용 Mac 한 대로 위 구성을 추천합니다.