CI/CD (Continuous Integration / Continuous Delivery) е практиката за автоматично изграждане, тестване и доставяне на приложение при всяка промяна на кода. Според Statista (2025), 80% от екипите за мобилна разработка използват CI/CD. Тази статия обхваща популярни CI инструменти, Fastlane за автоматизация на мобилни компилации, както и Canary Release и Feature Flags.
Основни точки
Continuous Integration е основата на CI/CD автоматизацията за мобилни приложения. Това е практика, при която всеки разработчик обединява кода си в споделено хранилище няколко пъти на ден. След всеки push, CI сървърът автоматично изгражда проекта и пуска тестове. Ако тестовете се провалят, компилацията се счита за счупена и екипът незабавно отстранява проблема. CI предотвратява ситуацията «работи на моята машина», при която кодът на един разработчик чупи кода на друг.
Build Pipeline — последователност от стъпки, изпълнявани при всеки push: линтинг на код → unit тестове → debug APK/IPA компилация → интеграционни тестове → release компилация. Всяка стъпка се изпълнява само след успешното завършване на предишната. Артефактите от компилацията — APK, IPA, AAB, тестови отчети — се запазват и са достъпни за изтегляне.
Continuous Delivery — кодът се изгражда и тества автоматично, но човек решава дали да пусне в продукция. Continuous Deployment — всяка успешна компилация автоматично се пуска в продукция. За мобилни приложения, CD (доставяне до магазини) чрез TestFlight или Internal Testing е по-често срещано, тъй като окончателното решение за публикуване се взема от разработчика или мениджъра. Staging — среда, максимално близка до продукционната, използвана за тестване на компилацията преди пускане.
GitHub Actions е вградена CI/CD система за автоматизация на мобилни приложения в GitHub. Actions използва YAML конфигурация (.github/workflows) за описание на тръбопроводи. Налични са готови actions за мобилна разработка: actions/setup-java, gradle-build-action за Android, xcodebuild-action за iOS. GitHub Actions предоставя 2000 безплатни минути на месец за частни хранилища.
Пример: Android workflow включва извличане на код, настройка на JDK 17, кеширане на Gradle зависимости, пускане на lint и unit тестове, компилация на APK и качване на артефакт. За iOS — извличане, настройка на Xcode, pod install, пускане на XCTest, архивиране и експорт на IPA. GitHub Actions се интегрира с GitHub Releases, Slack и Telegram за известия.
GitLab CI е вградена CI/CD система в GitLab, конфигурирана чрез .gitlab-ci.yml. GitLab CI използва runners — агенти, които изпълняват задачи. За мобилна разработка можете да използвате споделени runners (Linux за Android) или свои собствени runners (macOS за iOS). GitLab CI поддържа паралелни задачи, артефакти, среди и ръчно одобрение за продукционни издания.
Bitrise е CI/CD платформа, специализирана в автоматизацията на мобилни приложения. Bitrise предлага готови Steps за Android, iOS, Flutter и React Native: Gradle Runner, Xcode Archive, Flutter Test, CocoaPods Install. Bitrise автоматично конфигурира подписването на код за iOS (чрез Codesigndoc) и предоставя виртуални машини с предварително инсталирани Xcode, Android SDK, Flutter и други инструменти.
Предимства на Bitrise: лесна настройка чрез визуалния Workflow редактор, поддръжка за паралелни компилации, интеграция с Firebase Test Lab, App Store Connect и Google Play Console. Bitrise предоставя 90 безплатни минути на месец за лични проекти. В IT Sectr използваме Bitrise за всички мобилни проекти — значително опростява CI/CD в сравнение с ръчната настройка на GitHub Actions.
| Критерий | GitHub Actions | GitLab CI | Bitrise | CircleCI |
|---|---|---|---|---|
| Специализация | Обща | Обща | Мобилна | Обща |
| macOS за iOS | Да (macOS runner) | Собствен runner | Да (вградено) | Да (macOS) |
| Безплатен лимит | 2000 мин/мес | 400 мин/мес | 90 мин/мес | 6000 мин/мес |
| Fastlane интеграция | Чрез run script | Чрез run script | Готов Step | Чрез run script |
| Подписване на код | Ръчна настройка | Ръчна настройка | Автоматично | Чрез Fastlane |
| Паралелни компилации | Да | Да | Да | Да |
Fastlane е инструмент за автоматизация на мобилни приложения за iOS и Android, написан на Ruby. Fastlane се състои от система от готови actions (над 200) и DSL за описание на сценарии чрез Fastfile. Fastlane решава задачи, които всеки мобилен разработчик изпълнява ръчно: подписване на код, създаване на екранни снимки, качване в TestFlight и Google Play, управление на сертификати и provisioning профили.
Lane — именуван сценарий във Fastfile. Пример: lane :release do — верига от действия за пускане на версия. Match — инструмент за безопасно съхранение и синхронизиране на сертификати и provisioning профили чрез криптирано Git хранилище. Gym — изграждане и архивиране на iOS приложения (обвивка около xcodebuild). Pilot — качване и управление на компилации в TestFlight. Deliver — качване на приложение и метаданни в App Store Connect. Snapshot — автоматично създаване на екранни снимки на всички езици. Screengrab — автоматично създаване на екранни снимки за Android.
Пример за Fastfile за Android: lane :beta извиква gradle (assembleRelease), след това firebase_app_distribution за разпространение на тестери. За iOS: lane :beta извиква match (изтегляне на сертификати), gym (архивиране) и pilot (качване в TestFlight). Fastlane може да се изпълнява локално и на CI сървър — което го прави универсален инструмент във всеки мобилен проект.
Canary Release е стратегия за CI/CD автоматизация за разгръщане на нова версия на приложението към малък процент потребители (1–5%) преди пълното пускане. В Google Play Console това се реализира чрез Staged Rollout: пускате актуализация на 5% от аудиторията си, наблюдавате сривове и метрики и увеличавате процента, ако няма проблеми. В App Store Connect — чрез Phased Release for Automatic Updates.
A/B тестване — сравнение на две версии на една функция върху случайни групи потребители. В мобилната разработка A/B тестовете се провеждат чрез Feature Flags, Firebase Remote Config или сървърна логика. Canary Release и A/B тестовете минимизират рисковете при пускане на нови функции.
Feature Flag (Feature Toggle) — условно активиране на функционалност без разгръщане на нов код. Feature Flag е проверка в кода: if (featureFlag.isEnabled()) { /* нов код */ } else { /* стар код */ }. Флаговете се управляват чрез услуги: LaunchDarkly, Split.io, Firebase Remote Config. Feature Flags позволяват на разработчиците да сливат код в main, дори ако функцията все още не е готова за потребителите.
LaunchDarkly — най-популярната платформа за управление на Feature Flags. LaunchDarkly предоставя SDK за iOS, Android, Flutter и React Native. Можете да активирате функции за конкретни потребители, сегменти, региони или процент от аудиторията. Feature Flags се използват и като kill switch — незабавно изключване на проблемна функция без пускане на нова версия на приложението.
Често задавани въпроси
Започнете с GitHub Actions — ако кодът ви е в GitHub. Actions е безплатен за публични хранилища, има вградена поддръжка за Android и iOS (macOS runners) и огромна екосистема от готови actions. За мобилна специализация — Bitrise.
Не, CI услугите (GitHub Actions, Bitrise, CircleCI) предоставят macOS runners. Плащате за минути използване. За локално отстраняване на грешки във Fastlane е необходим Mac, но CI може да работи в облака.
Canary Release — разгръщане на нова версия до подмножество потребители за проверка на стабилността. A/B тестване — сравнение на два варианта на една функция за избор на по-добрия. Canary е за надеждност, A/B е за конверсия.
Fastlane не е задължителен, но силно се препоръчва. Без Fastlane ще трябва ръчно да стартирате xcodebuild, да управлявате сертификати и да качвате компилации чрез уеб интерфейс. Fastlane автоматизира всички тези задачи с една команда.
Match е инструмент на Fastlane за управление на iOS Code Signing сертификати. Match съхранява сертификати и provisioning профили в криптирано Git хранилище и ги синхронизира между всички разработчици и CI сървъра.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.