본문으로 건너뛰기

iOS CI 빌드가 느릴 때 GitHub Actions에서 줄이는 방법

iOS CI 빌드가 느릴 때 볼 곳을 정리합니다, 단계별 시간 재기, Swift 패키지와 DerivedData 캐시, 러너 바꾸기를 실측 숫자와 함께 다룹니다

iOS CI 빌드가 느린 이유는 대개 의존성 받기, 처음부터 하는 컴파일, 러너 성능 세 곳입니다, 구간마다 시간을 재는 법과 줄이는 법을 순서대로 다룹니다

1 어디서 시간이 가는지 재기

단계마다 run을 나누면 GitHub 실행 화면에 단계별 시간이 찍힙니다, 의존성 받기와 빌드를 한 단계에 몰아 두면 어디가 느린지 알 수 없습니다

.github/workflows/ios.yml
name: iOS build
on: [push, workflow_dispatch]
jobs:
  build:
    runs-on: xenoci-macos
    timeout-minutes: 60
    steps:
      - uses: actions/checkout@v4
      - name: Resolve Swift packages
        run: xcodebuild -resolvePackageDependencies -scheme App -clonedSourcePackagesDirPath SourcePackages
      - name: Build
        run: |
          xcodebuild build -scheme App -destination 'generic/platform=iOS Simulator' \
            -clonedSourcePackagesDirPath SourcePackages -derivedDataPath DerivedData \
            CODE_SIGNING_ALLOWED=NO COMPILER_INDEX_STORE_ENABLE=NO
  • CODE_SIGNING_ALLOWED=NO는 시뮬레이터 빌드에서 서명 단계를 건너뜁니다
  • COMPILER_INDEX_STORE_ENABLE=NO는 CI에서 쓰지 않는 인덱스를 만들지 않습니다

2 의존성과 DerivedData 캐시하기

매번 새 머신에서 도는 CI는 이전 빌드 결과가 없어서 처음부터 컴파일합니다, actions/cache로 Swift 패키지와 DerivedData를 저장해 두면 다음 빌드에서 복원합니다

      - uses: actions/cache@v4
        with:
          path: |
            SourcePackages
            DerivedData
          key: ${{ runner.os }}-xcode-${{ hashFiles('**/Package.resolved') }}
          restore-keys: |
            ${{ runner.os }}-xcode-
  • 위 단계는 actions/checkout 바로 다음에 넣습니다
  • CocoaPods를 쓰면 path에 Pods와 ~/Library/Caches/CocoaPods를 넣고 키를 Podfile.lock으로 정합니다
  • Package.resolved와 Podfile.lock을 저장소에 커밋해 두어야 키가 바뀌지 않고 같은 버전을 받습니다
  • XenoCI에서는 actions/cache를 바꾸지 않아도 XenoCI 캐시 서버에 저장합니다, 조직당 25GB 무료(모든 저장소 합계)이고 7일 동안 안 쓰면 삭제합니다

3 러너를 바꿔 보기

같은 앱, 같은 워크플로를 GitHub macos-latest와 XenoCI에서 5번씩 돌린 가운데 값입니다(2026년 10월 24일, 오픈소스 iOS 앱 IceCubesApp, Xcode 26.6 Debug 시뮬레이터 빌드)

조건GitHub macos-latestXenoCI xenoci-macos차이
캐시 없이 처음부터522초182초2.9배 빠름, 비용 74% 적음
위 2번처럼 캐시 복원 뒤131초69초1.9배 빠름, 비용 62% 적음
  • GitHub 표준 러너는 Apple M1 가상 머신(vCPU 3개, 메모리 7GB), XenoCI는 Mac mini M4 위 VM(vCPU 4개, 메모리 7GB)입니다
  • 한 앱의 Debug 빌드라 앱 크기, 테스트, Release 빌드, 서명에 따라 차이는 달라집니다
  • 회차별 시간과 계산식은 GitHub Actions 비교 측정 방법에 있습니다, 측정에 쓴 워크플로는 공개 저장소 001005HS/xenoci-bench의 bench-roi.yml입니다

러너만 바꾸려면 macOS 잡의 runs-on을 xenoci-macos로 바꾸면 됩니다, 나머지 단계는 그대로 둡니다

4 그 밖에 빨라지는 설정

  • 테스트는 -only-testing:으로 필요한 번들만 돌리고 UI 테스트는 다른 잡으로 나눕니다
  • 메모리가 부족하면 -parallel-testing-worker-count 2처럼 병렬도를 낮추는 쪽이 오히려 빠릅니다
  • Homebrew 설치는 오래 걸리니 꼭 필요할 때만 HOMEBREW_NO_AUTO_UPDATE=1과 함께 씁니다
  • timeout-minutes를 평소 빌드 시간의 두 배 정도로 두면 멈춘 잡이 6시간 내내 과금되는 일을 막습니다

내 저장소에 바로 적용

다음 단계