SSH/VNC 판단표 · 8단계 런북 · 20분 검수 · CI 정렬
자체 Mac 없이 시간제 클라우드 Mac으로 iOS를 출시하는 팀은 Distribution 인증서 만료 메일을 받으면 Portal에서 갱신해도 대여 노드 키체인에 개인키가 없거나 SSH의 match가 멈추고 VNC에서는 2FA·「항상 허용」이 기다리는 패턴에 자주 빠집니다. 본문은 인증서·프로비저닝 프로파일·키체인 3층을 나누고, SSH만/하이브리드/VNC 주도 판단표, Portal→Match→Validate 8단 런북, 티켓용 네 가지 사실, 20분 동일 사용자 VNC 검수표를 제시합니다. Fastlane Match, Organizer/Transporter, NTP·인증서, 첫 TestFlight와 함께 읽으세요.
iOS 서명은 세 층으로 움직입니다. Apple Developer Portal의 인증서, 프로비저닝 프로파일에 내장된 인증서, 빌드하는 macOS 사용자 로그인 키체인의 개인키입니다. 갱신은 대여 Mac에 Xcode가 없어서가 아니라 한 층만 갱신되고 나머지가 이전 상태를 캐시할 때 실패합니다. 시간제 클라우드 Mac에서는 GUI 승인 없는 Archive 시도마다 요금이 쌓이고 VNC는 2FA·「항상 허용」을 기다립니다.
여러 macOS 계정을 섞는 팀—VNC 실험용 계정과 launchd 작업용 계정을 나눈 경우—에는 고전적인 실패가 붙습니다. 즉 Alice에게는 신원이 있는데 자동화 사용자 Bob에게는 없다는 상태입니다. 레인을 건드리기 전에 SSH와 VNC가 동일한 사용자 이름을 공유하도록 정규화하세요. 규정상 비밀번호 공유가 불가하면 사용자별 키체인만 쓰되, Match 프로파일을 각 자동화 주체에 따로 가져와야 한다는 비용을 받아들여야 합니다.
운영 관점에서는 시간제 노드마다 “누가 패스프레이즈와 배포 키를 보관하는지”, “어떤 브랜치 보호 규칙으로 인증서 저장소를 고치는지”, “파괴적 레인을 누가 실행할 수 있는지”를 한 페이지 운영 메모에 적어 두는 것이 좋습니다. 나중에 인력이 바뀌어도 같은 실수를 반복하지 않습니다.
로테이션 스프린트는 Portal 메타데이터와 로컬 키체인 의존성을 자주 놓칩니다. App Store Connect에서 Capability만 켜고 Xcode를 새로 고치지 않으면 유효한 인증서와 낡은 Entitlement 프로파일이 공존합니다. 시간제 노드에서는 실패한 Archive마다 요금이 누적되고 VNC는 2FA를 기다립니다. Team ID, 인증서 시리얼(끝 8자), 프로파일 UUID를 기록하세요.
Distribution 인증서는 팀당 활성 2개까지인 경우가 많습니다. 갱신이 곧바로 폐기는 아닙니다—다른 CI 호스트가 Match 동기화 전까지 구 인증서를 씁니다. 24–72시간 중복 허용과 파이프라인별 시리얼 표기를 Runbook에 넣으세요.
프로비저닝 프로파일에는 인증서와 Capability 해시가 포함됩니다. .mobileprovision만 바꾸고 자동 서명 캐시가 남으면 SSH 빌드만 성공하고 Organizer는 실패합니다. Portal 다운로드 후 VNC에서 Signing & Capabilities를 확인하세요.
Windows/Linux 중심 팀: .p12가 비밀번호 보호면 SCP로 개인키가 따라오지 않습니다. SSH로 security import는 가능하지만 첫 잠금 해제·Always Allow는 GUI 부채입니다. 로테이션마다 VNC 블록을 예산에 넣으세요.
릴리스 직전 주말에는 Portal 동결(새 Bundle ID 금지), 동일 노드 OS 베타 금지. NTP 체크리스트와 병행해 시계 2분 오차를 서명 오류로 오인하지 마세요.
사고 패턴: A는 Portal에서 갱신, B는 Match 없이 SSH Archive—역할을 Portal 변경자·Repo 머저·노드 검증자로 나누고 각각 증거를 남기세요.
App Store Connect API Key는 서명 인증서와 별개입니다. 티켓에 Delivery credentials vs Signing credentials 열을 분리하세요.
저장 공간: 로테이션은 Archive·Match 클론을 늘립니다. match development 전 시스템 볼륨 25GB 이상 여유.
로테이션 후: 동일 사용자 readonly 스모크(xcodebuild -showBuildSettings, VNC에서 짧은 Simulator), 그다음 CI.
단일 진실 공급원: 인증서 저장소에 브랜치 보호를 두고, Match에 합치지 않은 채 포털에만 프로파일을 올리는 핫픽스를 막습니다.
계정 일치: SSH 세션, cron, GUI 로그인이 같은 UID로 귀결되어야 서명 스모크 테스트 결과가 의미 있습니다.
시각 동기: 시계가 어긋나면 TLS와 “아직 유효하지 않음”류 오류가 납니다. Match 자체를 의심하기 전에 NTP를 확인합니다.
임대 규율: 패스프레이즈 에스크로, 배포 키, match nuke 같은 파괴적 레인 실행 권한을 문서화합니다.
GUI 부채: Organizer 오류, 2단계 인증, “항상 허용” 클릭은 SSH만으로 안정적으로 흉내 낼 수 없습니다.
이미 Android용 Linux 러너만 운용해 왔다면 macOS를 “또 하나의 SSH 호스트”로만 보지 않기를 권합니다. Apple 도구 체인은 최종 빌드가 헤드리스여도 그래픽 세션 서비스에 닿는 동의 흐름을 여러 단계에서 가정합니다.
아래 표는 지원 티켓을 라우팅할 때 쓰는 기준입니다. 네 번째 열 증상이 보이면 keep-alive 간격만 만지기보다 권장 접근 모드로 넘어가세요. 모드를 라벨로 남기면 한 대 임대를 여러 개발자가 돌려 쓸 때 중복 에스컬레이션을 줄입니다.
| 작업 | 선호 접근 | 전형적 실패 신호 | 흔한 오판 |
|---|---|---|---|
| 예약된 match readonly | CI 사용자 SSH | security/codesign 안에서 정체 | CocoaPods 미러 탓 |
| 이 노드 최초 가져오기 | CI 사용자로 VNC | User interaction is not allowed | DerivedData만 반복 삭제 |
| 자동 서명 전환 | Xcode 설정에서 VNC | 포털 대비 프로파일 목록 어긋남 | Git만 수정 |
| Organizer 업로드·2FA | VNC | Transporter 대화 상자 정지 | SSH 타임아웃만 연장 |
| match nuke 재구축 | VNC 확인 + SSH 실행 | 병렬 운영자 충돌 | 채널 뮤텍스 누락 |
| 캐시된 인증서 이후 단위 테스트 | SSH | 무작위 키체인 잠금 | 오래된 Xcode 이슈 ID에 고정 |
GUI 의존 작업은 미리 라벨을 붙이세요. 과금 친화적 노드는 맹목적인 SSH 재시도를 오래 용납하지 않습니다.
사내망에서는 SSH는 되는데 VNC나 Apple API가 막히는 경우가 있습니다. “VNC가 고장”이라고 단정하기 전에 SSH 터널과 VNC 트래픽 최적화 글에서 포워딩·압축·경로를 점검해 보세요. 명시적 터널이나 허용 포트와 Apple API용 분할 라우팅이 필요할 때가 많습니다.
순서대로 실행합니다. 여섯·일곱 단계 사이에 키체인을 수동으로 만졌다면 반드시 로그를 남기세요. 그렇지 않으면 다음 CI 실행이 비결정적으로 보입니다. xcodebuild -version, Ruby 관리 도구 선택, Bundler 잠금 파일 리비전을 Match 리비전과 함께 기록합니다.
도구 삼중 고정: README에 Xcode·Fastlane·Ruby 버전을 적고, macOS·Xcode 동결 매트릭스 가이드와 맞춰 시간제 노드가 릴리스 도중 표류하지 않게 합니다.
비밀 목록: 저장소 URL, 배포 키, 패스프레이즈 금고 항목을 검증하고 CI 로그에서 MATCH_PASSWORD가 노출되지 않게 합니다.
VNC 부트스트랩: 자동화 사용자로 Xcode에 Apple Developer 계정을 로그인하고, 약관·기기 프롬프트를 한 번에 처리합니다.
레인 실행: Bundler로 development 또는 appstore 레인을 돌리고, 정책이 허용하면 키체인 프롬프트에서 항상 허용을 선택합니다.
신원 탐침: security find-identity -v -p codesigning으로 확인하고 해시 화면을 티켓 보관함에 넣습니다.
스모크 아카이브: 최소 IPA 또는 아카이브를 만들고 번들 ID에 맞는 TestFlight 검수 관문을 통과했는지 확인합니다.
파이프라인 연결: SSH 세션이 문서화된 것과 같은 HOME·키체인 잠금 해제 전략을 야간 작업에서도 물려받는지 확인합니다.
임대 종료: 시간제 인스턴스를 끄기 전에 암호화 저장소 푸시가 끝났는지, 오프라인 백업 정책과 일치하는지 확인합니다.
# 대화형 키체인 승인이 한 번 성공한 뒤 읽기 전용 동기화 bundle exec fastlane match appstore --readonly security find-identity -v -p codesigning | head -n 20
참고: 장수 골든 이미지는 신원을 미리 넣을 수 있지만, 시간제 임대는 포털 순환 뒤에도 네 번째 단계를 주기적으로 증명하는 편이 안전합니다.
주의: 공유 임대에서 파괴적 레인을 동시에 돌리지 마세요. 팀 전체 뮤텍스를 먼저 확보합니다.
SSH는 명시된 경우를 제외하고 유휴로 두고, 아래 각 행을 한 세션에서 끝까지 수행합니다. 스크린샷을 변경 기록에 붙이면 App Store 심사나 내부 감사에서 해당 바이너리를 만든 기계 상태를 추적하기 쉽습니다.
| 점검 | 방법 | 합격 기준 |
|---|---|---|
| 사용자 일치 | 메뉴 표시줄 계정과 SSH whoami 비교 | 분리된 사용자 없음 |
| Xcode 계정 | 설정 → 계정 열기 | 설명 없는 노란 경고 없음 |
| 키체인 검색 | 배포 신원 필터 | 만료된 중복이 쌓이지 않음 |
| readonly 레인 | 자동화 사용자 터미널 | 종료 코드 0, 프로파일 시각이 Git과 일치 |
| codesign 연습 | 산출물에 codesign -dvvv | 전체 사슬, 임시 서명 없음 |
| Organizer 샘플 | 검증 또는 업로드 리허설 | 계정 시트에 막힘 없음 |
CapEx와 OpEx를 아직 저울질 중이라면 이 그리드와 함께 Mac mini 대여와 구매 비교 글을 짝지어 재무에 왜 시간제 노드와 규율 있는 VNC 블록이 간헐적 릴리스에 유리한지 설명할 수 있습니다.
Match로 프로파일을 가져온 뒤 아카이브·업로드 관문.
읽기 →서명 작업 전 신규 임대 Mac 준비.
읽기 →SSH는 되는데 VNC나 경로가 불안정할 때.
읽기 →키체인 승인 대화 상자는 같은 사용자의 대화형 세션이 필요합니다. 한 번 VNC로 열어 프롬프트를 승인한 뒤 readonly 레인을 재사용하세요.
암호화 Git 저장소는 남고 디스크에만 있던 캐시된 신원은 아닙니다. 갱신 체크리스트에 따라 임대 종료 전 재부트스트랩하세요.
범위가 좁은 배포 키와 레인 위생이 있으면 가능합니다. 포털 역할이 바뀔 때 자격 증명도 함께 순환하세요.
계정 연결, Organizer 실패, 신뢰 복구, 자동 서명 전환, 항상 허용이 필요한 키체인 흐름입니다. 두 번째 절을 참고하세요.
Fastlane Match는 버전 관리되는 서명 자산을 해결해 줄 뿐 macOS 동의 UX까지 대신하지 않습니다. SSH 전용 워크플로는 제출 전날 밤까지 대화형 부채를 숨기다가, 시간 과금이 겹친 채 누군가 데스크톱 접속을 급히 찾는 패턴으로 터집니다. Mac mini를 소유하면 임대 타이머는 사라지지만 자본 비용, 절전 정책, 릴리스 사이 유휴 하드웨어를 안게 됩니다.
VNC를 서명 인프라의 일부—일정에 넣고 문서화하며 readonly 레인과 짝을 이루게—로 두면 클라우드 노드가 훨씬 예측 가능해집니다.
위 체크리스트에 맞는 전용 Apple Silicon 호스트와 완전한 GUI 관측 가능성이 필요하면 VNCMac에서 서명 중심 워크플로에 맞춘 원격 Mac을 이용할 수 있습니다. 주 버튼으로 구매 페이지로 이동하고 결제 전에 제품 홈에서 요금제를 비교해 보세요.