Допустим, вы являетесь разработчиком на каком-нибудь небольшом проекте. Есть только ограниченный доступ в 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.io Codemagic.io](https://habrastorage.org/getpro/habr/upload_files/903/a6e/d1c/903a6ed1c9de0e6e47d3e6105c79b727.png)
![Codemagic.io Codemagic.io](https://habrastorage.org/getpro/habr/upload_files/21a/6b5/c81/21a6b5c815fe804995df437cab4d3f66.png)
![Codemagic.io Codemagic.io](https://habrastorage.org/getpro/habr/upload_files/533/49e/91d/53349e91dfc73874dac2600eda5e8766.png)
![Codemagic.io Codemagic.io](https://habrastorage.org/getpro/habr/upload_files/01d/e84/0f1/01de840f115ecedf34a26254db3cb87f.png)
![Codemagic.io Codemagic.io](https://habrastorage.org/getpro/habr/upload_files/b7f/32d/9c0/b7f32d9c0b4afe8553e3cbb488a775cb.png)
В конце должен быть примерно такой вид:
![Codemagic.io Codemagic.io](https://habrastorage.org/getpro/habr/upload_files/cb7/2c7/f94/cb72c7f94cbf79df3565466c680bfc0b.png)
Теперь приступим к настройке под платформы.
Настройка Codemagic для Android. Релизная сборка с подписью
Это, на мой взгляд, самое простое.
Для этого потребуются:
jks файл для подписи релизной сборки
Password и Key Alias
Настройка проекта
У меня на проектах папка android обычно выглядит примерно так:
![VSCode VSCode](https://habrastorage.org/getpro/habr/upload_files/231/cf0/48c/231cf048cb373ccb0b8b7a334a825319.png)
android/app/build.gradle - здесь нужно добавить следующее условие:
![VSCode VSCode](https://habrastorage.org/getpro/habr/upload_files/df1/22d/bc9/df122dbc944caf1ba9871ed9326529a4.png)
Для упрощения копипаста
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
![VSCode VSCode](https://habrastorage.org/getpro/habr/upload_files/f43/620/23b/f4362023b32dc79b5cc6266c602e5e9a.png)
На всякий случай напомню, что этот файл не следует хранить в открытом доступе тем более, если проект публичный!
Настройка Codemagic
Раскрываем секцию Build
![Codemagic.io Codemagic.io](https://habrastorage.org/getpro/habr/upload_files/693/eb4/8bf/693eb48bf303d16f0dd55803ae2dd044.png)
Указываем, что сборка релизная
![Codemagic.io Codemagic.io](https://habrastorage.org/getpro/habr/upload_files/730/344/a5e/730344a5e46e9878db79f3d5c47aa1c7.png)
Раскрываем секцию Distribution
![Codemagic.io Codemagic.io](https://habrastorage.org/getpro/habr/upload_files/94c/b29/c6f/94cb29c6fbe17f4e11c7fa7d8baaf3c6.png)
Загружаем файл .jks и заполняем данными из key.properties
![Codemagic.io Codemagic.io](https://habrastorage.org/getpro/habr/upload_files/545/c2d/2e0/545c2d2e08de96bfcfefffdad26a6129.png)
После заполнения примерно должно выглядеть так:
![Codemagic.io Codemagic.io](https://habrastorage.org/getpro/habr/upload_files/490/d67/5bc/490d675bc3d4ff07e9d951f9e020bb2e.png)
В целом, этого достаточно, чтобы уже собирать сборки не у себя на компьютере. После нажатия на Start new build останется только выбрать ветку, с которой нужно собрать сборку.
После успешного окончания будет такой примерно вид:
![Codemagic.io Codemagic.io](https://habrastorage.org/getpro/habr/upload_files/23a/fb2/257/23afb22575b0878ffe68f1fc3b3c07b3.png)
Можно вручную скачать артефакты и отправить их по месту назначения.
Настройка Codemagic для Android. Автоматическая публикация в Google Play
На этом этапе, как я уже говорил, требуется настройка доступа к Google Play Android Developer API
Сначала нужно открыть существующий проект в Google Cloud Console либо создать новый. Можно, например, использовать проект Firebase
![Google Cloud Console Google Cloud Console](https://habrastorage.org/getpro/habr/upload_files/4e1/42b/baf/4e142bbaf4b4fa35604f33ca61b0e5a0.png)
Включить Google Play Android Developer API, это можно сделать по ссылке
![Google Cloud Console Google Cloud Console](https://habrastorage.org/getpro/habr/upload_files/3ab/545/a19/3ab545a19990769702474d03577c1c7b.png)
Создать сервис аккаунт (ссылка), дать ему пермишн Service Account User и сохранить на будущее email.
В этом примере это codemagic@tsitser-game.iam.gserviceaccount.com
У вас может быть, например, blabla@your-project.iam.gserviceaccount.com
![Google Cloud Console Google Cloud Console](https://habrastorage.org/getpro/habr/upload_files/b41/da4/195/b41da4195df1afccdd8f9776ad5353de.png)
![Google Cloud Console Google Cloud Console](https://habrastorage.org/getpro/habr/upload_files/f7e/6b7/fd1/f7e6b7fd17cf0a5e1bea26caa9fc1bdf.png)
Создать и сохранить файл Private Key JSON от этого сервис аккаунта
![Google Cloud Console Google Cloud Console](https://habrastorage.org/getpro/habr/upload_files/a52/dc5/5db/a52dc55db851d75b974553a021b6473f.png)
![Google Cloud Console Google Cloud Console](https://habrastorage.org/getpro/habr/upload_files/668/9ae/6b3/6689ae6b3144a3551ac993f0b487e124.png)
![Google Cloud Console Google Cloud Console](https://habrastorage.org/getpro/habr/upload_files/52d/27b/192/52d27b192c422155e7e9fad2d4501f4d.png)
Загрузить Private Key JSON в Codemagic
![Codemagic.io Codemagic.io](https://habrastorage.org/getpro/habr/upload_files/6c8/5aa/ee1/6c85aaee194afab291842adbaaaed0d9.png)
Внимание! Для следующих шагов необходимы прав администратора в Google Play Console
Зайти в Google Play Console в секцию App integrity и связать с Cloud Project
![Google Play Console Google Play Console](https://habrastorage.org/getpro/habr/upload_files/f83/105/39d/f8310539d15a486ce02eb0e9ae539474.png)
При наличии разрешений будет следующий вид
![Google Play Console Google Play Console](https://habrastorage.org/getpro/habr/upload_files/f50/c65/d49/f50c65d49ab91bd66275a907940cf7ba.png)
Далее зайти в секцию Users and Permissions, добавить сохраненный email сервис аккаунта из Cloud Console
В нашем примере это codemagic@tsitser-game.iam.gserviceaccount.com
Разрешения можно оставить те, которые выбраны по умолчанию (я на всякий случай даю админские права, но это не обязательно)
![Google Play Console Google Play Console](https://habrastorage.org/getpro/habr/upload_files/e13/ec9/88d/e13ec988deeb4e5b250b28ecf93ca300.png)
![Google Play Console Google Play Console](https://habrastorage.org/getpro/habr/upload_files/f47/a8e/54c/f47a8e54ce3bc51a5350ccfb89bcc71c.png)
Если все настроено верно, то после запуска сборки будет такой примерно результат:
![Codemagic.io Codemagic.io](https://habrastorage.org/getpro/habr/upload_files/8b3/dec/c9d/8b3decc9dc770cdea45eed0f6d1be0f6.png)
А в Google Play будет сразу так:
![Google Play Console Google Play Console](https://habrastorage.org/getpro/habr/upload_files/4c0/011/9f7/4c00119f77ca6539c746dd7657adbb8e.png)
Заключение
Сегодня детально рассмотрели, как очень просто организовать CI/CD для сборки и публикации flutter приложения в Google Play с помощью сервиса Codemagic
Кратко, что требуется разработчику для настройки под Android:
Доступ к репозиторию проекта
Ключ подписи релизной сборки и пароли к нему
Админские права в Google Play
Что требуется сделать владельцу аккаунта в Google Play:
Дать админские права разработчику
В следующей статье будет про настройку CI/CD для iOS и публикацию в App Store Connect (TestFlight), а также коротко расскажу про ограничения этого сервиса и другие важные моменты.