Вступление
Вторая часть обзора будет посвящена сервису HockeyApp, с первой частью обзора можно ознакомиться тут.
По всей видимости, Miscrosoft решила не отставать от компании Apple, в результате чего в начале декабря было объявлено о приобретении HockeyApp (подробнее в блоге HockeyApp и на сайте Microsoft). В отличие от Apple, Microsoft не стала урезать функционал сервиса или ограничивать список поддерживаемых платформ. В пресс-релизе говорится, что сервис продолжит свою работу без изменений, а в дальнейшем получит развитие, о подробностях которого мы узнаем позже.
Система оценки: сервисы оцениваются по 10-балльной шкале по каждому из разделов (Регистрация и интеграция, Основной функционал, Дополнительный функционал, Continuous Integration). Суммарная оценка позволит определить победителя (итоговое заключение войдет в последнюю часть обзора).
HockeyApp
Регистрация и интеграция
Регистрация в сервисе простая, с обязательным подтверждением по электронной почте. Бесплатный аккаунт не дает возможности полноценного использования сервиса — доступно только участие в качестве тестера, либо использование сервиса без ограничений в составе другой команды (аккаунта организации). Для того чтобы оценить сервис, возможно включить режим Trial — на 1 месяц (причём отсчет trial-период начнётся только с момента создания профиля первого приложения, а не со дня регистрации). Стоимость платного аккаунта начинается от $10 в месяц, подробнее можно ознакомиться здесь. Из плюсов можно отметить, что для любого типа платных аккаунтов отсутствуют ограничения на размер хранимых данных и количество пользователей, привязанных к аккаунту. Отличие разных тарифных планов в количество приложений и количестве аккаунтов с типом “Owner” (только для тарифных планов категории “Business”).
Единственное пожелание к процессу создания аккаунта: сделать более понятным результат выбора опции “I’m developer”:
Сейчас, когда по умолчанию она не выбрана, следующее далее пояснение можно воспринять как список возможностей, которые уже доступны, а в случае выбора опции, как ожидается, должно появиться ещё что-то. На самом же деле аккаунт по умолчанию позволяет только просматривать список доступных приложений (и, конечно, устанавливать их), добавлять свои устройства и оставлять отзывы.
Отдельно хотелось бы отметить, что на сайте сервиса имеется специальное руководство для тех разработчиков, кому необходимо произвести миграцию проекта, использующего TestFlight старой версии (до перехода к Apple): http://support.hockeyapp.net.
Интеграция с SDK тоже достаточно простая, но конечно же далека от идеала, которым, по-моему, на данный момент является решение, используемое Fabric (Crashlytics) — о нём мы поговорим в заключительной — четвёртой — части обзора.
Оценка: 7/10.
Основной функционал
Примечание: говоря о дистрибуции приложений для iOS необходимо помнить, что на данный момент все сервисы, кроме TestFlight от Apple, по-прежнему должны учитывать ограничение на количество устройств доступных при использовании AdHoc provision profiles. Следовательно, максимум используемых устройств равен 100, в которые входят в том числе и устройства, используемые непосредственно разработчиками. Самым же большим ограничением является то, что список зарегистрированных устройств можно “обнулять” только раз в год, после продления подписки на iOS Developer Program.
Следующим шагом после активации нового аккаунта HockeyApp (любого типа) становится регистрация устройства, которое будет использовано для установки тестовых версий приложений:
Сервис предлагает несколько способов:
- переход по ссылке в мобильном браузере на устройстве
- считывание QR-кода (в котором закодирована та же ссылка)
- добавление идентификатора вручную
Интересный момент: при первоначальной регистрации тестового устройства я не получил уведомления по почте, что новое устройство было добавлено и доступно для использования. Однако в дальнейшем, при регистрации нового устройства на другой аккаунт, сервис автоматически определил, что устройство с таким UDID уже включено в provision profile приложения и мне на почту было отправлено извещение с возможностью пригласить нового пользователя в свою команду:
Ещё одно замечание общего характера: сайт HockeyApp достаточно часто использует специальные “попапы” для сообщения о результате какого-либо действия. Например, после приглашения нового пользователя наверху страницы появится новый (временный) блок с сообщением:
Такой способ можно посчитать удобным (нет необходимости вручную закрывать всплывающие окна с оповещениями), но к нему нужно привыкнуть, так как блок с уведомлением вставляется внутри контейнера с основным содержанием страницы и при его прокрутке блок может скрываться под навигационной панелью, то есть становиться невидимым.
Сервис также позволяет импортировать список пользователей из текстового файла:
Содержание файла может быть как минималистичным (только адрес электронной почты), так и с дополнительными данными (имя и роль).
Примечание. Роль кодируется следующим образом:
- “1” означает Developer
- “2” — Member
- “3” — Tester
Присвоить роль “Owner” (или любую другую) можно на странице управления пользователями. Подробнее о ролях можно узнать тут и тут.
Новый билд можно отправить либо вручную через сайт сервиса:
Либо в полуавтоматическом режиме, если установлено десктопное приложение — в этом случае достаточно будет выполнить архивирование проекта (Product-Archive) — далее в появившемся попапе выбрать Upload:
А потом закончить публикацию, при необходимости задав дополнительные настройки в появившемся окне:
Примечание: Release type — может быть Store — в этом случае на сайт сервиса загружаются только отладочные символы — само приложение нельзя скачать из клиента сервиса, но сбор и анализ отчётов о падениях будет производится.
Важно: номер сборки должен всегда увеличиваться! Так как, даже если меняется версия, номер сборки нельзя использовать в значении меньше того, что использовалось до этого. Если же всё-таки нарушить данное правило, то новый билд будет считаться “старым” и, как следствие, не будет работать автоматическое уведомление о наличии новой версии и в информации об истории версий приложения “неправильный” билд окажется не в начале списка (подробнее).
Даже если десктопное приложение не было запущено в момент подготовки архива, загрузку всех архивированных версий можно выполнить из раздела “Upload New Build”:
Заметки для релиза могут быть как в простом, текстовом виде, так и с дополнительным форматированием при помощи распространенного языка разметки Markdown.
При загрузке новой версии приложения через сайт сервиса возможно ограничить доступ к этой версии (при помощи опции Restrict downloads — в десктопном приложение эта опция неактивна).
Также можно выбрать уведомление всех пользователей (которым будет доступна данная версия приложения) или уведомить только отдельных пользователей (при использовании десктопного приложения можно только выбрать между двумя вариантами: рассылать оповещение или не рассылать):
Примечение: возможно баг: после загрузки новой версии без уведомления кнопка Notify (Manage version, вкладка Status) не приводит ни к каким действиям.
Также при загрузке можно указать, что данная версия является обязательной — в этом случае пользователь не сможет продолжить использование более старой версии приложения — уведомление о наличии обновления будет показываться каждый раз и от него нельзя отказаться (при условии, что в приложении используется фреймворк сервиса).
Первоначальная установка веб-приложения HockeyApp на мобильном устройстве выполняется в несколько шагов:
Иконка установленного веб-приложения HockeyApp:
Возможность устанавливать предыдущие версии приложения есть, но реализован данный функционал не очень удобно. Он недоступен со страницы приложения на вкладке History, и для того чтобы им воспользоваться необходимо через меню (справа вверху) перейти в раздел Overview, там выбирать подраздел Versions, в нём найти нужную версию, открыть страницу с детальной информацией и уже только там будет доступна установка.
Функционал отправки отзывов в HockeyApp в чём-то лучше реализованого в Apple TestFlight, так как позволяет прикреплять к сообщению до трёх вложений (но такая возможность есть только на планшетах):
Сами вложения помещаются в облачное хранилище AWS, поэтому теоретически есть возможность для отправки как видео-файлов так и простых скриншотов без ограничений на размер файла.
Важно: переключение между вкладками Details и Feedback на странице отправки отзыва вызывает её перезагрузку. Имейте это в виду, чтобы не потерять текст набранного сообщения.
Сразу после отправки отзыва он отображается на вкладке Feedback, но сохраняется там только временно, на мобильных устройствах все сообщения можно просмотреть:
- на iPad: Dashboard — вкладка Feedback
- на iPhone/iPod Touch: детальная информация о приложении — верхнее правое меню — Overview — Feedback
Примечание: возможность просмотра отправленных сообщений также зависит от роли пользователя и типа устройства.
Существующие различия в фунционале для устройств разного типа я отношу к недостаткам сервиса. Возможно этот недостаток временный и в дальнейшем функционал и интерфейс будет максимально унифицированы.
Также к недостаткам текущей реализации можно отнести невозможность отслеживать изменения статуса отзыва (Open/Waiting/Resolved/Ignored) для всех пользователей кроме тех, кто входит в группу Owner. Этот функционал доступен им в обычной/”десктопной” версии вебсайта — для пользователей же других групп сервис не осуществляет даже уведомление по электронной почте.
Важно: самым же большим недостатком, на мой взгляд, является тот факт, что отзывы не связываются с версией приложения, поэтому её необходимо указывать вручную, если это имеет значение.
Напоследок, в качестве плюса отмечу возможность оставлять комментарии к отзывам (опять же с поддержкой вложений при работе с сервисом на планшете).
Оценка: 8/10.
Дополнительный функционал
Думаю, все разработчики согласятся с тезисом “лучше один раз увидеть, чем сто раз услышать” применительно к процессу тестирования программного обеспечения. Действительно, зачастую информация, предоставляемая тестерами является либо неполной, либо ошибочной, так как частично основана на догадках. Поэтому обычных отзывов бывает недостачно и в этом случае на помощь разработчикам приходит дополнительный функционал, в частности “символизация” отчётов о падении приложения.
Подобный функционал в HockeyApp реализован на очень хорошем уровне. Отправка отчётов о падении работает сразу “из коробки” (естественно, если приложение использует фреймворк сервиса). Отчёты могут отправляться в полностью автоматическом режиме (после перезапуска приложения), либо с запросом на отправку с подтверждением пользователем (выбор режима делается один раз и его можно сбросить переустановив приложение).
Если при отправке новой версии использовалось десктопное приложение, либо отладочные символы (*.dSYM) были загружены дополнительно с *.ipa, то сервис автоматически проводит “символизацию”, позволяя однозначно определить класс, метод и номер строки, которые стали причиной ошибки:
Также сервис проводит группировку полученных отчётов, помогая оценить масштаб/частоту проблемы и следовательно определить приоритетность в исправлении выявленных ошибок (на скриншоте выше количество отчётов в группе можно увидеть в колонке Count, дополнительно о принципах группирования можно узнать здесь).
Более того, если в десктопном приложении сервиса настроен доступ к репозиторию проекта, в детальной информации для отчёта о падении можно сразу увидеть “цитату” с кодом, а также открыть класс в Xcode:
Дополнительно есть возможность загрузки отчёта о падении вручную, но это возможно сделать только на вебсайте сервиса:
Примечание: с рекомендациями по разрешению проблем с “символизацией” можно ознакомиться тут.
Кроме того сервис предоставляет возможность интеграции с системой отслеживания ошибок (например, Basecamp или JIRA, полный список тут).
После того как связь с такой системой установлена, сервис может добавлять новые записи (тикеты) в автоматическом режиме:
Примечание: по умолчанию опция автоматического создания отключена. Также есть возможность задать минимальное количество полученных отчётов в группе, после достижения которого срабатывает автоматизация.
Вручную создание нового тикета на основе данных об ошибке возможно только на сайте сервиса:
В качестве аналитических данных сервис предлагает графическое представление информации о числе отчётов о падении, скачиваний, установок, а также статистику по использованию той или иной версии приложения:
Исходный код для клиентской части SDK github.com/bitstadium доступен всем желающим — таким образом сервис демонстрирует свою прозрачность для Enterprise-клиентов.
Дополнительные ссылки:
- Собранные сервисом данные можно экспортировать через специальный API
- Knowledge base
Оценка: 9/10.
Continuous Integration
Примечания:
1. Описанные далее нюансы использования сервисов как части непрерывной интеграции (continuous integration) в данном обзоре подразумевают, что она будет делаться на основе решения, предлагаемого компание Apple. То есть при помощи Mac OS X Server и Xcode bots — подробно на организации такой интеграции я не буду останавливаться, возможно это станет темой для отдельной статьи. Желающие могут ознакомиться с темой самостоятельно, например, обратившись к официальному руководству от Apple.
2. К сожалению на данный момент настройка CI от Apple не всегда проходит гладко. Как правило возникают проблемы с signing identity и provision profiles, для их решения в простом случае достаточно установить последнюю версию OS X Server (на момент публикации 4.0.3 для OS X Yosemite) и в настройках Xcode добавить аккаунт Apple Developer. Если же проблемы остаются, то в моем случае потребовалось:
- добавить используемый сертификат и ключ в keychain System
- скопировать используемый provision profile в папку “/Library/Developer/XcodeServer/ProvisioningProfiles/” (сообщение об ошибке “No provisioning profiles containing one of the following signing identities was found”)
- добавить исключение для codesign в свойствах для ключа (иначе, если бот настроен на создание архива, интеграция не сможет завершиться и будет остановлена с ошибкой “Creating archive failed: xcodebuild exited with status 15”, подробнее)
Скрипт для использования вместе c ботами Xcode может быть в двух вариантах: с использованием curl или с использованием специальной утилиты puck (её можно установить вместе с десктопной версией клиента HockeyApp, подробнее):
Во втором случае необходимо создать symlink для puck: “sudo ln -s /usr/local/bin/puck /usr/bin/puck”, иначе бот не сможет выполнить нужный скрипт.
Сам скрипт добавляется на последнем шаге мастера создания/настройки бота:
puck -download=true -notify=true -force=true -submit=auto -app_id=APP_ID -api_token=API_TOKEN "${XCS_ARCHIVE}"
APP_ID - можно найти на странице приложения
API_TOKEN - создается в настройках аккаунта на вкладке “API Tokens”
В качестве дополнительных параметров можно указать (в том числе):
-notes=<text> release notes text (single line only!)
-notes_path=<path> absolute path to release notes file
-tags=<comma-separated string> restrict version to tags
-teams=<comma-separated string> restrict version to team IDs
-users=<comma-separated string> restrict version to user IDs
Полный список параметров можно получить запуском “puck -help”.
Оценка: 9/10.
Итого суммарная оценка по всем разделам: 33 балла.
Часть 1. Apple TestFlight. Продолжение следует...
Автор: sman