Вводная часть
Этот пост для тех, кто также как и я ничего не понимает в настройке ci/cd, но хочет подключить Azure к App Center.
Небольшое отступление
В компании, где я работаю, есть мобильное приложение, написанное на React Native и весь деплой работает напрямую в App Center, но так как App Center не поддерживает Flutter, то остается вариант деплоить android и ios приложения по отдельности.
Все процессы в компании завязаны на 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 подключиться к сторам и отправить приложение на публикацию.
Надеюсь этот пост будет вам полезен и позволит сэкономить пару(десятков) человеко-часов.
Если вдруг что-то упустил или написал непонятно пишите в комментариях, обязательно отвечу.