Windows나 Linux를 주력으로 쓰면서 iOS / macOS 파이프라인을 안정적으로 돌려야 하는 팀에게, 2026년의 갈림길은 익숙합니다. GitHub 호스트형 macOS Runner(분 단위 과금·일회성 환경)를 계속 쓸지, 원격 전용 Mac mini에 셀프호스티드 Runner를 등록해 영구 디스크와 예측 가능한 월 요금을 얻을지입니다. 본문은 후자—GitHub Actions macOS 셀프호스티드 Runner—에 집중하며 OpenClaw·Agent 운영은 다루지 않습니다. 호스트 vs 셀프호스티드 → 6개 리전 → M4 메모리·병렬 슬롯 → DerivedData·디스크 → 병렬 label → 등록 HowTo → 일·월 TCO → FAQ 순으로 정리합니다. 요금은 Mac mini 요금, Runner·SSH는 도움말 센터를 보세요. 상시 자동화도 검토 중이라면 원격 Mac OpenClaw 실전 가이드와 대조할 수 있으나, 이 글의 주인공은 CI/CD입니다.
1) 2026 호스트형 macOS Runner vs 원격 Mac 셀프호스티드: 분 과금·대기열·베어 메탈 시점
GitHub는 macOS 호스트형 Runner를 저장소/조직 Actions 사용량으로 과금합니다. 단가·무료 한도는 GitHub 공식 과금 문서가 기준입니다(2026년에도 호스트 Runner 가격은 조정될 수 있으니 배포 전 분 단가를 확인하세요). 호스트 환경의 장점은 제로옵스: job마다 깨끗한 이미지에서 시작해, 드문 PR·Archive에 적합합니다. 단점도 분명합니다: DerivedData/SPM 캐시를 job 간 오래 유지하기 어렵고, 피크에 대기열이 생기며, 분이 많아지면 청구 변동이 큽니다.
Nuvcloud 등 전용 M4 Mac mini에서 셀프호스티드 Runner를 두는 것은 「고정 슬롯 + 영구 SSD」를 사는 것입니다. 같은 머신에서 actions-runner를 launchd로 지키고 ~/Library/Developer/Xcode/DerivedData를 PR 간 재사용하면, 증분 컴파일이 호스트 콜드 스타트보다 빠른 경우가 많습니다(폭은 프로젝트 규모에 따르며, 아래는 SLA가 아닌 시산 템플릿입니다).
| 경로 | 더 적합 | 주요 대가 |
|---|---|---|
| GitHub 호스트형 macOS | 월 macOS 분이 수백 미만, 영구 캐시 불필요, 머신 관리 회피. | 분 과금+대기열; DerivedData 축적 어려움. |
| 원격 Mac 셀프호스티드 Runner | 매일 main, 다중 scheme, Archive/TestFlight 단축. | Runner 업그레이드·디스크·서명 상호배제; 월 임대 예측 가능. |
| 사무실 자체 Mac mini | 단일 거점, 다리전 불필요, 정전·노출 리스크 감수. | 구매+전기+운영 인력; 확장은 하드웨어 추가. |
12개월 TCO 시산 템플릿(예시, 자사 수치로 대체): 호스트 macOS 단가 P원/분, 월 M분이면 연간 호스트 비용 ≈ 12×M×P. 원격 Mac 월 임대 R원(기대·대역 포함)이면 연간 ≈ 12×R. M×P가 지속적으로 R을 넘고 영구 DerivedData가 필요하면 셀프호스티드가 유리한 경우가 많습니다. M이 작고 변동이 크면 호스트를 유지하거나 일 임대로 파이프라인을 검증한 뒤 월 임대로 전환하세요.
2026년에 자주 통하는 절충은 「가벼운 Lint/단위는 Linux 호스트형」「무거운 xcodebuild·Archive·공증만 소수 셀프호스티드 Mac」입니다. 워크플로 README에 경계를 적어 두면, 리팩터 후 실수로 호스트 macOS에 무거운 job이 돌아가는 일을 줄일 수 있습니다.
2) 싱가포르/일본/한국/홍콩/미 동부/미 서부: Git·Registry·아티팩트 근처 노드
Nuvcloud는 아태 싱가포르·일본·한국·홍콩, 북미 미 동부·서부를 제공합니다(가용 존은 요금·주문 기준). 「집과 가까운가」가 아니라 Git 원격, Container Registry, TestFlight/서명, 주요 온콜 타임존이 어디인지를 보세요.
후보 노드에서 동일 벤치마크를 권장합니다: git clone --depth=1, 1GB급 아티팩트 pull, xcodebuild -showBuildSettings 콜드/웜 비교. 관리자 SSH RTT는 체감만 바꾸며 CI 총 시간을 결정하지 않습니다.
| 노드 | 전형적 우선 시나리오 | 협업 힌트 |
|---|---|---|
| 싱가포르 | 동남아 사용자 아티팩트, GitHub APAC, SG/MY 팀 Runner. | 홍콩과 비교 시 주 저장소가 어디인지. |
| 일본 | 일본 법인 컴플라이언스, 도쿄권 협업, 일본 QA 야간 릴리스. | 「APAC 개발 + 일본 QA」이중 타임존에 적합. |
| 한국 | 한국 시장 앱, 국내 CDN, 서울 팀 SSH. | 도쿄와 유사, ping이 아닌 데이터 플레인 기준. |
| 홍콩 | 대륙/홍콩 혼합 팀, 화남 주 저장소. | 본토 사무실 SSH가 미 서부 직결보다 나은 경우 많음. |
| 미 동부 | GitHub 기본 미 동부, 동부 SaaS, npm/Actions 캐시. | 지도 거리가 아닌 CI 아티팩트 경로. |
| 미 서부 | 서부 협업, 미 서부 미러, 서부 사용자 야간 빌드. | APAC SSH는 느려도 job 의존성 pull이 빠를 수 있음. |
3) M4 16GB/256GB·24GB/512GB·M4 Pro: 병렬 Runner 슬롯·시뮬레이터 상한
Apple Silicon에서 물리 Runner 프로세스 하나가 runs-on: self-hosted에 대응합니다. 동시 job 수는 Runner 동시 설정과 Xcode/Simulator 메모리 피크에 달립니다. M4 16GB는 무거운 컴파일 1개 또는 경량 job 2개, 24GB는 Archive+단일 Simulator UI, M4 Pro는 다중 시뮬레이터 matrix·대형 monorepo용입니다.
| 구성 | 권장 병렬 Runner/worker 상한(경험) | OOM/지연 신호 |
|---|---|---|
| M4 16GB / 256GB | 1× 풀 xcodebuild 또는 2× lint/단위만. |
memory_pressure Yellow 빈번; Simulator 기동 실패. |
| M4 24GB / 512GB | 1× Archive + 1× UI 테스트; 또는 DerivedData 분리 중형 컴파일 2. | 병렬 UI 시 WindowServer 급등; swap으로 tail latency 악화. |
| M4 Pro 상위 | 다중 Simulator OS matrix; Xcode 마이너 2종 상주. | CPU보다 디스크 IOPS가 먼저 병목(다음 절). |
워크플로에서 runs-on: [self-hosted, macOS, compile]와 runs-on: [self-hosted, macOS, ui-test]로 나누는 편이, 한 대에서 concurrency만 최대로 올리는 것보다 안전합니다.
Runner 앱 동시 허용은 튜닝이 아니라 용량 계획입니다. 16GB에서 concurrency=2와 Simulator 2계열을 동시에 올리면 OOM·재시도만 늘기 쉽습니다. Archive는 먼저 1로 두고 최중 scheme 피크를 측정한 뒤, 일주일 memory_pressure가 Normal이면 단계적으로 올리세요.
4) 1TB/2TB 확장과 DerivedData: 병렬 worktree·정리
호스트 Runner는 job마다 클린 스타트라 DerivedData가 쌓이지 않습니다. 셀프호스티드의 핵심 이점은 ~/Library/Developer/Xcode/DerivedData가 PR을 넘는 것입니다. 병렬 job에서 동일 DerivedData에 쓰면 금지—job마다 DERIVED_DATA_PATH(또는 -derivedDataPath), 필요 시 Git worktree.
- 로컬 영구: DerivedData, SwiftPM 캐시, 버전 고정 CocoaPods.
- Actions cache 적합: 재생 가능한 툴체인 zip, Lint 캐시, 대용량 재다운로드 의존성.
- 디스크 알림: 여유 <20%면 DerivedData LRU로 오래된 30% 정리; <10%면 해당 Runner 드레인.
| 디스크 | 전형 CI 용도 | 업그레이드 시점 |
|---|---|---|
| 256–512GB 기본 | 단일 Xcode+단일 repo DerivedData; Archive 주기 삭제. | 단일 repo DerivedData >40GB 또는 Xcode 2종. |
| 1TB | 활성 브랜치 2–3, Simulator 런타임, worktree 2. | monorepo 야간 전체 컴파일. |
| 2TB | 다중 Xcode 마이너, 심볼, 대형 SPM 바이너리 캐시. | job마다 rm -rf DerivedData를 피하고 싶을 때. |
5) 병렬 리소스: 다중 Mac·label·shard·「검증→상시 개발」
단일 머신 메모리 한계에 닿으면 원격 Mac 여러 대와 label로 역할 분담:
mac-ci-compile:xcodebuild build만, DerivedData 유지.mac-ci-archive: 서명·업로드 전용,concurrency로 키체인 경합 방지.mac-ci-ui: 시뮬레이터 테스트, 24GB 또는 Pro.
경로: 일 임대로 workflow 검증 → 주 임대로 캐시 정책 → 월 임대로 IP·Runner 고정 → 필요 시 2대째 shard. actions/cache는 공유 가능하나 DerivedData는 각 머신 로컬 SSD 기준입니다.
6) HowTo: 원격 Mac에 셀프호스티드 Runner 등록
GitHub 공식: 셀프호스티드 러너 추가를 따르세요(UI·토큰 필드는 버전별로 확인). Nuvcloud 머신 권장 순서:
- SSH 로그인, Xcode CLT/본체 설치, 라이선스 동의.
- 전용 Unix 사용자 또는
actions-runner디렉터리, 개인 Apple ID로 프로덕션 서명 금지. - Settings → Actions → Runners에서
config.sh,macos·m4·리전 label. launchd서비스(svc.sh install), SSH 종료 후에도 프로세스 유지.- 워크플로에
DERIVED_DATA_PATH, 서명 jobconcurrency: { group: codesign, cancel-in-progress: false }.
env:
DERIVED_DATA_PATH: ${{ github.workspace }}/DerivedData/${{ github.run_id }}
RUNNER_TOOL_CACHE: /Users/runner/actions-toolcache
xcodebuild \
-scheme "YourApp" \
-derivedDataPath "$DERIVED_DATA_PATH" \
build
7) 일/주/월 TCO·업그레이드
「시험」과 「프로덕션 Runner」를 분리해 계산하면 일 임대 가격으로 월 생산성을 비교하는 실수를 줄입니다:
| 주기 | 적합 단계 | CI 주의 |
|---|---|---|
| 일 임대 | 6리전 A/B, DerivedData 효과, Runner 등록 시험. | 종료 시 서명·캐시 목록만 보관; Prod 시크릿은 단기기에 두지 말 것. |
| 주 임대 | 릴리스 러시, 호스트 workflow 이전, 2대째 전 부하 테스트. | Xcode 패치 고정; workflow 변경·절감 분 기록. |
| 월 임대 | main 일일 빌드, Runner명·IP·캐시 정책 고정. | 16→24GB, 디스크, 2번째 label shard 예약. |
36개월 거친 계산(예시): 자체 Mac+전기+인력=C_cap, 원격 월=R이면 C_cap vs 36×R. Mac 전담 운영이 없으면 C_cap이 과소평가되기 쉽습니다. 호스트 분만 비교할 때는 대기로 인한 기회비용도 포함하세요.
기종·주기는 요금 페이지, 갱신·증설은 대시보드. 더 많은 글은 블로그 목록.
8) FAQ
Q1: 셀프호스티드는 GitHub 약관 위반인가요?
소유·정당 임대 Mac에 등록하는 것은 공식 지원 경로입니다. Runner 무단 재판매 등은 Terms로 확인하세요.
Q2: 호스트형 macOS와 혼용 가능한가요?
가능합니다. PR은 호스트, main만 셀프호스티드 등. 시크릿·서명은 workflow 조건 분기에 주의.
Q3: DerivedData는 언제 비우나요?
Xcode 업그레이드, major 브랜치 전환, 디스크 20% 미만 LRU. 병렬 job 중 전체 rm -rf 금지.
Q4: SSH가 끊기면 job도 멈추나요?
아니요—Runner 서비스가 실행합니다. launchd로 Runner를 관리하세요.
Q5: 노드 이전 후 캐시는?
DerivedData는 이전되지 않습니다. Actions cache로 SPM/툴체인을 옮긴 뒤 풀 빌드로 워밍.
Q6: 16GB에서 시뮬레이터 몇 개 병렬?
무거운 UI 병렬은 비추천; mac-ci-ui label로 분리.
Q7: 서명 job을 왜 직렬화하나요?
키체인·인증서 동시 잠금·IPA 덮어쓰기 방지를 위해 concurrency 사용.
Q8: 일 임대 종료 시 토큰 유출 방지?
GitHub에서 Runner 제거, PAT/등록 토큰 로테이션, 키체인·~/.ssh 정리.
Q9: fork PR을 셀프호스티드로?
읽기 전용이면 허용될 수 있으나 pull_request_target·시크릿 전달은 모델별 재검토.
클라우드 Mac mini에서 CI가 더 안정적이고 분을 아낍니다
셀프호스티드 GitHub Actions macOS Runner의 핵심은 영구 DerivedData, 예측 가능한 월 요금, 다리전 전용 연산을 손에 쥐는 것입니다. Nuvcloud 베어 메탈 M4 Mac mini는 네이티브 Unix, Gatekeeper/SIP/FileVault, 7×24 무인 운영에 맞는 전력·안정성을 제공합니다. 일 임대로 노드를 검증한 뒤 월 임대로 고정하고, 24GB·SSD 확장·2번째 label shard를 순서대로 더할 수 있습니다.
호스트 macOS 분 과금에서 셀프호스티드로 옮긴다면 Nuvcloud 클라우드 Mac mini M4가 비용 대비 좋은 출발점입니다—요금·리전 확인으로 노드·메모리·캐시를 한 번에 맞추고 재작업을 줄이세요.