Xcode 26 라이선스 미승인으로 CI가 멈췄다면, Xcode를 다시 설치하기보다 실제 호출 경로를 잠그고 해당 설치본의 로컬 문서에 따라 라이선스와 첫 실행 초기화를 처리한 뒤 CI 서비스 계정에서 최소 빌드를 실행해야 합니다. 여러 대의 Mac을 운영한다면 이 절차를 반복 가능한 전달 기준으로 만들고 격리 노드부터 단계적으로 적용해야 합니다.
이 글은 관리자 터미널에서는 빌드되지만 CI 서비스 계정에서는 계속 실패하는 팀을 위한 실행 문서입니다. 기업 IT 담당자, CI 플랫폼 담당자, 보안 감사 담당자와 기술 총괄이 각자 확보해야 할 증거와 중단 조건을 나누어 설명합니다.
SECTION 01관리자 터미널의 성공을 CI 성공으로 착각하지 마세요
대표적인 충돌은 다음과 같습니다.
- 관리자가 터미널에서
xcodebuild를 실행하면 프로젝트가 빌드됩니다. - Jenkins, GitHub Actions 또는 GitLab의 에이전트는 라이선스가 승인되지 않았다고 표시합니다.
- 같은 Mac에서 서로 다른 Xcode가 호출되거나, 전역 도구 체인과 작업별 도구 체인이 다릅니다.
- 관리자의 홈 디렉터리, 셸 설정, Keychain 접근 권한이 서비스 계정에 존재하지 않습니다.
이때 재설치부터 시작하면 원인을 숨길 수 있습니다. 먼저 CI 로그에서 실행된 명령, DEVELOPER_DIR, 작업 디렉터리와 셸 환경을 보존해야 합니다.
다음 명령은 상태 확인용입니다. 경로를 확인하기 전에는 라이선스 처리 명령을 복사해서 실행하지 않는 편이 안전합니다.
xcode-select -p
xcodebuild -version
xcrun --find xcodebuild
xcodebuild -help
man xcodebuild
여러 Xcode가 함께 설치된 Mac에서는 전역 선택과 작업별 선택을 분리합니다.
- Mac 전체의 기본 도구 체인은
xcode-select로 관리합니다. - 특정 CI 작업은 해당 작업의
DEVELOPER_DIR로 고정합니다. - 로그에는 Xcode 버전, 개발자 디렉터리,
xcodebuild실제 경로를 함께 남깁니다. - 실행 중인 에이전트가 셸 프로필을 읽지 않는다면 프로필에만 의존하지 않습니다.
Apple의 명령줄 도구 설정 문서와 빌드 및 실행 문서는 도구 체인 설정과 빌드 흐름을 확인할 때 기준으로 사용할 수 있습니다.
SECTION 02Xcode 26 라이선스 미승인과 초기화 오류를 분리하는 기준
오류 문구가 비슷해도 책임 팀과 다음 조치는 다릅니다. 아래처럼 증거를 분리하면 설치팀이 불필요하게 프로젝트를 수정하는 일을 줄일 수 있습니다.
- 라이선스 처리 미완료
- 증거: 선택한 Xcode의 라이선스 관련 오류와 해당 버전의 로컬 도움말
- 담당: Mac 전달 또는 플랫폼 팀
-
다음 조치: 로컬 문서에 표시된 방식으로 관리자 권한 초기화를 실행하고 종료 상태를 기록합니다.
-
첫 실행 시스템 작업 미완료
- 증거:
xcodebuild도움말에 표시된 첫 실행 옵션과 구성 요소 상태 - 담당: Mac 전달 팀
-
다음 조치: 해당 Xcode 앱 경로를 명시한 뒤 첫 실행 작업을 완료합니다.
-
선택적 플랫폼 구성 요소 부족
- 증거: 프로젝트가 요구하는 SDK, 시뮬레이터 또는 추가 구성 요소의 부재
- 담당: 플랫폼과 빌드 도구 팀
-
다음 조치: 추가 구성 요소 설치 안내와 실제 프로젝트 요구 사항을 대조합니다.
-
프로젝트 또는 서명 오류
- 증거: 도구 체인 확인과 무서명 최소 빌드는 통과하지만 의존성, 테스트, 아카이브 또는 서명 단계에서 실패합니다.
- 담당: 프로젝트와 릴리스 팀
- 다음 조치: 라이선스 문제로 되돌리지 말고 Keychain, 인증서, 프로비저닝과 프로젝트 설정을 별도로 조사합니다.
Xcode 26의 시스템과 SDK 지원 범위는 공식 릴리스 노트에서 확인해야 합니다. 작은 버전이 바뀌면 첫 실행 옵션이나 종료 상태가 같다고 가정하지 말고, 새 노드에서 xcodebuild --help와 man xcodebuild를 다시 읽어야 합니다.
주의: 라이선스 처리, 로컬 도구 체인 초기화, Apple Developer Program의 온라인 계약은 서로 다른 확인 대상입니다. 하나가 성공했다고 나머지 두 항목까지 유효하다고 판단하지 마세요.
SECTION 03역할별로 필요한 증거와 넘겨야 할 책임
Mac 전달 담당자
전달 담당자는 고정된 앱 경로를 기준으로 초기화해야 합니다. 스크립트에는 다음 항목을 포함합니다.
- 대상 Xcode 앱 경로
- 도구 체인 선택 결과
xcodebuild -version결과- 로컬 도움말에 표시된 라이선스와 첫 실행 처리 방법
- 관리자 권한 실행 여부와 종료 상태
- 구성 요소 상태
- 재부팅 뒤 같은 결과가 나오는지
명령의 선택지와 권한 요구는 설치된 작은 버전의 문서에서 확인합니다. 예를 들어 첫 실행 옵션이 지원되는지 확인하지 않은 채 xcodebuild -runFirstLaunch를 모든 노드에 일괄 전송해서는 안 됩니다. 로컬 도움말에 해당 옵션이 있고, 테스트 노드에서 예상한 종료 상태가 확인된 경우에만 기준 스크립트에 포함합니다.
CI 플랫폼 담당자
플랫폼 담당자는 관리자 계정이 아니라 생산 에이전트와 같은 맥락에서 검증합니다.
- 서비스 계정으로 실제
xcode-select경로와 Xcode 버전을 기록합니다. DEVELOPER_DIR가 작업에 주입되는지 확인합니다.- 비대화형 셸과 실제 작업 디렉터리에서
xcodebuild를 호출합니다. - 서명과 외부 의존성이 없는 최소 프로젝트를 빌드합니다.
- 의존성 해석, 테스트, 아카이브 순서로 범위를 넓힙니다.
- 실제 배포 작업에서만 필요한 서명 단계를 마지막에 검증합니다.
이 순서를 지키면 Xcode 초기화 실패, 의존성 문제, Keychain 서명 실패, 에이전트 시작 환경 문제를 서로 다른 사건으로 기록할 수 있습니다. Apple의 빌드 안내는 최소 빌드 흐름을 확인할 때 참고하고, 배포 서명은 서명된 코드 생성 안내와 실제 프로젝트 정책을 함께 검토합니다.
보안과 감사 담당자
초기화에 관리자 권한이 필요하더라도 공동 관리자 비밀번호를 CI 변수에 넣어서는 안 됩니다. 감사 기록에는 다음을 남깁니다.
- 누가 실행했는지
- 어느 Mac과 어느 Xcode 경로인지
- 어떤 작은 버전인지
- 어느 시점에 실행했는지
- 명령의 성공 또는 실패 종료 상태
- 재부팅 후 재검증 결과
- 실패 시 되돌린 노드와 사유
초기화 작업에 개인 Apple 계정, 장기 서명 키 또는 불필요한 시스템 권한을 함께 넣지 않습니다. 서명 비밀값은 작업 범위와 계정 경계를 분리하고, Keychain 접근은 Apple의 사용자 비밀 관리 문서의 원칙에 맞춰 별도로 통제해야 합니다.
SECTION 04여러 Mac에 적용하기 전에 실행할 배포 기준
일괄 수정은 명령 하나를 여러 노드에 보내는 작업이 아닙니다. 노드가 접수 가능한 상태인지 증명하는 작업입니다.
격리 노드에서 초기화하기
먼저 생산 큐에서 분리된 Mac을 선택합니다. 고정된 Xcode 경로를 지정하고 도구 체인 상태를 읽은 뒤, 해당 버전의 로컬 문서에서 확인한 초기화 절차를 실행합니다. 실행 전후의 버전과 경로를 저장합니다.
스크립트는 반복 실행해도 이미 완료된 노드를 불필요하게 변경하지 않는 방향으로 작성합니다. 라이선스 상태를 직접 추측하거나 성공 문구만 읽지 말고, 종료 상태와 후속 최소 빌드 결과를 함께 판단합니다.
실제 서비스 계정으로 최소 검증하기
관리자 셸이 아니라 CI 서비스 계정으로 다음을 검증합니다.
- Xcode 경로가 관리자 계정과 같은지
- 작업별
DEVELOPER_DIR가 덮어쓰이지 않는지 - 비대화형 셸에서 라이선스와 초기화 상태가 유지되는지
- 무서명 최소 빌드가 통과하는지
- 에이전트를 다시 시작한 뒤 같은 결과가 나오는지
여기서 실패하면 프로젝트 의존성이나 인증서를 만지지 말고 Mac 초기화와 에이전트 실행 환경으로 되돌아갑니다.
실제 프로젝트로 범위를 넓히기
최소 빌드가 통과한 뒤에만 기업 프로젝트를 실행합니다.
- 컴파일
- 단위 테스트와 필요한 시뮬레이터 테스트
- 의존성 해석
- 아카이브
- 정책상 필요한 서명
- 결과물 보관과 배포 전 검증
Apple 플랫폼 제출 요건이 바뀌면 도구 체인 기준도 다시 확인해야 합니다. App Store Connect 제출 도구 요구 사항은 Apple의 제출 관련 공지에서 확인하고, 팀 내부의 승인 기록과 분리해 보관합니다.
SECTION 05독립 FAQ
앞의 절차를 적용해도 실패 원인이 모호하다면 FAQ의 범위대로 책임을 다시 나누세요. 특히 관리자 터미널의 성공 결과를 서비스 계정의 증거로 옮겨 적지 않는 것이 중요합니다.
SECTION 06단계적 배포를 승인하는 체크리스트
다음 항목은 릴리스 담당자와 인프라 담당자가 함께 확인해야 합니다.
- [ ] 격리 노드에서 실제 Xcode 앱 경로를 기록했습니다.
- [ ] 해당 작은 버전의
xcodebuild --help와man xcodebuild를 읽었습니다. - [ ] 라이선스 처리와 첫 실행 작업을 서로 다른 상태로 기록했습니다.
- [ ] 관리자 권한 실행자와 실행 결과를 감사 로그에 남겼습니다.
- [ ] CI 서비스 계정의 비대화형 셸에서 경로와 버전을 확인했습니다.
- [ ] 무서명 최소 빌드가 통과했습니다.
- [ ] 실제 프로젝트의 의존성, 테스트와 아카이브를 검증했습니다.
- [ ] Keychain과 서명 실패를 Xcode 초기화 실패와 분리했습니다.
- [ ] 재부팅 후 새 CI 세션에서 같은 결과를 확인했습니다.
- [ ] Xcode 경로 전환 뒤에도 작업별 설정이 예상대로 적용되었습니다.
- [ ] 실패한 노드를 생산 큐에 되돌릴 방법을 확보했습니다.
- [ ] 생산 노드 전체에 적용하기 전 시험 노드의 승인 기록을 보관했습니다.
하나라도 확인하지 못했다면 일괄 배포를 중지하는 편이 안전합니다. 특히 재부팅 후 검증이 빠졌다면 현재 로그인 세션의 환경 변수나 캐시가 문제를 가리고 있을 수 있습니다.
SECTION 07기존 Mac을 계속 고칠지 원격 Mac을 추가할지
기존 Mac 풀을 계속 수정하려면 노드별 격리가 가능하고, 실패한 노드를 빠르게 되돌릴 수 있으며, 릴리스 큐에 영향을 주지 않는다는 조건이 필요합니다. 이 조건이 없으면 안정적인 생산 풀을 보존한 상태에서 별도의 원격 Mac을 Xcode 26 초기화 시험용으로 분리하는 편이 낫습니다.
자체 Mac을 계속 쓰는 방식은 물리 장비를 직접 통제할 수 있다는 장점이 있지만, 장비별 상태 편차, 교체 지연, 유휴 용량과 현장 접근 문제가 남습니다. 기존 클라우드형 실행 환경은 빠르게 늘릴 수 있어도 macOS 도구 체인의 초기화 상태, 서비스 계정 권한과 서명 비밀값을 직접 통제하기 어려운 경우가 있습니다. 어느 쪽이든 생산 노드와 시험 노드를 분리하지 않으면 라이선스 복구가 릴리스 중단으로 이어질 수 있습니다.
MACNOX의 원격 Mac 운영 안내는 별도 Mac에서 초기화 기준과 실제 CI 작업을 검증하려는 팀이 검토할 수 있는 선택지입니다. 현재 환경의 노드 격리와 회귀 검증이 부족하다면 요금과 이용 조건을 확인한 뒤 시험 기간에 필요한 용량만 분리하는 방식이 현실적입니다.
결국 판단 기준은 단순히 Mac을 더 확보할 수 있는지가 아닙니다. 현재 Mac 풀에서 Xcode 경로를 고정하고 서비스 계정 검증을 반복할 수 있는지, 실패 노드를 생산 큐에서 격리할 수 있는지, 재부팅 뒤 복구 결과를 남길 수 있는지가 핵심입니다. 이 조건을 충족하지 못한다면 기존 노드에 무리하게 일괄 수정하지 말고, 독립된 원격 Mac에서 Xcode 26 초기화와 실제 iOS CI/CD 작업을 먼저 통과시킨 뒤 노드 풀 확대 여부를 결정해야 합니다.
SECTION 08자주 묻는 질문 FAQ
Xcode 26 라이선스 동의가 필요하다는 오류로 CI가 실패하면 어디부터 확인해야 하나요?
먼저 관리자 터미널에서 같은 명령을 반복하지 말고 CI가 실제로 호출한 Xcode 경로와 버전을 확인해야 합니다. 그 뒤 해당 설치본의 xcodebuild 도움말과 매뉴얼에서 라이선스 처리와 첫 실행 작업의 지원 방식, 필요한 권한, 종료 상태를 확인합니다. 마지막으로 관리자 계정이 아닌 실제 서비스 계정에서 최소 빌드를 실행해야 합니다.
xcodebuild의 첫 실행 작업과 Xcode 라이선스 승인은 어떻게 다른가요?
라이선스 승인은 소프트웨어 사용 조건을 처리하는 단계입니다. 첫 실행 작업은 선택한 Xcode가 빌드에 필요한 로컬 시스템 구성과 추가 작업을 끝내는 과정입니다. 둘 중 하나가 완료되어도 다른 하나가 끝났다고 볼 수 없습니다. 설치된 작은 버전의 로컬 도움말을 기준으로 각각의 명령과 결과를 따로 기록해야 합니다.
여러 대의 Mac 빌드 서버에서 Xcode 첫 초기화를 일괄 처리하려면 어떻게 해야 하나요?
노드마다 고정된 Xcode 앱 경로를 지정하고, 도구 체인 선택과 초기화 명령을 반복 실행할 수 있는 전달 스크립트로 만들어야 합니다. 스크립트에는 관리자 권한 사용 기록, 종료 상태, 버전, 개발자 디렉터리와 구성 요소 확인 결과를 남겨야 합니다. 운영 풀 전체에 바로 적용하지 말고 격리 노드에서 먼저 검증합니다.
CI 서비스 계정에서는 계속 Xcode 라이선스 미승인이 표시되면 어떻게 해야 하나요?
관리자 셸의 성공 결과를 서비스 계정의 성공으로 간주하면 안 됩니다. 생산 에이전트와 같은 계정, 비대화형 셸, 환경 변수, 작업 디렉터리에서 경로와 버전을 확인한 뒤 서명 없는 최소 빌드를 실행합니다. 이 단계가 통과한 후에야 의존성 설치, 테스트, 아카이브와 서명 작업으로 범위를 넓혀야 합니다.