증상: 배포 대기열은 길어지는데 Mac을 계속 추가해도 피크 시간에 바로 작업을 받지 못합니다.
가장 빠른 해법: 장기 상시 Runner를 단순 증설하지 말고, 기본 온풀과 대기열 기반 탄력 노드를 결합하십시오. 이 구조는 고정 서명 노드가 필요한 경우에도 적용할 수 있습니다.
이 글은 iOS 빌드 대기, 배포 피크, Mac 노드 이용률을 관리하는 개발 생산성 책임자를 위한 내용입니다. Runner 권한과 인증서 격리를 담당하는 기업 IT·보안 책임자, 고정 구매·클라우드 맥 렌탈·혼합 용량을 비교하는 기술 총괄에게도 적합합니다.
주의: Runner Scale Set Client는 Mac 호스트를 구매하거나 생성하는 도구가 아닙니다. 이 구성 요소는 Runner 수요와 등록 흐름을 다루는 제어면이며, Mac 호스트의 생성·초기화·회수는 별도 자동화 또는 KVMFLUX의 원격 Mac 자원 연동 계층이 담당해야 합니다.
배포 전에 정할 자동 확장 경계
대기열이 늘었다고 바로 노드를 추가하지 않는 이유
개발자 수보다 먼저 확인해야 할 값은 작업 대기 지속 시간, 피크 작업의 종류, 환경 준비 지연, 출시 SLA입니다. 예를 들어 대기열은 짧지만 Xcode 설치와 의존성 복원에 시간이 걸린다면 Runner 수를 늘려도 체감 개선이 제한적입니다.
반대로 같은 시간대에 서명 없는 테스트와 배포용 아카이브가 겹치면 작업 유형별 자원 분리가 필요합니다. Apple이 제공하는 Xcode 시스템 요구 사항에서 지원 macOS와 Xcode 조합을 확인한 뒤, 각 조합을 하나의 검증 가능한 기준선으로 관리해야 합니다.
세 자원군의 역할
| 자원군 | 맡길 작업 | 확장 정책 | 운영상 경계 |
|---|---|---|---|
| 기본 온풀 | 빈번한 테스트와 짧은 검증 | 최소 대기 용량 유지 | 비밀 자격 증명을 넣지 않거나 제한 |
| 탄력 노드 | 출시 피크와 일시적 병렬 빌드 | 대기열·작업 유형에 따라 생성 | 작업 후 Runner와 작업 공간을 폐기 |
| 고정 서명 노드 | 물리적 키, 고정 Keychain, 특수 인증 흐름 | 무분별한 자동 축소 금지 | 신뢰된 저장소와 승인된 작업만 허용 |
온풀은 모든 작업을 처리하는 상시 공유 풀이 아닙니다. 대기열이 기준을 넘을 때 탄력 노드를 요청하고, 특정 서명 흐름은 고정 노드에 남기는 이중 구조가 핵심입니다.
첫 시간의 조직 라우팅과 신뢰 경계
GitHub Actions의 self-hosted runner는 저장소, 조직 또는 기업 수준에서 사용할 수 있지만, 접근 가능한 저장소 범위는 Runner Group으로 제한해야 합니다. 공식 Runner Group 접근 제어 문서의 원칙에 따라 조직 전체에 무제한으로 노드를 노출하지 마십시오.
태그는 단순한 운영체제 구분값이 아닙니다. 다음 기준을 함께 반영해야 합니다.
- Xcode와 SDK 기준선
- Apple Silicon 여부
- 서명 작업 여부
- 저장소 신뢰도
- 테스트와 출시 빌드의 분리
- 캐시를 재사용해도 되는지 여부
예시로 라우팅 골격은 다음처럼 최소화할 수 있습니다.
runs-on:
- self-hosted
- macos
- apple-silicon
- xcode-release
실제 태그 이름은 조직 정책에 맞추되, 하나의 범용 태그로 모든 작업을 받지 않는 것이 중요합니다. Apple Silicon 전용 의존성이 있는 작업을 다른 아키텍처 노드에 보내면 설치 단계에서 실패할 수 있습니다. 지원되는 Xcode·macOS 조합은 Apple 공식 요구 사항으로 주기적으로 재검증하십시오.
공개 저장소의 작업이나 검증되지 않은 Pull Request가 생산 인증서를 가진 Mac에서 실행되면 안 됩니다. GitHub도 self-hosted runner에서 신뢰할 수 없는 코드를 실행할 때의 위험을 별도로 경고합니다. 자체 호스팅 Runner 보안 지침에 따라 생산 자격 증명, 배포 토큰, 서명 키를 테스트 노드와 분리하십시오.
첫날 연결할 제어면과 Mac 자원 조정
Runner Scale Set Client의 실제 책임
Runner Scale Set Client는 GitHub Actions의 작업 수요와 Runner 등록 흐름을 연결하는 구성 요소입니다. 공식 저장소는 이 기능이 macOS를 포함한 사용자 정의 Runner 자동 확장 구성에 활용될 수 있음을 설명하지만, Public Preview 상태와 구현 범위는 공식 저장소에서 배포 시점마다 다시 확인해야 합니다.
이 구성 요소가 직접 수행하지 않는 작업은 다음과 같습니다.
- Mac 호스트 구매 또는 임대 계약
- 가상 또는 물리적 Mac의 전원 켜기
- macOS 초기화와 Xcode 설치
- 네트워크와 원격 접속 구성
- 실패한 호스트의 회수
- 데이터센터 자원 반납
따라서 기업의 기존 자동화, 사내 자원 API 또는 KVMFLUX의 원격 Mac 용량을 호스트 수명 주기 계층으로 연결해야 합니다. Runner Scale Set Client를 Mac 공급 시스템으로 오해하면 제어면은 정상인데 실제 노드가 생성되지 않는 장애가 발생합니다.
상태 기계로 설계하는 확장 흐름
확장 경로는 다음 상태를 분리해 기록하십시오.
- 작업 수요가 발생합니다.
- 대기열 정책이 새 노드를 요청합니다.
- Mac 호스트가 준비됩니다.
- Runner가 JIT 또는 ephemeral 방식으로 등록됩니다.
- 작업이 해당 태그의 노드를 할당받습니다.
- 작업 종료 후 작업 공간과 인증 자료를 정리합니다.
- Runner를 해제하고 Mac 호스트를 재사용하거나 폐기합니다.
JIT 등록은 작업에 필요한 일회성 등록 정보를 발급하고, ephemeral Runner는 작업 종료 뒤 다시 사용하지 않는 운영 모델입니다. GitHub는 자동 확장 환경에서 ephemeral self-hosted runner 사용을 우선 권장합니다. 관련 등록과 관리 범위는 GitHub self-hosted runner 문서와 JIT·Runner REST API 문서에서 확인해야 합니다.
Webhook은 작업 수요를 빠르게 감지하는 데 적합하고, REST API는 상태 조회와 회수 확인에 적합합니다. 어느 한쪽만 시스템의 최종 상태로 신뢰하지 말고, 이벤트 ID와 호스트 ID를 저장해 중복 요청을 무해하게 처리하십시오.
다음과 같은 실패 상태를 처음부터 설계해야 합니다.
- 동일한 작업 이벤트가 두 번 도착한 경우
- Mac 부팅은 되었지만 Runner 등록이 시간 안에 끝나지 않은 경우
- 노드 생성 요청 뒤 작업이 취소된 경우
- Runner가 작업을 끝냈지만 해제 요청에 실패한 경우
- 태그가 맞지 않아 작업이 계속 대기하는 경우
용량 상한과 요청 만료를 두지 않으면 GitHub 이벤트 하나가 반복적으로 새 호스트를 만드는 폭주로 이어질 수 있습니다.
첫 번째 파이프라인의 일회성 Runner 검증
생산 서명 작업부터 연결하지 마십시오. 먼저 통제된 테스트 저장소에서 라우팅, 등록, 실행, 해제, 작업 공간 정리를 한 번에 검증해야 합니다.
검증 순서
- [ ] 테스트 저장소에만 Runner Group 접근 권한을 부여합니다.
- [ ]
macos,Apple Silicon, Xcode 기준 태그가 정확히 일치하는지 확인합니다. - [ ] JIT 또는 ephemeral 등록 토큰이 로그와 셸 기록에 남지 않는지 확인합니다.
- [ ] 작업 종료 뒤 Runner가 GitHub 목록에서 해제되는지 확인합니다.
- [ ] 작업 공간, 임시 파일, 의존성 자격 증명이 다음 작업에 남지 않는지 확인합니다.
- [ ] Xcode, SDK, 패키지 관리자와 캐시의 기준선을 추적할 수 있게 합니다.
- [ ] Keychain에는 테스트용 자료만 넣고 생산 서명 키를 제외합니다.
- [ ] Runner 애플리케이션 로그, 확장 이벤트, Mac 호스트 수명 주기 로그를 외부 저장소로 보냅니다.
- [ ] 호스트 종료 뒤에도 실패 원인을 조회할 수 있는지 확인합니다.
캐시는 성능을 위해 재사용할 수 있지만 인증 자료까지 캐시하면 안 됩니다. Derived Data, 패키지 다운로드 캐시와 서명 키, 세션 토큰, 배포 자격 증명은 같은 수명 주기로 취급하지 마십시오.
첫 주의 온풀과 용량 조정
어느 정도의 온풀이 필요한가
iOS 빌드 피크에 필요한 온풀 수를 미리 고정된 숫자로 정하는 것은 안전하지 않습니다. 최소 온풀은 실제 대기열, 작업별 실행 시간, Mac 제공 지연, 동시에 허용할 최대 작업 수를 측정해 정해야 합니다.
다음 표를 운영 데이터 수집 기준으로 사용하십시오.
| 관찰 항목 | 기록할 값 | 확장 판단 |
|---|---|---|
| 대기열 | 작업 생성부터 Runner 할당까지의 시간 | SLA 초과가 반복되면 탄력 노드 요청 |
| 준비 지연 | 호스트 요청부터 Runner 등록까지의 시간 | 온풀 확대 또는 제공 경로 점검 |
| 작업 유형 | 테스트, 아카이브, 서명, 배포 비율 | 노드 태그와 고정 용량 재조정 |
| 유휴 시간 | 작업이 없는 온풀 유지 시간 | 최소 온풀과 축소 냉각 정책 조정 |
| 실패 회수 | 연결 끊김·등록 실패·정리 실패 횟수 | 자동 폐기와 재시도 한도 점검 |
비용도 고정 보유 용량만으로 판단하지 마십시오. 유휴 시간, 호스트 제공 대기, 운영 인력, 재시도, 출시 지연을 함께 계산해야 합니다. KVMFLUX의 원격 Mac 사용 사례를 검토할 때도 먼저 필요한 노드 수, 피크 지속 시간, 필요한 임대 기간과 제공 제한을 표로 정리한 뒤 탄력 용량의 후보로 비교하십시오.
고정 구매는 장기적으로 계속 실행되는 안정적 부하와 물리적 장치가 필요한 서명 흐름에 유리할 수 있습니다. 반면 피크가 불규칙하고 팀별로 필요한 Xcode 환경이 달라지는 경우에는 필요할 때 Mac 용량을 혼합하는 편이 자원 낭비를 줄일 수 있습니다. 절감률을 사전에 단정하지 말고 실제 사용 시간과 제공 지연을 대입하십시오.
장애 복구 훈련
첫 주에는 정상 실행보다 다음 실패를 의도적으로 재현하십시오.
- 제어면 이벤트가 지연되는 경우
- Mac 호스트가 네트워크에서 사라지는 경우
- Runner 버전 갱신에 실패하는 경우
- 잘못된 태그로 작업이 라우팅되지 않는 경우
- 취소된 작업 뒤 자격 증명과 작업 공간이 남는 경우
GitHub의 Runner 모니터링 및 문제 해결 문서를 기준으로 Runner 상태와 로그를 수집하되, Runner가 사라진 뒤에도 조사할 수 있도록 외부 로그 저장소를 운영하십시오.
생산 승인과 단계적 배포
생산 승인은 Runner가 온라인인지 확인하는 절차가 아닙니다. 다음 항목을 모두 증거로 남겨야 합니다.
- [ ] 저장소와 Runner Group의 접근 범위가 승인 문서와 일치합니다.
- [ ] 작업 유형별 태그가 다른 Xcode와 칩 아키텍처를 혼동하지 않습니다.
- [ ] 하나의 작업이 끝난 뒤 Runner와 작업 공간이 폐기됩니다.
- [ ] 생산 서명 자격 증명이 테스트 작업에 노출되지 않습니다.
- [ ] 등록, 실행, 해제, 호스트 회수 로그를 작업 ID로 연결할 수 있습니다.
- [ ] 등록 실패와 호스트 연결 끊김에 대한 재시도 한도가 있습니다.
- [ ] 최대 노드 수와 비용 상한이 제어면에 반영되어 있습니다.
- [ ] 작업 취소 시에도 임시 인증 자료가 삭제됩니다.
- [ ] 통제된 복구 훈련 결과가 승인 기록에 포함되어 있습니다.
배포는 세 단계로 나누는 것이 좋습니다. 먼저 서명이 없는 테스트를 허용하고, 다음으로 신뢰된 저장소의 일반 빌드를 허용합니다. 마지막으로 생산 배포 작업을 별도 고정 노드에 연결할지 평가합니다. 물리적 키나 고정 Keychain이 필수라면 그 노드를 탄력 풀에 억지로 넣지 않는 편이 낫습니다.
현재 GitHub 공식 기준에서 Runner Scale Set Client는 Public Preview로 다뤄지고 있습니다. 그러므로 2026년 8월 21일 배포 시점에는 공식 Scale Set 저장소의 상태와 인터페이스를 다시 확인하십시오. 미래의 정식 출시일, 인터페이스 안정화 또는 새로운 호스팅 기능을 확정된 사실처럼 설계 문서에 쓰면 안 됩니다.
기존 방식과 탄력 Mac 용량의 선택
장기 온라인 공유 Runner를 계속 늘리는 방식은 시작이 단순하지만, 유휴 시간과 작업 간 잔여 데이터, 태그 충돌, 장애 노드 회수 누락을 누적시킵니다. 반대로 탄력 노드는 생성 지연과 초기화 실패를 관리해야 하므로 온풀 없이 단독으로 운영하면 짧은 피크에도 대기 시간이 커질 수 있습니다.
| 선택지 | 적합한 상황 | 반드시 보완할 점 |
|---|---|---|
| 고정 Mac 호스트 | 지속적인 부하, 고정 서명 환경 | 감가, 유휴 시간, 유지보수 책임 |
| 온풀 중심 | 짧은 작업이 반복되고 즉시 응답이 중요함 | 최소 수량과 축소 기준을 실제 자료로 조정 |
| 필요 시 원격 Mac | 불규칙한 피크, 일시적 프로젝트, 용량 확대 | 제공 시간, 네트워크, 로그와 초기화 검증 |
| 혼합 구성 | 테스트·아카이브·서명 요구가 서로 다름 | 태그, 권한, 비용 상한을 각각 관리 |
기존 방식의 핵심 단점은 세 가지입니다. 첫째, 피크가 끝난 뒤에도 Mac을 계속 보유하면 유휴 비용이 남습니다. 둘째, 공유 노드에 작업 흔적이 남으면 다음 작업의 신뢰 경계가 약해집니다. 셋째, 장애가 발생해도 노드 생성과 Runner 등록이 한 시스템에 묶여 있으면 원인 구분이 어렵습니다.
이런 이유로 온풀 계산을 마친 뒤에는 필요한 Mac 노드 수, 허용 가능한 제공 시간, 피크 지속 시간, 임대 기간을 별도 표로 만들어야 합니다. KVMFLUX의 요금 안내와 실제 운영 조건을 대조하면, 기존 고정 노드를 즉시 대체하지 않고도 탄력 풀에 적합한 용량부터 분리해 평가할 수 있습니다. 장기 안정 부하나 물리적 인터페이스가 필요한 작업은 계속 자체 노드에 두고, 임시 테스트와 출시 피크만 원격 Mac 용량으로 맡기는 방식이 현실적입니다.
마지막 업데이트: 2026년 8월 21일. GitHub self-hosted runner, Scale Set Client, JIT API, 보안 및 모니터링 문서와 Apple Xcode 시스템 요구 사항을 기준으로 내용을 확인했습니다. 호스트 제공 시간과 복구 시간은 사이트 실측 자료가 제공되지 않아 고정 수치로 제시하지 않았습니다.
더 읽어보기
기업용 맥 빌드 환경을 유연하게 확장해 보세요
KVMFLUX의 원격 맥으로 아이폰과 맥용 앱 빌드에 필요한 안정적인 작업 환경을 빠르게 확보할 수 있습니다. 빌드 대기열이 늘어날 때 필요한 맥 자원을 유연하게 추가해 탄력적인 실행 환경을 운영할 수 있습니다. 상시 운영 환경과 필요할 때 사용하는 추가 노드를 목적에 맞게 구성해 인프라 관리 부담을 줄일 수 있습니다. 기업의 자동화된 배포 흐름에 맞는 맥 임대와 원격 접속 환경을 KVMFLUX에서 시작해 보시기 바랍니다.