fastlane сообщает об ошибке авторизации, а загрузка сборки или управление TestFlight остановились.
Самый быстрый путь: отозванный ключ App Store Connect нельзя восстановить или включить повторно — создайте новый ключ и замените старые данные во всех использующих их задачах автоматизации.
Статья предназначена для независимых разработчиков и небольших команд, которые используют fastlane для загрузки приложений или управления TestFlight.
Она также пригодится, если публикация выполняется на удалённом Mac и нужно восстановить цепочку, не раскрывая закрытый ключ в репозитории, журнале CI или клиентском коде.
Почему сообщение fastlane ещё не доказывает, что ключ отозван?
Сбой авторизации может возникнуть на нескольких разных этапах. Ошибку JWT, несоответствие Key ID и файла p8, недостаточную роль пользователя и отзыв ключа нельзя считать одним и тем же состоянием: способы исправления у них различаются. Прежде чем создавать новый ключ, зафиксируйте точный текст ответа и проверьте, какие учётные данные фактически получает запущенная задача.
Apple указывает, что токены для запросов к App Store Connect API создаются как JWT; в частности, их срок действия задаётся параметром exp и не должен превышать 20 минут от времени создания. Поэтому отказ с истёкшим или неверно сформированным токеном сам по себе не доказывает, что API Key отозван. Сопоставьте поведение токена с требованиями Apple к генерации JWT.
| Наблюдение | Что проверить в первую очередь | Следующее действие |
|---|---|---|
| Сообщение указывает на недопустимый или истёкший токен | Системное время, создание JWT, значение exp, способ формирования токена |
Исправить генерацию токена и повторить проверку |
| Используется неожиданный Key ID или неверный файл | Конфигурацию fastlane, переменные окружения, путь к секрету | Убедиться, что идентификатор и приватный ключ относятся к одной паре |
| Авторизация проходит не для нужного действия | Роль пользователя или доступ ключа к требуемым операциям | Проверить разрешения, необходимые для конкретной задачи |
| В интерфейсе ключ обозначен как отозванный | Статус ключа и перечень автоматизаций, где он используется | Создать замену и обновить все места использования |
Это диагностические ориентиры, а не таблица однозначного соответствия текстов ошибок и причин: сообщения fastlane зависят от действия, настроек и ответа API. Текущий Key ID стоит сверить с записью ключа в App Store Connect, а не только с именем файла или сохранённой переменной в CI. В документации Apple описаны создание и управление ключами, а также их назначение для API: справка по App Store Connect API.
Что делать, если ключ действительно отозван?
Отзыв — не временная блокировка. По правилам Apple отозванный API Key нельзя повторно включить, а приватный ключ p8 нельзя заново скачать вместо утраченного файла. Если статус ключа подтверждён, восстановление означает создание нового ключа и замену старых реквизитов во всех зависимых конфигурациях. Повторная попытка применить прежнюю пару не вернёт доступ.
Не отзывайте ключ наугад, если есть только общая ошибка авторизации: сначала проверьте состояние ключа в App Store Connect и выясните, какие данные читает fastlane. Но при подозрении, что приватный ключ стал доступен посторонним, приоритет другой — немедленно отозвать его, затем восстанавливать публикацию с новой парой. После отзыва не оставляйте старое значение в расписаниях, локальных копиях и секрет-хранилищах, считая его действующей запасной копией.
До замены полезно составить карту зависимостей. Проверьте не только основную команду публикации, но и отдельные lane, задания CI, расписания, локальные скрипты и конфигурации на удалённых Mac. В команде один ключ может использоваться несколькими проектами, а старое значение — сохраниться в переменной среды или хранилище секретов, которое не совпадает с текущим рабочим каталогом.
Какая разница между личным и командным ключом при замене?
Порядок миграции зависит от типа ключа. Согласно документации Apple, у пользователя может быть только один действующий личный ключ, тогда как для команды можно создавать несколько командных ключей. Поэтому заранее проверьте, что именно отозвано и позволяет ли роль текущей учётной записи создать нужную замену. Подробности создания и управления ключами приведены в документации Apple по ключам App Store Connect API.
При плановой ротации командный ключ можно подготовить и проверить до переключения автоматизаций, пока старый ключ ещё действует. Это позволяет распределить замену по задачам, не переключая все проекты одновременно. Личный ключ нельзя мигрировать по той же схеме с двумя одновременно действующими личными ключами одного пользователя: учитывайте это ограничение при подготовке окна замены. Не предполагайте, что права нового ключа автоматически совпадут с правами предыдущего, — проверьте роль и нужный набор операций отдельно.
При аварийном отзыве логика иная: старый ключ уже не даёт рабочего переходного периода. Приоритет — определить владельца новой пары, проверить доступ этого пользователя к управлению ключами и обновлять конфигурации по согласованному плану. Если создание нового ключа недоступно текущей роли, передайте действие ответственному пользователю с подходящими полномочиями, а не пытайтесь обойти ограничение повторными запросами fastlane.
Шаг первый: зафиксируйте, откуда fastlane читает реквизиты
Найдите действующую конфигурацию app_store_connect_api_key и определите источник каждого значения: key_id, применимый issuer_id, а также файл p8 или содержимое приватного ключа. В fastlane параметры могут приходить из конфигурации lane, переменных окружения или другого скрипта. Описание аргументов и вариантов передачи ключа есть в справке fastlane по действию app_store_connect_api_key.
Записывайте названия переменных и пути, но не копируйте секреты в задачу поддержки или диагностический журнал. Один из частых источников путаницы — проверка конфигурационного файла в репозитории при фактическом запуске из другого рабочего каталога или с отдельным набором переменных окружения. В результате разработчик исправляет одно значение, а процесс продолжает читать старое.
Шаг второй: создайте замену и сверяйте её как единую пару
После подтверждения отзыва создайте новый ключ того типа, который подходит владельцу и задачам автоматизации. Зафиксируйте новый Key ID и скачайте соответствующий приватный ключ, пока он доступен для сохранения. Не предполагайте, что новый файл можно будет получить повторно, если исходный экземпляр потеряется: заранее сохраните его в утверждённом защищённом хранилище.
Проверьте соответствие идентификатора и файла как пары. Если приложение или библиотека использует Issuer ID, проверьте и его применимость к выбранному типу ключа. В конфигурации fastlane передавайте параметры из одного актуального набора реквизитов; смешивание нового Key ID со старым p8 не создаёт рабочую замену. Обзор настройки API в fastlane доступен в официальной документации fastlane по App Store Connect API.
Шаг третий: безопасно обновите все источники секрета
Внесите новые данные в секрет-хранилище, которое действительно использует сборочная задача, затем обновите ссылку или переменные во всех затронутых lane и CI-процессах. На удалённом Mac дополнительно проверьте пользователя, от имени которого выполняется задача, его окружение и рабочий каталог: интерактивный терминал и процесс автоматизации могут получать разные переменные.
Приватный ключ нельзя помещать в Git, встраивать в исходный код клиентского приложения или выводить командой в открытый журнал. Не отправляйте p8 в чатах и не сохраняйте его рядом с исходниками только для удобства тестирования. При работе на удалённом Mac заранее разберитесь, как передавать секрет и кто имеет доступ к среде; информацию о подходе к обработке данных можно сверить с политикой конфиденциальности ArmVNC.
Шаг четвёртый: проверьте чтение новых значений до публикации
Перед запуском полной публикационной lane сверьте, что процесс получает ожидаемый Key ID, а путь к p8 существует и относится к этому ключу. Не выводите содержимое приватного ключа для проверки. Вместо этого проверяйте наличие файла, доступ процесса к нему и корректность выбранного источника конфигурации. Если для тестового запуска используется другая lane или отдельная оболочка, проверяйте именно тот путь исполнения, который будет использоваться при выпуске.
Общий список параметров fastlane полезен для выявления расхождений между key_filepath и key_content, а также другими настройками действия. Выбирайте один понятный источник приватного ключа для конкретного процесса, чтобы не гадать, какое из одновременно заданных значений имеет приоритет. Секреты и права доступа на рабочей машине должны соответствовать внутренним правилам команды.
Шаг пятый: сначала подтвердите доступ, затем проверьте доставку
Разделите восстановление на два результата. Сначала выполните низкорисковое действие, для которого у нового ключа заведомо есть нужные разрешения, и проверьте, что запрос проходит авторизацию. Затем запустите задачу, соответствующую реальному процессу — например, загрузку сборки, если именно она была остановлена.
Успешная авторизация не означает, что сборка загружена, а факт отправки не подтверждает, что App Store Connect завершил последующую обработку. Сохраните результат каждого этапа отдельно: журнал авторизации без секретов, итог fastlane и состояние операции в интерфейсе App Store Connect. Такой порядок помогает отличить восстановленный доступ от полностью восстановленного выпуска.
Как проверить, что цепочка публикации действительно восстановлена?
Перед возвращением автоматизации к обычному расписанию пройдите контрольные пункты. Список пригоден как для ручного процесса, так и для проверки после замены секрета в CI:
- [ ] В App Store Connect подтверждено, что старый ключ отозван, а не просто указан неверный файл.
- [ ] Новый Key ID и приватный ключ относятся к одной созданной паре.
- [ ] При необходимости задан актуальный Issuer ID и проверены права нового ключа для требуемого действия.
- [ ] Все lane и задания, использовавшие старый ключ, найдены и переведены на новые реквизиты.
- [ ] Проверено, откуда именно процесс на удалённом Mac получает переменные и файл p8.
- [ ] Приватный ключ отсутствует в репозитории, выводе команд и открытых журналах.
- [ ] Низкорисковый запрос проходит авторизацию с правами, достаточными для выбранного действия.
- [ ] Основная задача fastlane завершилась, а результат загрузки или последующей обработки проверен отдельно.
- [ ] Для команды зафиксированы владелец новой пары, место защищённого хранения и порядок отзыва при следующем инциденте.
| Контрольный рубеж | Признак прохождения | Если проверка не пройдена |
|---|---|---|
| Диагностика | Установлено, что причина — отзыв, JWT, несоответствие пары или разрешения | Не создавать ключ вслепую; вернуться к тексту ошибки и источнику конфигурации |
| Замена | Новый Key ID, приватный ключ и применимые данные согласованы | Проверить, не смешаны ли реквизиты от разных ключей |
| Обновление | Затронутые задания читают новые значения из ожидаемого хранилища | Проверить переменные окружения, рабочий каталог и пользователя процесса |
| Проверка доступа | Низкорисковое действие проходит с нужными правами | Сверить тип ключа, роль и требуемые разрешения |
| Проверка публикации | Выполнена реальная задача, отдельно проверен её итог | Не считать одной успешной авторизации восстановлением всей цепочки |
Для удалённого Mac важно не только заменить файл: автоматическая задача может запускаться с другим пользователем или окружением, чем сеанс разработчика. Если процесс всё ещё обращается к старому секрету, повторная замена файла в знакомой папке не поможет. Сведения о подключении и работе с удалённой средой можно уточнить в справочном центре ArmVNC.
| Тип ситуации | Порядок переключения | Что учитывать |
|---|---|---|
| Плановая замена командного ключа | Подготовить и проверить новый ключ, затем поэтапно переключить задачи | Документация Apple допускает создание нескольких командных ключей |
| Плановая замена личного ключа | Организовать переключение с учётом ограничения на один действующий личный ключ пользователя | Не рассчитывать на параллельную работу двух личных ключей одного пользователя |
| Подтверждённый отзыв или подозрение на утечку | Отозвать скомпрометированный ключ, создать замену и обновить все найденные потребители | Старые реквизиты нельзя считать запасным действующим вариантом |
Если процесс публикации сейчас выполняется на собственном компьютере или на общей машине без ясного контроля над секретами, сравните не только стоимость среды, но и доступ, хранение учётных данных, стабильность запуска и ответственность за обслуживание. Локальная машина требует поддерживать macOS и не всегда доступна для непрерывной автоматизации; общая инфраструктура может усложнить контроль над тем, кто видит секреты; облачная сборочная услуга, в свою очередь, должна подходить проекту по возможностям и настройкам. Аренда удалённого Mac имеет смысл, когда команде нужна отдельная macOS-среда для проверки или публикации без покупки ещё одного компьютера, но при постоянной длительной нагрузке и необходимости физических интерфейсов собственная машина может быть разумнее.
Перед переносом проверьте, как в выбранной среде будут храниться и обновляться p8, кто получит доступ и как проверить выполнение fastlane. Если текущей команде не хватает отдельной стабильной macOS-среды для восстановления и последующих выпусков, можно изучить варианты аренды Mac в восточном регионе США и сопоставить их с требованиями проекта. Независимо от места запуска ключ остаётся секретом команды: после отзыва его нельзя «починить», поэтому восстановление завершается только тогда, когда все процессы перешли на новую пару и фактический результат публикации подтверждён.
Подготовьте надёжную среду для публикации приложений
Арендуйте в ArmVNC выделенный физический Mac на Apple Silicon с нативной macOS для сборки и выпуска приложений для iOS.
