Настройка CI/CD пайплайнів для сборки білдів ігор
Сборка Unity-проекту вручну на локальній машині розробника — це не пайплайн, це ризик. Сборка залежить від локальних настроїв середовища, версії редактора, імпортованих кешів. «У мене працює» перетворюється на «а у QA ні, тому що там інша версія скриптів чи інший кеш Shader Compiler».
CI/CD у геймдеві вирішує конкретну проблему: кожен commit у гілку develop автоматично собирається в відтворюваний артефакт — білд для конкретної платформи. QA завжди тестує свіжий білд, не залежить від програміста.
GameCI як основа Unity CI/CD
GameCI (game.ci) — відкритий Docker-образ з передустановленим Unity, спеціально для CI/CD. Працює з GitHub Actions, GitLab CI, CircleCI, Jenkins. Підтримує всі Unity-версії, починая з 2019.4 LTS, всі цільові платформи (Android, iOS, WebGL, Windows, macOS, Linux).
Базовий GitHub Actions workflow для Unity Android-білда:
- name: Build Android
uses: game-ci/unity-builder@v4
env:
UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
with:
targetPlatform: Android
unityVersion: 2022.3.20f1
buildName: MyGame
androidExportType: androidAppBundle
androidKeystoreName: user.keystore
androidKeystoreBase64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
androidKeystorePass: ${{ secrets.ANDROID_KEYSTORE_PASS }}
androidKeyaliasName: ${{ secrets.ANDROID_KEY_ALIAS_NAME }}
androidKeyaliasPass: ${{ secrets.ANDROID_KEY_ALIAS_PASS }}
Критичний момент — Unity License на CI-машині. Unity Personal/Plus вимагає seat activation. Для CI використовуємо либо Unity License Server (Enterprise), либо manual activation через game-ci activation workflow. Це перший камінь спотикання — без правильної активації CI просто не запуститься.
iOS-сборка в CI — окрема історія
iOS-білди вимагають macOS з Xcode. GitHub Actions надає macos-latest runner, але він дорогий у хвилинах. Альтернативи: Mac mini в хмарі (MacStadium, AWS EC2 Mac), self-hosted runner на фізичному Mac в офісі.
Ланцюг для iOS: Unity build → Xcode project (.xcodeproj) → Fastlane gym → .ipa → Fastlane pilot (TestFlight). Fastlane обробляє підпис сертифікатами через match (сертифікати зберігаються в зашифрованому git-репозиторії) або через Manual Provisioning Profile, завантажений у CI secrets.
Без автоматизації підпису кожен iOS-білд вимагає ручних дій у Apple Developer Portal. З Fastlane match — регенерація сертифікатів та provisioning profiles автоматична.
Структура пайплайну для ігрового проекту
Правильний CI/CD для гри складається з кількох stage:
Validation stage — швидкі перевірки без повної сборки: unit tests через game-ci/unity-test-runner, codeformat check, Asset Database integrity. Запускається на кожен push, займає 5–10 хвилин.
Build stage — повна сборка для цільових платформ. Запускається при merge у develop або за розписанням (нічні білди). Android: 15–40 хвилин. iOS: 30–60 хвилин. WebGL: 10–25 хвилин.
Distribution stage — після успішного білда: Android AAB → Google Play Internal Testing через fastlane supply, iOS IPA → TestFlight через fastlane pilot, WebGL → S3/CDN-хостинг. QA отримує сповіщення у Slack з прямим посиланням на тест-білд.
Production release stage — ручний триггер (manual approval). Фінальний білд з production-конфіґом, підписаний production keystore/certificate, публікується в магазині.
Self-hosted runner vs хмарний CI
Для студії з 3+ розробниками self-hosted runner на виділеній машині економічно вигідніше. Сборка Unity — CPU та IO інтенсивна задача. Час на GitHub Actions (4 CPU, 16 GB RAM) — 40 хвилин для Android-білда. На виділеному сервері (16 CPU, 64 GB RAM) — ті ж 12 хвилин.
Unity Shader Cache та Asset Import Cache між сборками — критичні для швидкості. На self-hosted runner кеш зберігається між runs. На хмарному CI потрібно явно кешувати через actions/cache (Library/ папка), інакше кожен білд імпортує все ассети заново.
Реальний кейс: студія 4 програмісти + 2 художники, Android-проект. Ручна сборка займала 50+ хвилин, робилась раз на тиждень. Після настройки GameCI + GitHub Actions на self-hosted Ubuntu-runner з Wine для Unity: автоматичний білд при кожному merge у develop, час сборки 18 хвилин, QA отримує посилання на Firebase App Distribution автоматично. Кількість виявлених баґів до релізу виросла в 3 рази — просто тому, що QA почав тестувати регулярно.
| Масштаб завдання | Орієнтовні строки |
|---|---|
| CI/CD для однієї платформи (Android або iOS) | 3–5 днів |
| CI/CD для двох платформ + distribution | 1–2 тижні |
| Повний пайплайн (Android + iOS + WebGL + Slack) | 2–3 тижні |
| Настройка self-hosted runner + кеширування | 2–4 дні |
Вартість розраховується після аналізу інфраструктури та цільових платформ.





