2026년 플랫폼·모바일 리드가 iOS·macOS 빌드를 원격 Mac으로 옮길 때 흔한 출발점은 「러너부터 등록하고 정책은 나중」입니다. 그러면 라벨이 모호해지고, 동시성이 디스크를 포화시키며, 서명 컨텍스트가 엉킵니다. 본 가이드는 싱가포르, 도쿄, 서울, 홍콩, 미 동부, 미 서부 등 노드를 고르는 팀을 대상으로 통증 유형 분해, 제어 평면 표 2개, 붙여 넣기 가능한 워크플로 스니펫, 6단계 런북, 모니터링 지표 3가지를 제시하며, 멀티 프로젝트 용량·SSH 대 VNC 글과 교차 링크하여 CI 검토와 체크아웃에 활용할 수 있도록 구성하였습니다.
셀프호스트 러너는 실제 macOS 실행면을 오케스트레이터에 노출합니다. GitHub Actions는 저장소·조직 수준 러너를 쓰고, GitLab은 실행기 유형과 함께 프로젝트·그룹 러너를 씁니다. 라벨이 mac, ios처럼 포괄적이면 워크플로가 동일 호스트를 두고 경쟁하고, DerivedData와 IO 핫스팟이 겹치며, 실패가 명확한 자원 압박이 아니라 임의 타임아웃처럼 보입니다. 호스트를 늘리거나 M4 Pro로 올리기 전에 아래 여섯 통증 범주를 분해합니다.
clean 한 번이 병렬 프로젝트를 해칩니다..xcarchive나 의존성 캐시 이동이 대역폭과 시간으로 기계 비용 절감을 상쇅합니다.다음 표는 러너 역할과 GitHub·GitLab 차이를 논의 가능한 형태로 정리합니다. 이후 YAML에 매핑하고 실행 단계로 이어집니다.
범위 분리: 멀티 프로젝트 글은 큐와 대여 믹스를 다루고, 본 글은 Mac을 등록하고 워크플로가 올바른 환경에 안정적으로 도달하도록 만드는 일을 다룹니다. 아키텍처 검토 시 표 1을 사용합니다.
| 차원 | 공유 러너 풀 | 전용 빌드 호스트 |
|---|---|---|
| 전형적 잡 | 린트, 단위 테스트, 가벼운 xcodebuild, 프로덕션 서명 없음 | 아카이브, TestFlight 업로드, 다중 시뮬레이터 매트릭스, 엄격한 서명 |
| 라벨 | 세분화: macos-14, xcode-16, no-signing 등 조합 가능 | 프로젝트 전용 태그; 다른 저장소가 runs-on으로 붙지 못하게 차단 |
| 동시성 | 보수적 병렬도 + 큐 초과분은 버스트 호스트로 | 병렬도를 디스크 텔레메트리에 묶고, 포화보다 안정을 우선 |
| 시크릿·계정 | 전용 CI 사용자, 분할 키체인 또는 프로파일 전략 | 고정 서명 신원, 로테이션 담당, 감사 추적 |
| 선호 시점 | 결합도가 낮고 짧은 큐가 허용될 때 | 컴플라이언스, 고객 납품, 재현 가능한 호스트가 필요한 릴리스 게이트 |
둘 다 원격 Mac을 구동할 수 있으나 시크릿 주입, 러너 가시성, 캐시 습관이 다릅니다. 표 2는 플랫폼과 엔지니어링 용어를 맞추기 위한 것이며, 필드 이름은 최신 벤더 문서와 대조합니다.
| 차원 | GitHub Actions(셀프호스트) | GitLab Runner(shell/ssh) |
|---|---|---|
| 스케줄링 | 저장소·조직 러너 + runs-on: [self-hosted, …] | tags 일치 + 등록 범위(프로젝트·그룹·인스턴스) |
| 시크릿 | Secrets/Variables, Environments; 단기 클라우드 자격 증명용 OIDC | CI/CD 변수, 마스킹 변수; 그룹 상속·보호 브랜치 주의 |
| 동시성 손잡이 | 매트릭스 잡은 러너 쪽에서 강제하는 프로세스 상한이 필요 | concurrent 및 러너별 설정; 격리 없이 한 사용자에 여러 실행기를 두지 않음 |
| 흔한 함정 | 셀프호스트 러너가 대화형 로그인 환경 변수를 물려받을 수 있음 | 여러 러너 프로세스가 Xcode 라이선스나 포트를 두고 경쟁 |
# GitHub Actions: 잡을 일반 macOS가 아니라 능력에 묶습니다
jobs:
ios_build:
runs-on: [self-hosted, macOS, xcode-16, m4-ci]
concurrency:
group: ios-${{ github.ref }}
cancel-in-progress: true
steps:
- uses: actions/checkout@v4
- name: Select Xcode
run: sudo xcode-select -s /Applications/Xcode_16.app
# GitLab CI: tags가 원격 Mac의 러너에 매핑됩니다
ios_build:
tags: [macos, xcode16, m4-ci]
script:
- xcodebuild -version
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
참고: 라벨 이름은 내부 런북에 Xcode 경로, 서명 허용 여부, 최대 병렬 잡과 함께 등록하고, 오래된 워크플로를 그대로 복사하지 않습니다.
리전 사전 작업은 멀티 리전 가이드를, 접근 선택은 SSH 대 VNC를 참고합니다.
Grafana, Datadog, 주간 보고서에 붙여 넣을 필드 이름입니다.
전용 호스트에서 두 주가 안정되면 두 번째 노드나 M4 Pro를 무거운 매트릭스용으로 검토합니다.
운영 부록: xcodebuild와 Swift 패키지 해석이 네트워크와 디스크를 동시에 포화시키면 P95는 컴파일 처리량만이 아니라 인덱싱·캐시 쓰기에서 늘어나는 경우가 많습니다. CPU만이 아니라 큐 길이와 디스크 대기를 함께 추적합니다. 러너 온라인 시간을 대여 청구서에 묶어 재무가 전용 호스트가 필요한 이유를 볼 수 있게 하고, 그렇지 않으면 공유 풀 논쟁이 증거 없이 반복됩니다.
중첩 가상화는 Metal, 서명, USB 워크플로에 마찰을 더하고, 개인 노트북은 수면·업데이트 일정이 무인 잡을 깨뜨립니다. 프로덕션급 Apple Silicon에는 베어메탈 전용, 선택 가능한 리전, 조합 가능한 대여 조건과 함께 러너 라벨·동시성을 운영 베이스라인에 인코딩하는 것이 필요합니다.
파편화된 데스크톱만으로는 장수 게이트웨이, AI 에이전트 실행층, 다중 저장소 CI를 오래 유지하기 어렵습니다. 권한 프롬프트와 예기치 않은 OS 업데이트가 자동화를 무작위 실패로 바꿉니다. MACCOME은 멀티 리전 Mac mini M4 / M4 Pro 베어메탈과 유연한 조건을 제공하며, 셀프호스트 러너와 수락 검증된 버스트 용량을 위한 베이스라인 실행 계층으로 활용하기에 적합합니다. 리전, SSH/VNC, 멀티 프로젝트 글을 읽은 뒤 요금 페이지에서 패키지를 맞추고 동일 리전을 주문합니다.
1차 아티팩트 리전에서 짧은 대여로 파일럿한 뒤 베이스라인을 월에서 분기로 늘리고, 매우 짧은 피크는 일·주 단위 버스트로 흡수하여 잘못된 티어에 현금을 장기 묶지 않습니다.
FAQ
러너를 더 늘릴까요, 라벨과 동시성을 먼저 조일까요?
라벨 의미와 러너별 병렬도를 먼저 고정한 뒤 큐와 디스크를 관찰합니다. 대여 요금을 연 다음 멀티 리전 선택과 짝지어 배치를 정합니다.
GitHub와 GitLab 시크릿을 한 줄로 정렬하려면?
장기 시크릿은 Git 밖에 두고, 서명은 별도 macOS 사용자로 격리합니다. 접근 패턴은 CI용 SSH 대 VNC와 고객 센터를 참고합니다.
병행 프로젝트까지 읽을 글은 무엇인가요?
멀티 프로젝트 용량과 대여 믹스로 러너 역할을 마일스톤에 맞춥니다.