Swift Testing Linux와 macOS CI는 어떻게 분담할까? 2026 가이드
📋 목차
Linux CI는 통과했지만 Apple 플랫폼 빌드가 보장되지 않습니다. 가장 빠른 해결책은 Apple 프레임워크가 필요 없는 Swift Package 테스트는 Linux에 두고, Apple SDK·Xcode·Simulator·서명이 필요한 검증은 macOS로 분리하는 것입니다.
이 글은 공통 테스트를 기존 Linux CI에 남기려는 크로스 플랫폼 Swift Package 개발자를 위한 안내입니다. Apple 플랫폼 앱의 테스트 경계를 나누려는 엔지니어와 macOS CI 노드를 검토하는 DevOps 담당자도 대상입니다.
Swift Testing Linux와 macOS CI는 어디서 갈릴까요?
기준은 테스트 프레임워크 이름이 아니라 테스트 대상의 의존성입니다. Swift Testing은 Linux에서도 사용할 수 있지만, 그렇다고 UIKit이나 SwiftUI 같은 Apple 프레임워크에 의존하는 테스트까지 Linux에서 실행할 수 있다는 뜻은 아닙니다. Swift Testing 공식 저장소의 지원 플랫폼 안내에는 Linux와 Apple 플랫폼이 각각 기재되어 있습니다. 공식 플랫폼 지원 안내
- 테스트 대상이 순수 Swift 로직이고 의존성도 Linux에서 빌드되면 Linux CI에서 실행합니다.
- 대상 코드가 Apple SDK, Xcode 프로젝트 설정, Simulator 또는 서명 도구를 요구하면 macOS 검증을 추가합니다.
- 한 저장소에 두 유형이 함께 있으면 테스트 target과 실행 경로를 나눕니다. 한쪽의 성공을 다른 쪽의 성공으로 간주하지 않습니다.
Swift.org의 플랫폼 지원 자료와 Swift Testing의 지원 정보는 사용할 수 있는 플랫폼을 판단하는 근거입니다. 하지만 실제 프로젝트가 그 플랫폼에서 빌드되는지는 소스와 의존성 그래프를 따로 확인해야 합니다. Swift 플랫폼 지원표
Swift Testing 테스트를 Linux CI에서 돌릴 수 있나요?
테스트가 사용하는 API와 패키지 의존성이 Linux를 지원한다면 가능합니다. 먼저 테스트 target이 참조하는 모듈과 조건부 컴파일 분기를 확인하고, Linux job에서 해당 target을 실제로 빌드하고 실행해야 합니다. 프레임워크가 테스트 라이브러리와 호환된다는 사실만으로 프로젝트 전체의 호환성을 결론 내리면 안 됩니다.
순수 Swift Package와 Apple API 의존 테스트는 어떻게 다를까요?
Swift Package Manager의 플랫폼 선언은 패키지가 지원하는 플랫폼과 배포 대상 정보를 표현합니다. 이 선언은 Apple 플랫폼용 설정을 구성하는 데 유용하지만, 의존 라이브러리와 테스트 코드까지 자동으로 모든 운영체제에서 사용할 수 있게 만들지는 않습니다. PackageDescription 플랫폼 설정 문서
- Linux 우선 테스트: 데이터 변환, 계산 로직, 규칙 검증처럼 Apple SDK를 호출하지 않는 테스트입니다. 테스트 코드가 가져오는 라이브러리도 대상 Linux 환경에서 지원되는지 확인합니다.
- macOS 필수 검증: UIKit 등 Apple SDK를 직접 참조하는 코드의 컴파일과 실행입니다. UIKit은 Apple 플랫폼용 프레임워크이므로 이를 사용하는 테스트를 Linux에서 실행한다고 가정하지 마세요. UIKit 문서
- 조건부 컴파일 코드:
#if분기마다 플랫폼별로 다른 구현을 사용한다면, 각 분기가 실제 빌드 대상에서 선택되는지 확인합니다. 공통 로직의 Linux 테스트가 Apple 전용 분기까지 검증해 주지는 않습니다.
Swift Package Manager는 패키지와 빌드 구성을 관리하지만, 플랫폼별 API 사용 가능성은 프로젝트 코드와 의존성에 달려 있습니다. Swift Package Manager 문서
Apple 프레임워크가 있는 Swift Package 테스트는 macOS Runner가 필요한가요?
테스트가 Apple SDK에 의존하거나 Apple 플랫폼에서만 의미가 있는 동작을 검증한다면 macOS에서 실행해야 합니다. 다만 패키지 안의 모든 테스트를 한 덩어리로 옮기기보다는, 공통 로직과 Apple 플랫폼 동작을 분리할 수 있는지 먼저 살펴보세요. 테스트 target, 조건부 컴파일, 의존성 구조를 기준으로 나누면 Linux에서 유지할 수 있는 검사 범위를 보존할 수 있습니다.
앱 빌드와 Simulator 검증은 Linux 테스트와 무엇이 다를까요?
iOS 또는 macOS 앱을 실제로 빌드하고 Apple SDK를 사용하거나 Simulator에서 실행해야 한다면 Xcode가 포함된 macOS 환경이 필요합니다. Apple은 Xcode 테스트를 통해 앱 동작을 검증하고 테스트를 프로젝트에 추가하는 흐름을 안내합니다. Xcode 테스트 개요와 테스트 target 추가 안내를 기준으로 현재 테스트 구성을 점검하세요.
Simulator나 실제 기기에서 앱을 실행하는 검증 역시 별도 경로입니다. Linux에서 공통 Package 테스트가 통과해도 앱의 Apple 플랫폼 빌드, 실행, UI 동작까지 확인된 것은 아닙니다. Simulator 또는 실제 기기에서 앱 실행하기
Swift Testing의 Linux 결과가 Xcode 테스트를 대신할 수 있나요?
대신할 수 없습니다. Linux 테스트가 증명하는 것은 그 환경에서 빌드되고 실행된 코드 경로의 결과입니다. Xcode 테스트가 확인하는 Apple 플랫폼 빌드, SDK 연결, Simulator 실행, UI 동작은 해당 테스트를 수행한 macOS 환경의 결과로 따로 기록해야 합니다. 테스트 계획으로 실행 범위를 구성할 때도 어떤 테스트가 어느 환경에서 실행됐는지 드러나게 유지하세요. Xcode 테스트 구성 안내
첫 번째 단계: 테스트 의존성을 기준으로 실행 환경을 분류하세요
다음 순서로 실제 저장소를 확인하면 Linux와 macOS의 책임 범위를 정할 수 있습니다.
- CI에서 실행되는 테스트 명령과 대상 target을 목록으로 만듭니다. 명령 하나가 어떤 테스트를 포함하는지부터 확인합니다.
- 각 target의 import 항목과 직접·간접 의존성을 살핍니다. Apple SDK를 참조하는지, 의존 패키지가 Linux 빌드를 지원하는지 기록합니다.
- 조건부 컴파일로 플랫폼마다 달라지는 소스와 구현 경로를 찾습니다. 공통 코드라는 이유만으로 모든 분기가 테스트됐다고 판단하지 않습니다.
- Linux job에서는 호환되는 테스트 target을 실제로 빌드하고 실행합니다. 성공 기록에는 커밋과 실행한 target을 함께 남깁니다.
- macOS job에서는 Xcode 빌드, Apple 플랫폼 전용 테스트, Simulator 실행 또는 서명 검증처럼 필요한 작업만 수행합니다.
- 두 job의 커밋, 테스트 집합, 빌드 산출물과 테스트 보고서를 연결합니다. 결과 화면에 초록색 상태만 남기지 말고, 어떤 검증이 빠졌는지도 확인할 수 있어야 합니다.
주의: 테스트 파일이 빌드되지 않은 상태의 성공은 테스트 통과가 아닙니다. 각 CI job이 실제로 실행한 target과 보고서를 남겨야 플랫폼 간 공백을 찾을 수 있습니다.
체크리스트로 Linux와 macOS CI 분담을 결정하세요
아래 항목을 저장소의 각 테스트 target에 적용합니다. 항목을 확인한 뒤 조건에 맞는 환경에 배정하세요.
- [ ] 테스트 코드가 Apple SDK와 UIKit 같은 Apple 플랫폼 프레임워크를 가져오지 않습니다.
- [ ] 테스트가 참조하는 직접·간접 의존성이 Linux 대상 빌드를 지원합니다.
- [ ] 조건부 컴파일 분기가 Linux에서 빌드되는 경로와 일치하며, 실행 결과를 확인할 수 있습니다.
- [ ] 테스트가 Xcode 프로젝트 설정, Apple SDK 연결, Simulator, UI 실행 또는 서명을 요구하지 않습니다.
첫 세 항목을 확인했고 마지막 항목에도 해당하지 않으면 Linux CI에 배정합니다. Linux에서 실행할 수 있는 테스트 target과 명령을 기록하세요.
마지막 항목 중 하나라도 필요하거나 앞의 호환 조건을 확인하지 못했다면 macOS CI에 배정하거나 별도 검증을 남깁니다. Linux job의 성공만으로 해당 작업을 통과 처리하지 않습니다.
같은 target에 두 종류의 코드가 섞여 있으면 target이나 테스트 범위를 나눌 수 있는지 검토합니다. 분리가 어렵다면 각 job에서 실제로 실행된 테스트와 제외된 경로를 명시합니다. 적합도는 다음처럼 기록할 수 있습니다.
- Linux 적합: 빌드 가능한 의존성과 플랫폼 독립 로직이 확인됐습니다.
- 조건부 적합: 공통 테스트는 Linux에서 가능하지만 Apple 전용 target은 macOS 검증이 남아 있습니다.
- Linux 단독 부적합: 핵심 인수 조건이 Xcode 빌드, Apple SDK, Simulator 또는 서명 결과입니다.
Swift Package Manager와 Xcode CI의 역할을 이렇게 분리하면 Linux job을 없애지 않으면서 Apple 플랫폼 검증도 빠뜨리지 않을 수 있습니다. macOS 노드의 운영 방식을 검토하기 전에는 실제 Mac과 가상화 macOS의 차이도 확인해 실행 환경의 경계를 정리하세요.
원격 Mac을 추가하기 전에 실제 작업으로 검증하세요
Linux만으로 해결되지 않는 Apple 플랫폼 작업이 확인됐다면, 먼저 저장소에서 대표 작업 하나를 골라 요구 조건을 적습니다. 필요한 Xcode 프로젝트 빌드, 테스트 target, Simulator 검증, 서명 여부를 분명히 한 다음 같은 커밋으로 실행하고, 빌드 결과와 테스트 보고서가 남는지 확인하세요. 이 검증은 원격 Mac이 해당 작업을 맡을 수 있는지 판단하는 절차이지, 확인되지 않은 성능이나 비용을 추정하는 근거가 아닙니다.
Linux CI만으로는 Apple SDK와 Simulator를 검증할 수 없고, 개발자별 로컬 Mac에 기대면 결과와 실행 기록이 분산될 수 있습니다. 반대로 지속적인 고부하 작업이나 물리 장비 연결이 핵심이라면 자체 장비가 더 적합할 수 있습니다. Apple 전용 CI 작업을 간헐적으로 수행할 환경이 필요하다면 MacDate의 원격 Mac 선택지를 살펴보고, 실제 저장소의 빌드·테스트 요구에 맞는지 먼저 확인한 뒤 대여 여부를 결정하세요. 맥 미니를 직접 마련하는 선택과 비용 항목을 비교하고 싶다면 맥 미니 대여 비용 안내도 참고할 수 있습니다.