Как интегрировать CI/CD для Xamarin-приложений?
Интеграция CI/CD (Continuous Integration и Continuous Deployment) в Xamarin-проекты позволяет автоматизировать сборку, тестирование и публикацию приложений для Android и iOS. Это особенно важно в командах с несколькими разработчиками или при частом выпуске обновлений. Внедрение CI/CD уменьшает вероятность ошибок, ускоряет доставку новых функций пользователям и обеспечивает стабильность качества продукта.
Особенности CI/CD для Xamarin
Xamarin-приложение — это кросс-платформенное решение, состоящее как минимум из:
-
.NET Standard библиотеки (общая логика)
-
Xamarin.Android проект
-
Xamarin.iOS проект
Для сборки Android достаточно среды с Windows или Linux. Для сборки iOS обязательно требуется macOS с установленным Xcode.
Основные этапы CI/CD-пайплайна
-
Pull / Push в репозиторий (GitHub, GitLab, Azure DevOps и др.)
-
**CI:
**-
Проверка зависимостей, установка SDK
-
Сборка общего проекта и платформенных проектов
-
Запуск unit-тестов и UI-тестов (если есть)
-
-
**CD:
**-
Сборка .apk и .ipa файлов
-
Подписание
-
Загрузка в App Store / Google Play, TestFlight, App Center, Firebase, etc.
-
Выбор CI/CD-платформы
Поддерживают Xamarin «из коробки»:
-
Azure DevOps (официальная поддержка Xamarin)
-
GitHub Actions (через macos-latest и windows-latest раннеры)
-
App Center (Microsoft) — ранее популярный, сейчас устаревающий
-
**Bitrise
** - Jenkins (при наличии собственного macOS-агента)
Настройка CI для Xamarin на GitHub Actions
Пример .github/workflows/ci.yml для Android:
name: Build Android
on:
push:
branches: \[main\]
jobs:
build:
runs-on: windows-latest
steps:
\- name: Checkout
uses: actions/checkout@v3
\- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '7.0.x'
\- name: Restore NuGet packages
run: dotnet restore
\- name: Build Xamarin Android
run: msbuild MyApp.Android/MyApp.Android.csproj /p:Configuration=Release
Для iOS требуется использовать runs-on: macos-latest.
CI-пайплайн с Azure DevOps
Azure DevOps полностью поддерживает сборку Xamarin через YAML-пайплайн или Classic UI.
Пример YAML для Android:
trigger:
\- main
pool:
vmImage: 'windows-latest'
steps:
\- task: UseDotNet@2
inputs:
packageType: sdk
version: '6.x.x'
\- task: NuGetToolInstaller@1
\- task: NuGetCommand@2
inputs:
restoreSolution: '\*\*/\*.sln'
\- task: VSBuild@1
inputs:
solution: '\*\*/MyApp.sln'
msbuildArgs: '/p:Configuration=Release'
Для iOS сборки используется vmImage: 'macos-latest'.
Подписание сборок
Android
-
Используется .keystore файл.
-
В csproj или signing.properties указываются параметры:
<AndroidKeyStore>True</AndroidKeyStore>
<AndroidSigningKeyStore>my-release-key.keystore</AndroidSigningKeyStore>
<AndroidSigningStorePass>mypassword</AndroidSigningStorePass>
<AndroidSigningKeyAlias>myalias</AndroidSigningKeyAlias>
<AndroidSigningKeyPass>mypassword</AndroidSigningKeyPass>
- В CI желательно использовать секреты для хранения паролей и ключей.
iOS
-
Требуется:
-
Apple developer account
-
Provisioning profile (manual или automatic)
-
Signing certificate (.p12)
-
-
Используется fastlane, xcodebuild или msbuild с параметрами:
msbuild MyApp.iOS.csproj /p:Platform=iPhone /p:Configuration=Release /p:BuildIpa=true
- В CI-системе (например, GitHub Actions или Azure) нужно настроить Keychain access, добавить сертификат и профиль.
UI тестирование
Для UI-тестов можно использовать:
-
Xamarin.UITest — с NUnit и App Center
-
Appium — кросс-платформенные UI-тесты
-
Detox / Espresso / XCUITest (при интеграции с нативным кодом)
CI может запускать UI-тесты в Headless-режиме или в облачных симуляторах через App Center.
Deployment (CD)
Варианты дистрибуции:
-
Google Play (через Google Play Developer API)
-
Apple App Store / TestFlight (через App Store Connect API)
-
Microsoft App Center (для внутреннего тестирования)
-
**Firebase App Distribution
** - **Email, FTP, Azure Blob Storage и др.
**
Инструменты:
-
fastlane — наиболее гибкий инструмент для загрузки в App Store и Google Play.
-
Azure DevOps Tasks:
-
GooglePlayRelease@4
-
AppStoreRelease@1
-
-
GitHub Actions:
-
maierj/fastlane-action
-
appleboy/scp-action для отправки .apk на сервер
-
Secrets и безопасность
-
Всегда используйте Secrets/Variables в CI/CD:
-
KEYSTORE_PASSWORD
-
SIGNING_KEY_ALIAS
-
APPLE_API_KEY
-
-
В GitHub Actions: Settings → Secrets
-
В Azure DevOps: Library → Secure Files, Variables (secret)
Никогда не храните ключи и пароли в .csproj или .yml напрямую.
Распараллеливание и оптимизация
-
Разделение пайплайнов на: Restore → Build → Test → Sign → Deploy
-
Кэширование NuGet: actions/cache@v3 или NuGetToolInstaller@1
-
Сборка Android и iOS параллельно в отдельных джобах
Облачные сборочные агенты
-
**macOS
**-
GitHub: macos-latest (входит в бесплатный лимит)
-
Azure DevOps: macOS-hosted agents
-
Bitrise: автоматизированные окружения с macOS + Xcode
-
Self-hosted: Mac Mini с Xcode и SSH, подключаемый к CI
-
-
**Windows
**-
Подходит для Android-сборок
-
Можно использовать локально или в Azure Pipelines
-
Поддержка MAUI и будущее
Для проектов на .NET MAUI используется тот же CI/CD-подход, но с dotnet workload install maui и таргетингом на .NET 6/7. Пайплайны упрощаются за счёт унификации платформ.
Грамотно выстроенный CI/CD-процесс позволяет обеспечить стабильную и быструю доставку Xamarin-приложений, облегчает тестирование и снижает количество ошибок при публикации. Он становится неотъемлемой частью современного мобильного DevOps.