Вводная часть

Этот пост для тех, кто также как и я ничего не понимает в настройке ci/cd, но хочет подключить Azure к App Center.

Небольшое отступление

  1. В компании, где я работаю, есть мобильное приложение, написанное на React Native и весь деплой работает напрямую в App Center, но так как App Center не поддерживает Flutter, то остается вариант деплоить android и ios приложения по отдельности.

  2. Все процессы в компании завязаны на azure и было необходимо для сборки приложений и деплоя использовать именно его.

Настройка окружения

Первым делом займемся настройкой наших приложений.

Android

Никаких дополнительных настроек не требуется

IOS

В папке ios вашего проекта необходимо создать файл exportOptions.plist. Здесь мы зададим настройки для экспорта нашего приложения, а главное установим профили.
Вот как должен выглядеть файл

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">  
<plist version="1.0">  
<dict>  
    <key>destination</key>  
    <string>export</string>  
    <key>manageAppVersionAndBuildNumber</key>  
    <true/>  
    <key>method</key>  
    <string>app-store</string>  
    <key>provisioningProfiles</key>  
    <dict>  
        <key>*ru.someName</key>  
        <string>*name provisioning profile*</string>  
        <key>*ru.someNameForNotifications*</key>  
        <string>*name provisioning profile for notifications</string>  
    </dict>  
    <key>signingCertificate</key>  
    <string>Apple Distribution</string>  
    <key>signingStyle</key>  
    <string>manual</string>
    <key>stripSwiftSymbols</key>  
    <true/>  
    <key>teamID</key>  
    <string>*Ваш id*</string>  
    <key>uploadBitcode</key>  
    <false/>  
    <key>uploadSymbols</key>  
    <false/>  
</dict>  
</plist>

Обратите внимание на provisioningProfiles и teamID

  • provisioningProfiles — это профили, которые вам надо создать на сайте apple. Далее необходимо в key указать Bundle Identifier, а в string имя в строке provisioning profile.

  • teamID — это id сертификата, его можно увидеть, либо на сайте apple, либо в xcode на вкладке Signing & Capabilities

    Profiles

    На данном этапе нам необходимо установить профили в xcode.

  • Для этого вам необходимо открыть xcode перейти в targets/Signing & Capabilities* (предполагается, что профили и сертификат у вас уже есть)

  • Убрать галочку с автоматической подписи и установить ее вручную. Без этого действия этап установки сертификата в пайплайне просто не мог обнаружить нужный сертификат. А так нужный сертификат автоматически подтягивается при выборе нужного профиля.

  • Проделайте данную операцию для всех таргетов*( У каждого таргета должен быть свой профайл).

Pipeline

На данном этапе мы создадим пайплайн для сборки наших приложений.

  • Создаем новый pipeline

  • Нажимаем на последнюю ссылку

  • Выбираем Azure Repose Git

  • Скачиваем плагин Flutter — Visual Studio Marketplace

Android

Так в конечном счете будет выглядеть стек задач для android.


А теперь чуть подробнее про каждую задачу.

Добавляем задачи в pipeline —

  • Flutter install

    • оставляем дефолтные настройки

  • Flutter Build apk

    • Это все стандартные настройки, но все же продублирую

      • Target platform — Android (apk)

      • Path to the project folder — .(ставим точку)

      • Build Flavour — prod

        • Опционально. У меня в проекте используются flavor, так уже если его у вас нет, то можете пропустить этот шаг.

  • Signing and aligning APK file(s) **/*.apk — Подписка сертификата

    • APK files — **/*.apk

    • Sign the APK — true

    • Keystore file — Здесь вам нужно загрузить ваш сертификат. Дальше идут пункты, касательно этого файла.

      • Keystore password, Alias, Key password — указываете в соответсвии с сертификатом

    • apksigner arguments — --verbose

  • Tag Build

    • Type — Build

    • Tags — android

  • Copy Publish Artifact: artifact

    • Contents — **/*.apk

    • Artifact Name — APK

    • Artifact Type — Server

IOS

В том же пайплайне добавляем еще один блок задач(Agent job). Так он будет выглядеть когда мы закончим.

  • Flutter Install — аналогично с android

  • Install an Apple provisioning profile — для каждого профиля вам необходимо добавить по одной задаче.

    • Provisioning profile location — Secure Files

    • Provisioning profile — Указываете сам профайл(его нужно загрузить по клику на шестеренку)

  • Install an Apple certificate

    • Certificate (P12) — по клику на шестеренку загружаете ваш сертификат

    • Certificate (P12) password — очевидно, что здесь вам надо вписать пароль от сертификата

    • Keychain — должен быть выбран Temporary Keychain

  • Flutter Build ipa

    • Target platform — iOS (IPA)

    • Path to the project folder — $(Build.SourcesDirectory)

    • Build Flavour — по аналогии с андроидом добавляем только при необходимости

    • Export Options Plist path — $(Build.SourcesDirectory)/ios/exportOptions.plist

    • Extra command arguments — --release

  • Tag Build

    • Type — Build

    • Tags — ios

  • Copy Publish Artifact

    • Copy Root — $(Agent.BuildDirectory)

    • Contents — **/ipa/*.ipa

    • Artifact Name — IPA

    • Artifact Type — Server

На данном этапе у нас должна проходить сборка без ошибок. Если перейти в детали сборки, то там мы должны наблюдать следующую картину

Вы должны увидеть две публикации, это значит, что оба приложения сохранены и готовы к запуску в релиз.

В конечном счете пайплайн выглядит следующим образом

Релиз в App Center

  • Для начала нам необходимо создать приложения в App Center отдельно для android и ios.

  • Далее в настройках приложения нужно создать новый токен(он пригодится нам позже).

На данном этапе с App Center мы закончили, переходим в пайплайн.
Пайплайн для релиза будет выглядеть так

Android

  • Переходим на вкладку releases и создаем новый пайплайн

  • Первым делом нам предлагают выбрать шаблон для этапа. Спускаемся в самый низ и выбираем Empty job. На следующем шаге сразу обзовем его Published App Center Android(можете называть как хотите)

  • После создания пайплайна кликаем на поле Artifact и вставляем в поле Source alias название нашего артефакта. Я его так и назвал — artifact.

  • Далее переходим на вкладку Tasks

  • Добавляем таску под названием App Center distribute и прописываем ей следующие настройки

    • App Center service connection — здесь вам потребуется создать новое соединение. Нажимаете на кнопку '+New'. Как раз здесь пригодится токен, который вы генерировали для каждого приложения

    • App slug — на пометке справа от заголовка указана вся нужная информация

    • Binary file path — выбираете из артефактов нашу apk.

    • Symbols type — Android

Все что нам осталось, это добавить тригер для этапа. Кликаем по этой кнопке

и устанавливаем следующий тригер, указав нужную нам ветку и тег, который мы прописывали на этапе сборки apk

IOS

Аналогично с android

  • Создаем новый этап, где также устанавливаем в качестве тригера нужную ветку и в тегах прописываем ios.

  • В тасках все тоже самое, но подставляем уже значения для ios. Т.к. в App Center у нас два разных приложения, то и в App slug будут различные данные. Тоже касается Binary file path и Symbols type.

Все что нам осталось сделать, это указать тригер для артефакта.

На данном этапе у нас проходит полная сборка приложений и деплой в App Center. При успешном деплое в App Center в вашем приложении на вкладке Distribute/Releases вы увидите ваше приложение.

Останется только в самом App Center подключиться к сторам и отправить приложение на публикацию.

Надеюсь этот пост будет вам полезен и позволит сэкономить пару(десятков) человеко-часов.

Если вдруг что-то упустил или написал непонятно пишите в комментариях, обязательно отвечу.

Комментарии (0)