Допустим, вы являетесь разработчиком на каком-нибудь небольшом проекте. Есть только ограниченный доступ в App Store Connect и Google Play. Это такие ограничения, как подписание сборок, публикация в маркеты.
Их, конечно, можно обойти, если почитать документацию и сделать необходимые сертификаты и профайлы (в случае с iOS) или используя оригинальный jks файл и пароли к нему (в случае с Android). Для этого, как правило, нужно пнуть владельца этих аккаунтов.
Данная статья будет вам полезна, если вы увидите себя хотя бы в одном из перечисленных случаев:
Процесс сборки под iOS или Android занимает слишком много времени и ресурсов вашего компьютера
На проекте есть другой разработчик, который активно занят проектом и день через день вносит какие-то изменения, но только вы можете сделать сборку
Ваш проджект менеджер попросил отправить очередную сборку тестировщикам, но вы не имеете доступ к своему компьютеру
Это будет подробный туториал с множеством скриншотов.
Минимальные требования, общие для iOS и Android
Ключ подписи релизной сборки - нужен для того, чтобы в целом иметь возможность собрать валидную сборку, которую дальше можно отправить в сторы:
iOS: сертификат с расширением .p12 (Distribution или iOS Distribution) и пароль к нему; профайл с расширением .mobileprovision (App Store Connect Distribution)
Android: ключ подписи обычно с расширением .jks и пароли к нему
Доступ к API сторов - нужен для того, чтобы в целом организовать процесс отправки в сторы через сторонние сервисы типа Codemagic, GitHub Actions, Fastlane и другие:
App Store Connect API: IssuerID и App Store Connect API Key с расширением .p8
Google Play Android Developer API: json файл сервис аккаунта из проекта в Google Cloud Console
Регистрация в Codemagic
Начальные необходимые условия:
Есть аккаунт в GitHub, GitLab или BitBucket
Есть доступ к репозиторию проекта
Первое, нужно создать аккаунт в Codemagic, если его еще нет:
Это интуитивно понятные шаги, где нужно нажимать на самые яркие кнопки





В конце должен быть примерно такой вид:

Теперь приступим к настройке под платформы.
Настройка Codemagic для Android. Релизная сборка с подписью
Это, на мой взгляд, самое простое.
Для этого потребуются:
jks файл для подписи релизной сборки
Password и Key Alias
Настройка проекта
У меня на проектах папка android обычно выглядит примерно так:

android/app/build.gradle - здесь нужно добавить следующее условие:

Для упрощения копипаста
if (System.getenv()["CI"]) { // CI=true is exported by Codemagic
storeFile file(System.getenv()["CM_KEYSTORE_PATH"])
storePassword System.getenv()["CM_KEYSTORE_PASSWORD"]
keyAlias System.getenv()["CM_KEY_ALIAS"]
keyPassword System.getenv()["CM_KEY_PASSWORD"]
} else {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
storePassword keystoreProperties['storePassword']
}
andoid/key.properties - здесь обычно хранятся все секреты, они, как правило, нужны для доступа к ключу подписи релизной сборки. Эти данные нужны при настройке Codemagic

На всякий случай напомню, что этот файл не следует хранить в открытом доступе тем более, если проект публичный!
Настройка Codemagic
Раскрываем секцию Build

Указываем, что сборка релизная

Раскрываем секцию Distribution

Загружаем файл .jks и заполняем данными из key.properties

После заполнения примерно должно выглядеть так:

В целом, этого достаточно, чтобы уже собирать сборки не у себя на компьютере. После нажатия на Start new build останется только выбрать ветку, с которой нужно собрать сборку.
После успешного окончания будет такой примерно вид:

Можно вручную скачать артефакты и отправить их по месту назначения.
Настройка Codemagic для Android. Автоматическая публикация в Google Play
На этом этапе, как я уже говорил, требуется настройка доступа к Google Play Android Developer API
Сначала нужно открыть существующий проект в Google Cloud Console либо создать новый. Можно, например, использовать проект Firebase

Включить Google Play Android Developer API, это можно сделать по ссылке

Создать сервис аккаунт (ссылка), дать ему пермишн Service Account User и сохранить на будущее email.
В этом примере это codemagic@tsitser-game.iam.gserviceaccount.com
У вас может быть, например, blabla@your-project.iam.gserviceaccount.com


Создать и сохранить файл Private Key JSON от этого сервис аккаунта



Загрузить Private Key JSON в Codemagic

Внимание! Для следующих шагов необходимы прав администратора в Google Play Console
Зайти в Google Play Console в секцию App integrity и связать с Cloud Project

При наличии разрешений будет следующий вид

Далее зайти в секцию Users and Permissions, добавить сохраненный email сервис аккаунта из Cloud Console
В нашем примере это codemagic@tsitser-game.iam.gserviceaccount.com
Разрешения можно оставить те, которые выбраны по умолчанию (я на всякий случай даю админские права, но это не обязательно)


Если все настроено верно, то после запуска сборки будет такой примерно результат:

А в Google Play будет сразу так:

Заключение
Сегодня детально рассмотрели, как очень просто организовать CI/CD для сборки и публикации flutter приложения в Google Play с помощью сервиса Codemagic
Кратко, что требуется разработчику для настройки под Android:
Доступ к репозиторию проекта
Ключ подписи релизной сборки и пароли к нему
Админские права в Google Play
Что требуется сделать владельцу аккаунта в Google Play:
Дать админские права разработчику
В следующей статье будет про настройку CI/CD для iOS и публикацию в App Store Connect (TestFlight), а также коротко расскажу про ограничения этого сервиса и другие важные моменты.