본문으로 건너뛰기

iOS 시뮬레이터

러너에 들어 있는 iOS 시뮬레이터 런타임, 기기 이름을 정하는 XENOCI_SIMULATOR 변수, 시뮬레이터 빌드와 테스트 스크립트를 설명합니다

각 Xcode에는 그 Xcode의 iOS SDK에 맞는 시뮬레이터 런타임이 하나씩 들어 있고, 기기 이름은 환경 변수 XENOCI_SIMULATOR로 정합니다

들어 있는 런타임

XcodeiOS 시뮬레이터 런타임
27.0 (기본)iOS 27.0
26.6iOS 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 build

OS 버전까지 고정하려면 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_testxcodebuild test, 결과 번들 TestResults.xcresult
rcp_builtin_ui_testxcrun 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로 만들 수 있습니다

다음 단계