Xcode를 위한 원격 Mac: 로컬 빌드, 원격 빌드, 화면 공유 중 무엇을 선택할까
마운트한 작업 공간과 원격 Xcode는 서로 다른 데이터를 옮긴다. 소스, 인덱스, 빌드가 어디에 있을지 정하고 나서 왕복 횟수를 측정한다.
프로젝트를 네트워크로 공유해도 Xcode가 옮겨지지는 않는다. 앱은 계속 내 Mac에서 실행되고 서버에 프로젝트 데이터를 계속 요청하기 때문이다. 원격 Mac에서 Xcode를 실행하고 그 화면을 보는 것은 다른 구성이다. 앱과 파일이 같은 곳에 남고 회선은 화면과 입력만 나른다. 무엇이든 설정하기 전에 둘 중 무엇을 원하는지 정해 두면 이후 혼란의 대부분이 풀린다.
흔한 경우는 세 가지 구성으로 덮인다. 차이는 작업 공간이 어디에 있고 어느 기계가 컴파일하는가에 있다. 계속하기 전에 두 지점에 대한 답을 적어 두자.
Xcode를 실행하는 기계의 이름을 붙인다
첫 번째 구성에서는 모든 것이 로컬이다. 작업 복사본, 인덱스, 빌드가 모두 내 Mac에 있고 네트워크는 저장소와 의존성 트래픽만 나른다. 두 번째에서는 프로젝트가 Xcode와 함께 원격 Mac에 남으므로 인덱싱과 컴파일이 파일 옆에서 일어나고, 회선은 화면 내용과 키 입력을 나른다. 세 번째에서는 편집이 로컬에서 일어나고 명시적인 소스 인계 뒤에 원격 호스트에서 빌드가 실행된다. 표는 각 구성이 무엇을 옮기는지 보여 준다.
| Arrangement | Where the source lives | What crosses the link |
|---|---|---|
| Everything local | Local disk | Repository and dependency traffic |
| Remote Xcode, screen shared | Remote disk | Display frames and input events |
| Local edit, remote build | Both, with a handoff | Source transfer, then build output |
먼저 가운데 열을 읽자. 실패가 어디에 나타날지를 그 열이 정하기 때문이다. 소스가 원격인 작업 흐름은 회선이 느릴 때 실패하고, 원격 컴파일러를 쓰는 작업 흐름은 인계가 모호할 때 실패한다. 둘 모두에 책임을 지는 것은 세 번째뿐이다.
메가바이트가 아니라 왕복 횟수를 세라
편집기와 인덱서는 아주 많은 작은 파일 연산을 내보내고, 파일 시스템이 원격이면 그 하나하나가 왕복이 된다. 그래서 마운트한 작업 공간은 큰 복사 한 번과 달리 지연에 민감해진다. 파일 전송 시간을 재는 것으로는 그 흐름이 얼마나 쾌적한지 거의 알 수 없다는 뜻이다. 원격 화면은 반대 성격이다. 연속된 흐름을 옮기고 지연보다 대역폭을 잘 견딘다. 둘을 숫자 하나로 비교하면 자신만만한 오답이 나온다.
어느 구성도 본래 가장 빠르지 않다. 옳은 선택은 실제로 하는 작업에 달려 있으므로 다음 단계는 벤치마크가 아니라 그 작업을 시험해 보는 것이다.
소스 인계를 명시적으로 만들라
두 기계가 모두 작업 복사본을 가지고 있으면 어느 쪽이 권위가 있는지, 원격 빌드가 어느 리비전을 썼는지 정한다. 커밋은 하나의 마운트한 작업 트리를 두 도구로 편집하는 것보다 분명한 인계다. 커밋에는 정체성이 있고 마운트에는 없기 때문이다. 생성된 출력과 인덱스 데이터에도 주인이 필요하다. 소스에서 다시 만들어지는 것이므로 소스인 것처럼 이동해서는 안 된다. 충돌 규칙이 없는 양방향 미러는 작업 흐름이 아니라 경주다.
원격에서 빌드하려면 원격 호스트에 올바른 도구 체인이 있어야 하고 비공개 의존성을 위한 자격 증명도 있어야 한다. 호스트에 닿게 해 주는 VPN이 내 계정 접근 권한을 빌려 주지는 않으며, 거기에 Xcode를 설치하지도 않는다.
작업 흐름을 정하기 전에 경로를 확인하라
원격 호스트를 중심으로 설계하기 전에 그 호스트를 검증하고, 그다음 작업 흐름이 실제로 수행할 연산으로 회선을 측정한다. 아래 명령은 도구 체인, 활성 개발자 디렉터리, 원격 작업 공간을 괴롭히는 파일 관찰 비용을 확인한다. 마지막 명령은 로컬이 아니라 네트워크 경로에서 실행하자.
xcode-select -p
xcodebuild -version
ssh mac-builder 'xcodebuild -version'
time git status --porcelain
완전한 Xcode 설치가 없는 호스트는 xcodebuild에서 오류를 돌려준다. 이것은 네트워크가 아니라 도구 체인 문제다. 개발자 디렉터리는 빌드가 어느 Xcode를 쓸지 보여 주고, 명령줄 도구만 가리키는 경로라면 앱이 설치되지 않은 것이다. 마운트한 공유에서 저장소 상태 명령의 시간을 재면 왕복 비용이 직접 드러나고, 로컬 실행과 비교하면 의미 있는 숫자가 나온다. 그 차이가 이미 불편하다면 마운트한 작업 공간의 흐름은 진짜 편집기 아래에서 더 나쁠 것이다.
어느 구성을 골랐는지, 어느 기계가 소스를 소유하는지, 인계가 어떻게 작동하는지 기록하자. 그 메모가 있으면 다음 온보딩이나 노트북 교체는 조사가 아니라 설정 작업이 된다.