Настройка Appcenter для CI/CD мобильного приложения
Microsoft AppCenter — это не только дистрибуция тестовых билдов. Полноценный CI/CD для мобильных приложений: сборка по триггеру из Git, тестирование на реальных устройствах через Device Farm, публикация в TestFlight и Google Play, crash analytics. Всё в одном сервисе, без настройки инфраструктуры.
Структура проекта в AppCenter
Для каждого приложения (iOS и Android) создаётся отдельная «app» в AppCenter. Организация называется «org» — под ней группируются все apps. Типичная структура:
MyCompany (Organization)
├── MyApp-iOS (App)
│ ├── Build (CI)
│ ├── Test (Device Farm)
│ ├── Distribute
│ └── Diagnostics (Crashes)
└── MyApp-Android (App)
├── Build (CI)
├── Distribute
└── Diagnostics
Настройка Build через YAML
AppCenter поддерживает appcenter-post-clone.sh, appcenter-pre-build.sh, appcenter-post-build.sh — скрипты, которые запускаются на соответствующих этапах. Более гибкий подход — appcenter.yml (Preview):
trigger:
branches:
include:
- main
- release/*
pool:
vmImage: macos-latest
steps:
- task: InstallAppleCertificate@2
inputs:
certSecureFile: distribution.p12
certPwd: $(P12_PASSWORD)
- task: InstallAppleProvisioningProfile@1
inputs:
provisioningProfileLocation: secureFiles
provProfileSecureFile: MyApp_AppStore.mobileprovision
- script: |
cd ios && pod install --repo-update
displayName: 'Install CocoaPods'
- task: Xcode@5
inputs:
actions: 'build'
scheme: 'MyApp'
xcWorkspacePath: 'ios/MyApp.xcworkspace'
exportPath: '$(Build.ArtifactStagingDirectory)'
exportOptions: 'plist'
exportOptionsPlist: 'ios/ExportOptions.plist'
signingOption: 'manual'
signingIdentity: '$(APPLE_CERTIFICATE_SIGNING_IDENTITY)'
provisioningProfileUuid: '$(APPLE_PROV_PROFILE_UUID)'
Post-build скрипты
Если YAML-конфигурация недоступна, appcenter-post-build.sh вызывается после успешной сборки:
#!/usr/bin/env bash
# Отправка в App Distribution
appcenter distribute release \
--app "$APPCENTER_APP_ID" \
--file "$APPCENTER_OUTPUT_DIRECTORY/MyApp.ipa" \
--group "QA Team" \
--release-notes "Build $APPCENTER_BUILD_ID"
# Уведомление в Slack
curl -X POST "$SLACK_WEBHOOK_URL" \
-H 'Content-type: application/json' \
--data "{\"text\":\"New build $APPCENTER_BUILD_ID is available\"}"
APPCENTER_OUTPUT_DIRECTORY, APPCENTER_BUILD_ID — встроенные переменные окружения AppCenter.
Переменные окружения и секреты
В Build Configuration → Environment Variables добавляются переменные. Sensitive значения помечаются как «Secret» — они шифруются и не показываются в логах. Стандартный набор:
-
P12_PASSWORD— пароль к сертификату -
KEYSTORE_PASSWORD— Android keystore -
FIREBASE_APP_ID— для Crashlytics/App Distribution -
SLACK_WEBHOOK_URL— уведомления
Тестирование на реальных устройствах
AppCenter Device Farm позволяет запускать UI-тесты (XCUITest, Espresso) на реальных устройствах:
# Upload и запуск XCUITest
appcenter test run xcuitest \
--app "MyOrg/MyApp-iOS" \
--devices "MyOrg/top-ios-devices" \
--test-series "main" \
--locale "ru_RU" \
--build-dir DerivedData/Build/Products/Debug-iphoneos
Device sets создаются в AppCenter UI — можно выбрать конкретные модели и версии iOS/Android.
Ограничения AppCenter CI
AppCenter Build не поддерживает сложные матричные сборки, кастомные Docker-образы для Android, кэширование Gradle на уровне организации. Для продвинутых сценариев AppCenter CI комбинируют с внешним CI (GitHub Actions для основной сборки, AppCenter — только для дистрибуции и тестирования).
Процесс
Создание apps в AppCenter → подключение репозитория → настройка Build Configuration → добавление signing (для iOS) → написание post-build скриптов → настройка Distribution → тест-запуск → документация.
Срок: 2–3 дня. Стоимость рассчитывается индивидуально.







