Автоматизация RuStore: Как отправлять APK в продакшн из терминала

Гайд по использованию open-source утилиты rustore-cli для настройки CI/CD.

Автоматизация RuStore: Как отправлять APK в продакшн из терминала

Любой Android-разработчик, работающий с российским рынком, рано или поздно сталкивается с рутиной публикации в RuStore. Если выкладывать обновления раз в месяц — веб-консоль вполне терпима. Но если у вас настроен релизный конвейер и вы хотите исключить "человеческий фактор" (или просто лениво кликать мышкой), нужно решение для командной строки.

Недавно я искал способ автоматизировать этот процесс и наткнулся на open-source решение — rustore CLI. Это неофициальный, но вполне рабочий инструмент на Node.js, который закрывает потребность в автоматической выгрузке билдов.

Ниже — пошаговый гайд, как я настроил публикацию приложения, не заходя в браузер.

Подготовка

Инструмент написан на Node.js, поэтому установка стандартная.

1. Установка:

npm install -g rustore

2. Ключи доступа:

Вам всё-таки придется один раз зайти в RuStore Консоль. В разделе настроек нужно получить keyId и Приватный ключ (в формате base64).

3. APK файл:

Билд должен быть подписан релизным ключом.

Шаг 1: Авторизация в CLI

Вместо того чтобы хардкодить токены в скриптах, утилита предлагает команду логина. Она сохраняет сессию локально.

rustore login --key-id <ВАШ_KEY_ID> --key <ВАШ_BASE64_КЛЮЧ>

Чтобы проверить, что токен подхватился корректно:

ustore whoami

Шаг 2: Поиск приложения

Для автоматизации нам нужен packageName. Если вы поддерживаете несколько приложений и боитесь перепутать пакеты, можно вывести список всех доступных приложений аккаунта в JSON-формате:

rustore apps list --json

Копируем нужный packageName (например, com.dailyfive.fitness).

Автоматизация RuStore: Как отправлять APK в продакшн из терминала

Шаг 3: Создание черновика (Draft)

Логика RuStore API требует сначала создать "черновик" версии. Это промежуточное состояние перед загрузкой файла.

rustore apps create-draft \ --packageName com.dailyfive.fitness \ --minAndroidVersion 8 \ --publishType INSTANTLY

Нюанс: Команда возвращает JSON. Нам нужно значение из поля body — это versionId. Сохраните его (или распарсите через jq, если пишете bash-скрипт), оно понадобится на следующем шаге.

Шаг 4: Загрузка APK

Имея на руках versionId, мы можем загрузить сам файл.

rustore apps upload-apk \ --packageName com.dailyfive.fitness \ --versionId 2064432562 \ --file ./app-release.apk \ --isMainApk true

Примечание: Если ваше приложение использует Huawei Mobile Services (HMS), нужно добавить флаг --servicesType HMS. Для стандартных Android-сборок этот флаг не нужен (или используйте --servicesType Unknown).

Шаг 5: Отправка на модерацию

Финальный аккорд. Черновик создан, файл привязан, отправляем всё это модераторам.

rustore apps send-for-moderation \ --packageName com.dailyfive.fitness \ --versionId 2064432562 \ --priorityUpdate 5

Здесь --priorityUpdate 5 выставляет высокий приоритет обновления (полезно для хотфиксов).

Автоматизация RuStore: Как отправлять APK в продакшн из терминала

Возможные проблемы (Troubleshooting)

В процессе настройки я столкнулся с парой моментов, которые стоит иметь в виду:

  1. Путаница с ID: Часто возникает ошибка Version not found, если по привычке передать ID приложения вместо versionId. Важно использовать именно тот ID, который возвращает команда create-draft.
  2. Дубликаты черновиков: Если вы создали черновик, но не загрузили файл и попытались создать новый — API выдаст ошибку. Нужно либо использовать старый черновик, либо удалить его вручную.
  3. Размер файла: Лимит на загрузку — 5 ГБ. Для игр с тяжелыми ассетами это может быть критично.

👉 Репозиторий проекта: GitHub: rustore CLI