iOS 시뮬레이터
러너에 들어 있는 iOS 시뮬레이터 런타임, 기기 이름을 정하는 XENOCI_SIMULATOR 변수, 시뮬레이터 빌드와 테스트 스크립트를 설명합니다
각 Xcode에는 그 Xcode의 iOS SDK에 맞는 시뮬레이터 런타임이 하나씩 들어 있고, 기기 이름은 환경 변수 XENOCI_SIMULATOR로 정합니다
들어 있는 런타임
| Xcode | iOS 시뮬레이터 런타임 |
|---|---|
| 27.0 (기본) | iOS 27.0 |
| 26.6 | iOS 26.5 |
Xcode 26.6의 번들 런타임은 iOS 26.6이 아니라 iOS 26.5입니다
-destination에 OS 버전을 적을 때 주의하세요
런타임 목록은 GET /v1/environments의 simulator_runtimes와 콘솔 실행 → 환경 메뉴에 있습니다
VM에서 직접 확인하려면 스크립트에 다음을 넣습니다
xcrun simctl list runtimes
xcrun simctl list devices available기기 이름 정하기
기본 제공 레시피와 배치는 XENOCI_SIMULATOR 환경 변수를 기기 이름으로 쓰고, 없으면 iPhone 16을 씁니다
직접 쓰는 스크립트에서도 같은 변수를 쓰면 배치의 matrix.simulator와 바로 맞물립니다
set -euo pipefail
xcodebuild -scheme "$XENOCI_SCHEME" \
-destination "platform=iOS Simulator,name=${XENOCI_SIMULATOR:-iPhone 16}" \
CODE_SIGNING_ALLOWED=NO buildOS 버전까지 고정하려면 OS= 를 더합니다
그 Xcode에 없는 버전을 적으면 xcodebuild가 실패합니다
-destination "platform=iOS Simulator,name=iPhone 16,OS=27.0"기본 제공 레시피
콘솔 빌드 → 레시피 메뉴와 GET /v1/recipes에 시뮬레이터용 레시피 세 가지가 들어 있습니다
모두 XENOCI_SCHEME 환경 변수가 필요하고 XENOCI_SIMULATOR는 선택입니다
작업 폴더의 *.xcworkspace가 있으면 그것을, 없으면 *.xcodeproj를 자동으로 고릅니다
| 레시피 ID | 하는 일 |
|---|---|
rcp_builtin_ios_build | 시뮬레이터용 Debug 빌드, 서명 없음 |
rcp_builtin_unit_test | xcodebuild test, 결과 번들 TestResults.xcresult |
rcp_builtin_ui_test | xcrun simctl boot로 기기를 먼저 깨운 뒤 UI 테스트, 결과 번들 UITestResults.xcresult |
레시피로 잡을 보내는 예시입니다
recipe_id와 script는 함께 보낼 수 없습니다
curl -s https://xenoci.com/api/runner/v1/jobs \
-H "Authorization: Bearer $XENOCI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"recipe_id": "rcp_builtin_unit_test",
"env": { "XENOCI_SCHEME": "App", "XENOCI_SIMULATOR": "iPhone 16 Pro" },
"artifacts": ["TestResults.xcresult"],
"source": { "git_url": "https://github.com/acme/app.git", "ref": "main" }
}'.xcresult는 폴더이므로 결과물로 모으면 zip으로 묶여 내려옵니다
여러 기기로 한 번에
배치의 matrix.simulator에 기기 이름을 나열하면 조합마다 잡이 하나씩 생기고 각 잡에 XENOCI_SIMULATOR가 들어갑니다
한 축에 최대 20개입니다
{
"recipe_id": "rcp_builtin_ui_test",
"matrix": { "xcode": ["27.0"], "simulator": ["iPhone 16", "iPhone 16 Pro Max", "iPad Pro 13-inch (M4)"] },
"env": { "XENOCI_SCHEME": "AppUITests" },
"source": { "git_url": "https://github.com/acme/app.git", "ref": "main" }
}알아 둘 점
- 잡마다 새 VM이므로 시뮬레이터는 항상 초기 상태입니다, 이전 잡이 설치한 앱이나 켜 둔 기기는 남지 않습니다
- UI 테스트는 기기 부팅 시간이 과금에 포함됩니다,
rcp_builtin_ui_test처럼 테스트 전에simctl boot를 호출하면 첫 테스트의 대기 시간이 줄어듭니다 - 시뮬레이터 빌드에는 서명이 필요 없으므로
CODE_SIGNING_ALLOWED=NO를 붙여 인증서 없이 돌립니다 - 실기기 연결과 서명된 IPA 생성은 이 러너의 범위 밖입니다, 서명 없는 아카이브는
rcp_builtin_archive로 만들 수 있습니다
다음 단계
- Xcode 버전 선택: 런타임이 따라오는 Xcode 고르기
- 배치 빌드: 기기 매트릭스
- 결과물:
.xcresult내려받기