EAS Build та профілі збірки
Вступ: від локальної розробки до продакшн-білда
На етапі розробки ваш React Native застосунок виконується у середовищі Expo Go (готовий контейнер із вбудованими нативними модулями) або через Development Build (кастомна збірка з вашими власними нативними залежностями). Проте для публікації застосунку в App Store або Google Play Store потрібен продакшн-білд — оптимізований, підписаний, скомпільований бінарний файл формату .ipa (iOS) або .apk / .aab (Android).
Історично процес створення продакшн-білдів вимагав від розробника:
- Встановлення та налаштування Android Studio із SDK, Gradle, JDK певних версій.
- Встановлення Xcode (лише на macOS) із Command Line Tools, provisioning profiles, signing certificates.
- Ручного керування версіями нативних залежностей, вирішення конфліктів
build.gradle,Podfile, налаштування keystore для підписування Android-білдів. - Локальної збірки на власному комп'ютері, що займає 10–30 хвилин і споживає значні обчислювальні ресурси.
EAS Build (Expo Application Services) — це хмарна платформа для автоматизованої збірки React Native застосунків без необхідності встановлення Android Studio чи Xcode на локальній машині. Вся компіляція відбувається на віддалених серверах Expo у контейнерах із заздалегідь налаштованими залежностями.
Що таке EAS і чому це не "тільки для Expo"
create-expo-app. Він підтримує:- Managed Workflow (Expo) — проєкти без папок
android/таios/, де нативний код генерується автоматично. - Bare Workflow (React Native CLI) — проєкти з повним доступом до нативних папок
android/таios/, створені черезnpx react-native init. - Гібридні проєкти — проєкти, що почалися як Expo, але після виконання
npx expo prebuildотримали нативні папки для кастомізації.
Переваги EAS Build над локальною збіркою
☁️ Хмарна інфраструктура
- Білди виконуються на потужних віддалених серверах AWS.
- Не потрібно встановлювати Android Studio, Xcode, JDK, SDK на локальному комп'ютері.
- Підтримка паралельних білдів (iOS + Android одночасно).
- Автоматичне кешування залежностей (
node_modules, CocoaPods, Gradle cache).
🔐 Автоматичне підписування
- EAS автоматично генерує та керує iOS сертифікатами і provisioning profiles.
- Автоматичне створення Android keystore для підписування APK/AAB.
- Захищене зберігання приватних ключів у хмарному сховищі Expo.
- Можливість використання власних сертифікатів.
📦 Профілі збірки
- Різні конфігурації для розробки, тестування, staging та production.
- Змінні оточення для кожного профілю (API keys, endpoints).
- Окремі bundle identifiers для різних середовищ.
- Версіонування та автоінкремент build numbers.
🚀 Інтеграція з CI/CD
- GitHub Actions, GitLab CI, Bitbucket Pipelines.
- Автоматичні білди при push у певні гілки.
- Webhooks для оповіщення команди (Slack, Discord).
- Збереження артефактів білдів із можливістю завантаження QR-кодом.
Мета цієї лекції: від нуля до APK
Ця лекція проведе вас через весь процес створення продакшн-білду крок за кроком:
Крок 1: Реєстрація облікового запису Expo
Створення безкоштовного акаунту та налаштування CLI для автентифікації.
Крок 2: Ініціалізація EAS у проєкті
Конфігурація eas.json — файлу з профілями збірки.
Крок 3: Налаштування профілів збірки
Створення окремих конфігурацій для development, preview та production.
Крок 4: Перший білд для Android
Запуск хмарної збірки, моніторинг прогресу, завантаження APK-файлу.
Крок 5: Перший білд для iOS
Генерація сертифікатів, provisioning profiles, отримання IPA-файлу (вимагає Apple Developer акаунт).
Крок 6: Локальна збірка (без хмари)
Альтернативний варіант: компіляція на власному комп'ютері через eas build --local.
Крок 7: Змінні оточення та секрети
Захищене зберігання API keys, токенів через EAS Secrets.
Крок 8: Автоматизація через GitHub Actions
Налаштування CI/CD для автоматичних білдів при push у репозиторій.
Передумови: що потрібно мати перед початком
Перед запуском EAS Build переконайтеся, що у вас є:
node --version.npx. Мінімальна версія: 6.0.0.- Free tier: 30 білдів на місяць (підходить для навчання та малих проєктів).
- Production plan: $29/місяць для необмеженої кількості білдів однієї платформи (iOS або Android).
- Enterprise plan: $99/місяць для необмеженої кількості білдів обох платформ + Priority Support.
Крок 1: Реєстрація облікового запису Expo
1.1. Створення акаунту через веб-інтерфейс
- Відкрийте браузер та перейдіть на https://expo.dev/signup
- Заповніть форму реєстрації:
- Username: унікальне ім'я користувача (буде частиною URL вашого профілю:
expo.dev/@username) - Email: дійсна електронна пошта (для підтвердження акаунту та оповіщень про білди)
- Password: надійний пароль (мінімум 8 символів)
- Username: унікальне ім'я користувача (буде частиною URL вашого профілю:
- Натисніть "Create Account"
- Перевірте пошту та підтвердіть email через лист від
noreply@expo.dev
1.2. Автентифікація в CLI
Після створення акаунту потрібно авторизувати Expo CLI на вашому комп'ютері:
npx expo login
# Якщо ви встановили expo-cli глобально
expo login
Інтерактивний процес автентифікації:
- Перейдіть на https://expo.dev/forgot-password
- Введіть email, прив'язаний до акаунту
- Відкрийте лист від Expo з посиланням для скидання паролю
- Створіть новий пароль
- Повторіть
npx expo loginз новими даними
expo login генерується session token (тимчасовий ключ доступу), який зберігається локально у файлі ~/.expo/state.json. Сам пароль ніколи не зберігається на диску. Токен діє 30 днів, після чого потрібна повторна автентифікація.1.3. Перевірка автентифікації
Переконайтеся, що CLI успішно авторизований:
npx expo whoami
Очікуваний вивід:
Якщо замість імені ви бачите Not logged in, повторіть команду npx expo login.
Крок 2: Ініціалізація EAS Build у проєкті
2.1. Встановлення EAS CLI
EAS CLI — це окремий інструмент командного рядка для роботи з Expo Application Services. Він не входить у базовий expo-cli.
npm install -g eas-cli
yarn global add eas-cli
pnpm add -g eas-cli
Перевірка встановлення:
eas --version
npx: npx eas-cli <command>. Проте для частого використання глобальна установка зручніша.2.2. Прив'язка проєкту до Expo-акаунту
Перейдіть у кореневу директорію вашого React Native проєкту:
cd /path/to/your/project
Виконайте ініціалізацію EAS:
eas init
Інтерактивний процес:
Ця команда:
- Створює унікальний Project ID для вашого застосунку в хмарній інфраструктурі Expo.
- Додає поле
"extra.eas.projectId"до файлуapp.jsonабоapp.config.js. - Дозволяє вам відстежувати білди, логи, crashes через веб-дашборд expo.dev.
Зміни в app.json:
{
"expo": {
"name": "My App",
"slug": "my-app",
"version": "1.0.0",
"extra": {
"eas": {
"projectId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
}
}
}
projectId! Це унікальний ідентифікатор, що зв'язує ваш локальний код з хмарною платформою. Якщо ви випадково видалите його, білди перестануть асоціюватися з правильним проєктом.2.3. Створення конфігураційного файлу eas.json
Файл eas.json — це центральна конфігурація всіх профілів збірки. Створіть його через команду:
eas build:configure
Інтерактивний діалог:
Структура згенерованого eas.json:
Пояснення полів:
| Поле | Призначення |
|---|---|
cli.version | Мінімальна версія EAS CLI для сумісності |
build.development | Профіль для Development Build (з Dev Menu, Hot Reload) |
build.preview | Профіль для внутрішнього тестування (без dev-функцій, але без публікації в стори) |
build.production | Профіль для фінального релізу в App Store / Google Play |
submit.production | Конфігурація автоматичної публікації у стори (опціонально) |
build.staging, build.qa, build.demo. EAS Build не обмежує вас трьома дефолтними профілями.Крок 3: Налаштування профілів збірки
3.1. Профіль development (для розробки)
Цей профіль створює Development Build — версію застосунку з увімкненим Dev Menu, Hot Reload та можливістю підключення до Metro bundler.
Конфігурація:
{
"build": {
"development": {
"developmentClient": true,
"distribution": "internal",
"android": {
"buildType": "apk"
},
"ios": {
"simulator": true
},
"env": {
"API_URL": "http://localhost:3000"
}
}
}
}
Пояснення параметрів:
| Параметр | Значення | Пояснення |
|---|---|---|
developmentClient | true | Вмикає Dev Menu та режим розробника |
distribution | internal | Білд не призначений для публікації в стори |
android.buildType | apk | Створює APK замість AAB (зручніше для ручного тестування) |
ios.simulator | true | Створює білд для iOS Simulator (не потрібен Apple Developer акаунт) |
env.API_URL | URL | Змінна оточення, доступна через process.env.API_URL |
3.2. Профіль preview (для тестування)
Цей профіль створює білд, максимально наближений до production, але призначений для внутрішнього тестування командою QA або бета-тестерами.
{
"build": {
"preview": {
"distribution": "internal",
"android": {
"buildType": "apk"
},
"env": {
"API_URL": "https://staging-api.myapp.com"
}
}
}
}
Відмінності від production:
- Використовується staging API замість production.
- Може мати окремий Bundle Identifier (наприклад,
com.myapp.staging) для встановлення поруч із production-версією. - Логування та дебаг-інформація може бути більш детальною.
3.3. Профіль production (для релізу)
Фінальний профіль для публікації в App Store та Google Play Store.
{
"build": {
"production": {
"android": {
"buildType": "app-bundle"
},
"env": {
"API_URL": "https://api.myapp.com"
}
}
}
}
Критичні параметри production:
| Параметр | Значення | Пояснення |
|---|---|---|
android.buildType | app-bundle | Створює AAB (Android App Bundle) — вимога Google Play з 2021 року |
ios.bundleIdentifier | com.mycompany.myapp | Унікальний ідентифікатор застосунку в App Store |
android.package | com.mycompany.myapp | Унікальний package name для Google Play |
com.myapp, ви не зможете використати це ім'я. Формат: зворотний домен (com.yourcompany.appname).3.4. Версіонування білдів
Кожен білд повинен мати унікальний номер версії та build number. EAS підтримує автоматичний інкремент.
Додайте до eas.json:
{
"build": {
"production": {
"autoIncrement": true,
"android": {
"buildType": "app-bundle"
}
}
}
}
Версії в app.json:
{
"expo": {
"version": "1.0.0",
"android": {
"versionCode": 1
},
"ios": {
"buildNumber": "1"
}
}
}
version (iOS: CFBundleShortVersionString, Android: versionName):
- Публічна версія, що відображається користувачам:
1.0.0,2.1.3,3.0.0-beta. - Формат: Semantic Versioning (
major.minor.patch). - Змінюється вручну при випуску нової функціональності або виправлень.
buildNumber / versionCode:
- Внутрішній лічильник білдів:
1,2,3, ...,1042. - Повинен монотонно зростати з кожним новим білдом (App Store / Google Play вимагають цього).
- При використанні
autoIncrement: trueEAS автоматично збільшує це число.
Приклад: Ви випускаєте версію 1.0.0 з buildNumber: 15. Потім виправляєте баг і випускаєте 1.0.1 з buildNumber: 16. Версія змінилася, але buildNumber завжди зростає.
Крок 4: Перший білд для Android
4.1. Запуск хмарної збірки
Тепер, коли все налаштовано, запустимо першу збірку для Android у профілі preview:
eas build --platform android --profile preview
Розбір команди:
| Параметр | Призначення |
|---|---|
--platform android | Цільова платформа (можливі значення: android, ios, all) |
--profile preview | Використовуваний профіль з eas.json |
--platform all. Проте для навчання краще почати з однієї платформи.4.2. Інтерактивний процес першого білду
При першому запуску EAS запитає кілька критичних параметрів:
Що відбувається під капотом:
- Генерація Android Keystore:
- Keystore — це файл з приватним ключем для підписування APK/AAB.
- Без підписування Google Play не приймає білди.
- EAS автоматично генерує keystore і зберігає його у захищеному хмарному сховищі.
- Критично: Ніколи не втрачайте keystore! Без нього неможливо оновити застосунок у Google Play.
- Завантаження коду на сервери Expo:
- Весь вихідний код упаковується та надсилається у хмару.
- Виключені папки (з
.gitignore,.easignore) не завантажуються.
- Запуск Docker-контейнера:
- На серверах AWS запускається ізольований контейнер з Android SDK, Gradle, Node.js.
- Встановлюються залежності:
npm installабоyarn install. - Виконується збірка нативного коду через Gradle.
Так. Якщо у вас вже є keystore (наприклад, з попереднього застосунку або локальної збірки), ви можете завантажити його:
eas credentials
Оберіть:
- Android → Production → Keystore
- Upload new Keystore
- Вкажіть шлях до файлу
.jksабо.keystore - Введіть паролі keystore та key alias
EAS збереже ваш keystore і використовуватиме його для всіх наступних білдів.
Package name (наприклад, com.yourcompany.myapp) — це унікальний ідентифікатор вашого застосунку в екосистемі Android:
- Він не може бути змінений після публікації в Google Play.
- Два різні застосунки не можуть мати однаковий package name.
- Формат: зворотний домен вашої компанії + назва застосунку.
- Рекомендація: Використовуйте домен, яким ви володієте:
com.mycompany.app, а не загальні назви типуcom.myapp.
Якщо ви випадково оберете package name, який вже зайнятий, Google Play відхилить білд при спробі публікації.
4.3. Моніторинг процесу збірки
EAS Build надає детальні логи в реальному часі. Відкрийте посилання з термінала у браузері:
https://expo.dev/accounts/your_username/projects/my-app/builds/abc123
Веб-інтерфейс білду:
Типовий час збірки:
| Етап | Тривалість |
|---|---|
| Очікування у черзі | 1–5 хвилин (залежить від навантаження серверів) |
| Встановлення залежностей | 2–4 хвилини |
| Prebuild (генерація нативного коду) | 1–2 хвилини |
| Gradle збірка | 5–10 хвилин |
| Підписування | 10–20 секунд |
| Загальний час | 10–20 хвилин |
node_modules, Gradle та Maven артефактів.4.4. Завантаження готового APK
Коли збірка завершиться успішно, ви побачите:
Три способи встановлення APK:
- Відкрийте камеру на Android-пристрої
- Наведіть на QR-код у терміналі або на веб-сторінці
- Натисніть на посилання, що з'явилося
- Браузер завантажить APK
- Дозвольте встановлення з невідомих джерел у налаштуваннях
- Натисніть Install
- Скопіюйте URL із виводу термінала
- Надішліть собі на телефон (Telegram, Email)
- Відкрийте посилання на пристрої
- Завантажте APK
- Встановіть через менеджер файлів
# Завантажте APK локально
curl -o build.apk "https://expo.dev/artifacts/eas/abc123.apk"
# Підключіть Android-пристрій через USB
# Увімкніть USB Debugging у Developer Options
# Встановіть APK
adb install build.apk
Це нормально для внутрішнього тестування. Дозвольте встановлення:"For your security, your phone is not allowed to install unknown apps from this source."
- Settings → Apps → Special app access → Install unknown apps
- Оберіть браузер або файловий менеджер
- Увімкніть "Allow from this source"
4.5. Тестування встановленого білду
Після встановлення APK:
- Перевірте іконку застосунку на домашньому екрані
- Запустіть застосунок і переконайтеся, що всі екрани працюють
- Перевірте мережеві запити (чи підключається до правильного API endpoint)
- Перевірте дозволи (камера, локація, сховище) — Android покаже діалоги при першому запиті
# Відфільтруйте логи лише від вашого застосунку
adb logcat | grep "com.yourcompany.myapp"
Крок 5: Перший білд для iOS
5.1. Вимоги для iOS-збірки
На відміну від Android, збірка для iOS має додаткові обмеження:
com.yourcompany.appname. Має бути зареєстрований в Apple Developer Portal.eas build --platform ios --profile preview
ios.simulator: true у eas.json. Такий білд не вимагає сертифікатів і працює лише в емуляторі.5.2. Налаштування Apple Developer облікового запису
Перед першою iOS-збіркою потрібно зареєструвати ваш Bundle Identifier:
- Відкрийте developer.apple.com/account
- Увійдіть з Apple ID, прив'язаним до Developer Program
- Перейдіть до Certificates, Identifiers & Profiles
- Натисніть Identifiers → + (додати новий)
- Оберіть App IDs → Continue
- Заповніть форму:
- Description: My App
- Bundle ID:
com.yourcompany.myapp(має збігатися зapp.json) - Capabilities: оберіть потрібні дозволи (Push Notifications, Sign in with Apple тощо)
- Натисніть Register
5.3. Запуск iOS-збірки з автоматичним підписуванням
EAS Build може автоматично згенерувати всі необхідні сертифікати:
eas build --platform ios --profile preview
Інтерактивний процес:
Що відбувається:
- EAS відкриває браузер для автентифікації з Apple ID
- Після входу генерується Distribution Certificate (приватний ключ для підписування)
- Створюється Provisioning Profile (список пристроїв, на які можна встановити білд)
- Сертифікати зберігаються у хмарі Expo
- Білд запускається на серверах з використанням цих сертифікатів
- Ввести код з SMS або довіреного пристрою
- Згенерувати app-specific password у appleid.apple.com
- Використати цей пароль замість основного при автентифікації
5.4. Типи iOS білдів
iOS має три основні типи дистрибуції:
| Тип | Призначення | Обмеження |
|---|---|---|
| Development | Тестування на власному пристрої | До 100 зареєстрованих UDID на рік |
| Ad Hoc | Внутрішнє тестування командою | До 100 пристроїв, вимагає реєстрації UDID |
| App Store | Публікація в App Store | Без обмежень, проходить App Review |
Для профілю preview рекомендовано:
{
"build": {
"preview": {
"distribution": "internal",
"ios": {
"simulator": false
}
}
}
}
EAS автоматично створить Ad Hoc білд, який можна встановити на зареєстровані пристрої.
5.5. Реєстрація пристроїв для Ad Hoc білдів
Щоб встановити Ad Hoc білд, потрібно зареєструвати UDID пристрою:
eas device:create
Інтерактивний процес:
Після реєстрації пристрою потрібно перезапустити білд:
eas build --platform ios --profile preview
EAS автоматично оновить Provisioning Profile, включивши новий UDID.
Крок 6: Локальна збірка (без хмари)
6.1. Коли потрібна локальна збірка?
EAS Build підтримує локальну компіляцію на вашому власному комп'ютері. Це корисно для:
- Корпоративних політик безпеки: Код не може залишати локальну мережу.
- Економії білдів: Free tier обмежений 30 білдами/місяць, локальні білди безкоштовні.
- Швидкого прототипування: Не потрібно чекати у черзі на хмарних серверах.
- Налагодження складних збірок: Повний доступ до логів Gradle/Xcode.
- Вимагають встановлення Android Studio (для Android) або Xcode (для iOS на macOS).
- iOS білди можливі лише на macOS (обмеження Apple).
- Не можна використати автоматичне управління сертифікатами — потрібні власні keystore/provisioning.
- Споживають ресурси вашого комп'ютера (8+ GB RAM, 20+ GB вільного місця).
6.2. Підготовка до локальної збірки Android
Встановіть необхідні інструменти:
# Встановіть Homebrew (якщо ще немає)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# Встановіть JDK 17 (вимога для React Native 0.73+)
brew install openjdk@17
# Додайте JDK до PATH
echo 'export PATH="/opt/homebrew/opt/openjdk@17/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
# Перевірте версію
java -version
- Завантажте Android Studio з developer.android.com/studio
- Встановіть JDK 17 через Android Studio SDK Manager
- Додайте змінні оточення:
setx ANDROID_HOME "%LOCALAPPDATA%\Android\Sdk"
setx PATH "%PATH%;%LOCALAPPDATA%\Android\Sdk\platform-tools"
# Ubuntu/Debian
sudo apt update
sudo apt install openjdk-17-jdk
# Встановіть Android SDK через sdkmanager
wget https://dl.google.com/android/repository/commandlinetools-linux-latest.zip
unzip commandlinetools-linux-latest.zip -d $HOME/android-sdk
export ANDROID_HOME=$HOME/android-sdk
export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin
Перевірте налаштування:
# Перевірте Java
java -version
# Очікуваний вивід: openjdk version "17.0.x"
# Перевірте Android SDK
echo $ANDROID_HOME
# Очікуваний вивід: /Users/username/Library/Android/sdk (macOS)
6.3. Запуск локального білду Android
eas build --platform android --profile preview --local
Процес збірки:
Результат:
Готовий APK буде збережений локально у папці android/app/build/outputs/apk/release/.
# Увімкніть Gradle Daemon для кешування
echo "org.gradle.daemon=true" >> android/gradle.properties
# Збільште heap memory для Gradle
echo "org.gradle.jvmargs=-Xmx4096m" >> android/gradle.properties
6.4. Локальний білд iOS (лише macOS)
Передумови:
# Встановіть Xcode з App Store (20+ GB)
# Встановіть Command Line Tools
xcode-select --install
# Встановіть CocoaPods
sudo gem install cocoapods
# Перевірте версії
xcodebuild -version
pod --version
Запуск локального білду:
eas build --platform ios --profile preview --local
eas credentials.Крок 7: Змінні оточення та секрети
7.1. Проблема захищених даних у коді
Реальні застосунки містять конфіденційні дані:
- API ключі сторонніх сервісів (Stripe, Firebase, Google Maps)
- Токени автентифікації
- URL-адреси внутрішніх серверів
- Секретні ключі шифрування
Зберігання таких даних безпосередньо у коді неприпустимо з міркувань безпеки:
// ❌ НЕБЕЗПЕЧНО: Ключ доступний у публічному репозиторії
const STRIPE_SECRET_KEY = "sk_live_abc123xyz";
7.2. Змінні оточення через eas.json
Базовий спосіб — визначити змінні у профілі збірки:
{
"build": {
"production": {
"env": {
"API_URL": "https://api.myapp.com",
"ANALYTICS_KEY": "UA-123456-1",
"FEATURE_FLAG_NEW_UI": "true"
}
},
"preview": {
"env": {
"API_URL": "https://staging-api.myapp.com",
"ANALYTICS_KEY": "UA-123456-2",
"FEATURE_FLAG_NEW_UI": "false"
}
}
}
}
Доступ у коді:
// app.config.js
export default {
expo: {
name: "My App",
extra: {
apiUrl: process.env.API_URL,
analyticsKey: process.env.ANALYTICS_KEY,
},
},
};
// App.tsx
import Constants from "expo-constants";
const API_URL = Constants.expoConfig?.extra?.apiUrl;
console.log(API_URL);
// Production: "https://api.myapp.com"
// Preview: "https://staging-api.myapp.com"
eas.json зберігаються у git-репозиторії у відкритому вигляді. Якщо ваш репозиторій публічний, всі секрети будуть скомпрометовані.7.3. Захищені секрети через EAS Secrets
EAS надає окреме захищене сховище для конфіденційних даних:
eas secret:create --scope project --name STRIPE_SECRET_KEY --value sk_live_abc123xyz
Параметри команди:
| Параметр | Значення | Пояснення |
|---|---|---|
--scope | project або account | Прив'язка до конкретного проєкту або всього акаунту |
--name | Назва змінної | Буде доступна як process.env.STRIPE_SECRET_KEY |
--value | Значення | Зберігається у зашифрованому вигляді |
Перегляд збережених секретів:
eas secret:list
Використання секретів у профілях:
{
"build": {
"production": {
"env": {
"API_URL": "https://api.myapp.com",
"STRIPE_KEY": "$STRIPE_SECRET_KEY"
}
}
}
}
$ у eas.json, але у коді доступні через process.env без префіксу:const stripeKey = process.env.STRIPE_KEY; // "sk_live_abc123xyz"
7.4. Файл .env для локальної розробки
Для роботи у режимі expo start використовуйте файл .env:
Встановіть бібліотеку для завантаження .env:
npm install react-native-dotenv
Налаштуйте babel.config.js:
module.exports = function (api) {
api.cache(true);
return {
presets: ["babel-preset-expo"],
plugins: [
[
"module:react-native-dotenv",
{
moduleName: "@env",
path: ".env",
},
],
],
};
};
Використання у коді:
import { API_URL, STRIPE_KEY } from "@env";
console.log(API_URL); // http://localhost:3000 (під час розробки)
.env | EAS Secrets |
|---|---|
| Локальний файл у проєкті | Захищене хмарне сховище |
Працює лише під час expo start | Працює під час EAS білдів |
| Може бути випадково закоммічений у git | Недоступний у репозиторії |
| Підходить для розробки | Підходить для production |
Рекомендована стратегія:
- Використовуйте
.envдля локальної розробки з тестовими ключами. - Використовуйте EAS Secrets для production ключів у білдах.
- Ніколи не коммітьте
.envфайли з реальними секретами у git.
7.5. Умовна логіка на основі середовища
Часто потрібно виконувати різний код залежно від профілю збірки:
// config.ts
import Constants from "expo-constants";
const ENV = {
development: {
apiUrl: "http://localhost:3000",
enableLogging: true,
crashReportingEnabled: false,
},
preview: {
apiUrl: "https://staging-api.myapp.com",
enableLogging: true,
crashReportingEnabled: true,
},
production: {
apiUrl: "https://api.myapp.com",
enableLogging: false,
crashReportingEnabled: true,
},
};
// Визначення поточного середовища
function getEnvVars() {
if (__DEV__) {
return ENV.development;
} else if (Constants.expoConfig?.extra?.profile === "preview") {
return ENV.preview;
}
return ENV.production;
}
export default getEnvVars();
Налаштування app.config.js для передачі профілю:
export default {
expo: {
name: "My App",
extra: {
profile: process.env.EAS_BUILD_PROFILE || "development",
},
},
};
Використання у застосунку:
import config from "./config";
import * as Sentry from "@sentry/react-native";
if (config.crashReportingEnabled) {
Sentry.init({
dsn: "https://your-sentry-dsn",
environment: config.apiUrl.includes("staging") ? "staging" : "production",
});
}
console.log(`Connecting to: ${config.apiUrl}`);
Крок 8: Автоматизація через GitHub Actions
8.1. Навіщо потрібен CI/CD для мобільних білдів?
Автоматизація збірок через Continuous Integration/Continuous Deployment дає:
- Автоматичні білди при кожному commit у певну гілку (наприклад,
main,develop). - Паралельні білди iOS + Android за одну команду.
- Сповіщення команди у Slack/Discord/Telegram при успішному білді або помилці.
- Автоматичне тестування перед білдом (unit tests, E2E tests).
- Збереження артефактів для швидкого доступу до APK/IPA файлів.
8.2. Створення GitHub Action для EAS Build
Створіть файл .github/workflows/eas-build.yml у вашому репозиторії:
8.3. Налаштування EXPO_TOKEN секрету
Для автентифікації GitHub Actions у EAS потрібен токен доступу:
Крок 1: Згенеруйте токен:
eas whoami
Переконайтеся, що ви авторизовані, потім:
# Відкрийте веб-панель Expo
open https://expo.dev/accounts/[your-username]/settings/access-tokens
У веб-інтерфейсі:
- Натисніть "Create Token"
- Назва:
GitHub Actions CI - Scope: Read and Write
- Скопіюйте згенерований токен (починається з
eas_...)
Крок 2: Додайте секрет у GitHub:
- Відкрийте ваш репозиторій на GitHub
- Перейдіть до Settings → Secrets and variables → Actions
- Натисніть "New repository secret"
- Name:
EXPO_TOKEN - Value: вставте токен
- Натисніть "Add secret"
8.4. Розширена конфігурація з тестуванням
Додайте автоматичні тести перед білдом:
name: EAS Build with Tests
on:
push:
branches: [main, develop]
jobs:
test:
name: Run Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20.x
cache: npm
- name: Install dependencies
run: npm ci
- name: Run TypeScript check
run: npm run tsc --noEmit
- name: Run ESLint
run: npm run lint
- name: Run unit tests
run: npm test -- --coverage
- name: Upload coverage
uses: codecov/codecov-action@v3
with:
files: ./coverage/coverage-final.json
build-android:
name: Build Android
needs: test
runs-on: ubuntu-latest
if: github.event_name == 'push'
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20.x
cache: npm
- name: Setup Expo
uses: expo/expo-github-action@v8
with:
eas-version: latest
token: ${{ secrets.EXPO_TOKEN }}
- run: npm ci
- name: Build Android APK
run: |
eas build --platform android \
--profile preview \
--non-interactive \
--no-wait
build-ios:
name: Build iOS
needs: test
runs-on: ubuntu-latest
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20.x
- name: Setup Expo
uses: expo/expo-github-action@v8
with:
eas-version: latest
token: ${{ secrets.EXPO_TOKEN }}
- run: npm ci
- name: Build iOS IPA
run: |
eas build --platform ios \
--profile production \
--non-interactive \
--no-wait
Логіка workflow:
- test job: Виконується завжди при push або PR
- TypeScript перевірка
- ESLint для якості коду
- Unit тести з покриттям
- build-android job: Виконується лише після успішних тестів
- Запускається для
mainтаdevelopгілок
- Запускається для
- build-ios job: Виконується лише для
mainгілки- Production білд для App Store
node_modules та ~/.npm:- name: Cache node modules
uses: actions/cache@v3
with:
path: |
node_modules
~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
8.5. Сповіщення у Slack при завершенні білду
Додайте нотифікацію команди:
- name: Notify Slack on success
if: success()
uses: slackapi/slack-github-action@v1
with:
webhook-url: ${{ secrets.SLACK_WEBHOOK_URL }}
payload: |
{
"text": "✅ EAS Build successful for ${{ github.ref }}",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*Build completed*\n• Platform: Android\n• Profile: preview\n• Branch: `${{ github.ref_name }}`\n• Commit: ${{ github.event.head_commit.message }}"
}
},
{
"type": "actions",
"elements": [
{
"type": "button",
"text": {
"type": "plain_text",
"text": "View Build"
},
"url": "https://expo.dev/accounts/your-username/projects/my-app/builds"
}
]
}
]
}
- name: Notify Slack on failure
if: failure()
uses: slackapi/slack-github-action@v1
with:
webhook-url: ${{ secrets.SLACK_WEBHOOK_URL }}
payload: |
{
"text": "❌ EAS Build failed for ${{ github.ref }}",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*Build failed*\n• Platform: Android\n• Branch: `${{ github.ref_name }}`\n• <${{ github.event.head_commit.url }}|View commit>"
}
}
]
}
Налаштування Slack Webhook:
- Відкрийте api.slack.com/apps
- Create New App → From scratch
- Incoming Webhooks → Activate
- Add New Webhook to Workspace → оберіть канал (наприклад,
#builds) - Скопіюйте Webhook URL
- Додайте секрет
SLACK_WEBHOOK_URLу GitHub Repository Settings
Підсумки: Чек-лист продакшн-білду
✅ Підготовка проєкту
- Зареєстрований обліковий запис Expo
- Виконано
eas initу проєкті - Створено
eas.jsonз профілямиdevelopment,preview,production - Налаштовано унікальні
bundleIdentifierтаpackageуapp.json - Налаштовано версіонування (
version,buildNumber,versionCode)
🔐 Безпека та підписування
- Android keystore згенерований або завантажений
- iOS сертифікати налаштовані через Apple Developer
- Секретні змінні (
API_KEY, токени) перенесені в EAS Secrets - Файл
.envдоданий до.gitignore - Перевірено, що жодні секрети не закоммічені у git
📱 Тестування білдів
- Preview білд протестований на реальному пристрої
- Перевірено всі критичні флоу (логін, оплата, навігація)
- Тестування на різних версіях Android (8.0+) та iOS (13.0+)
- Перевірено дозволи (камера, локація, сховище)
- Тестування у режимі offline (якщо підтримується)
🚀 Автоматизація
- Налаштовано GitHub Actions або GitLab CI
- Автоматичні білди при push у
main/develop - Сповіщення команди у Slack/Discord
- Збереження артефактів білдів
- Автоматичне тестування перед білдом
Типові помилки та їх вирішення
Причина: Не встановлено JDK або неправильно налаштована змінна оточення.
Рішення:
# macOS
brew install openjdk@17
echo 'export JAVA_HOME=$(/usr/libexec/java_home -v17)' >> ~/.zshrc
source ~/.zshrc
# Перевірка
echo $JAVA_HOME
java -version
Причина: Невірний пароль keystore або keystore пошкоджений.
Рішення:
# Видаліть старий keystore
eas credentials
# Оберіть: Android → Production → Keystore → Remove
# Згенеруйте новий при наступному білді
eas build --platform android --profile production
::
Причина: Відсутній або недійсний iOS Distribution Certificate.
Рішення:
# Перегенеруйте сертифікати
eas credentials
# Оберіть: iOS → Production → Distribution Certificate → Create new
# Слідуйте інструкціям для автентифікації з Apple ID
Причина: Білд завис через мережеві проблеми або занадто великі залежності.
Рішення:
- Перевірте розмір
node_modules:du -sh node_modules - Видаліть невикористані залежності:
npm prune - Очистіть кеш:
eas build:cancel→eas build --clear-cache - Розгляньте локальний білд:
eas build --local
::
Наступні кроки: публікація у стори
Після успішної збірки та тестування білду ви готові до публікації:
Крок 1: Підготовка маркетингових матеріалів
- Іконка застосунку (1024×1024 px)
- Скріншоти екранів (різні розміри для iOS/Android)
- Опис застосунку (короткий та повний)
- Privacy Policy URL
- Контактна інформація розробника
Крок 2: Production білд
eas build --platform all --profile production
Крок 3: Підписання угод (лише iOS)
- Paid Applications Agreement
- Export Compliance (якщо використовується шифрування)
Крок 4: Публікація через EAS Submit
eas submit --platform android --profile production
eas submit --platform ios --profile production
Крок 5: App Review
- Android: зазвичай 1–3 дні
- iOS: зазвичай 1–3 дні (іноді до тижня)
Додаткові ресурси
Інтернаціоналізація та доступність
Повний гід з i18n через react-i18next (namespaces, plurals, interpolation, RTL) та доступності в React Native (Screen Reader, accessibilityLabel, Role, динамічні розміри шрифту, Color Contrast, керування фокусом, Testing з Accessibility Inspector)
Публікація в App Store та Google Play
Повний покроковий гід з публікації React Native застосунків у App Store та Google Play Store — від створення облікових записів розробника до проходження модерації та отримання першого завантаження