Как интегрировать 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-пайплайна

  1. Pull / Push в репозиторий (GitHub, GitLab, Azure DevOps и др.)

  2. **CI:
    **

    • Проверка зависимостей, установка SDK

    • Сборка общего проекта и платформенных проектов

    • Запуск unit-тестов и UI-тестов (если есть)

  3. **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.