- Что это?
- Fastfile
- Автоматизируем выгрузку на testflight
- Билд – прочие аксессуары
- Выгрузка на testflight
- Добавляем в проект
- Как это работает
- Какой профит?
- Команды (actions)
- Конфигурируем appfile
- Настройка клиента
- Настройка сервера
- Перед тем, как продолжим
- Сборка приложения
- Сертификаты и provision profiles
- Устанавливаем сам fastlane
- Запускаем итоговый скрипт
- Заключение
Что это?
Fastlane - это инструмент для автоматизации процессов сборки и выкладки мобильных iOS и Android приложений, которая включает в себя также генерирование скриншотов, запуск Unit/UI тестов, отправка сообщений в Slack, подключение к Crashlytics и многие другие полезные вещи, которые упрощают жизнь.
Fastfile
Папка fastlane содержит в себе Fastfile и Appfile. В Appfile мы будем прописывать необходимые для сборки и публикации значения: Bundle IDs, App ID, Team ID и другие. В Fastfile мы будем описывать наши скрипты. После первоначальной установки он выглядит так:
Автоматизируем выгрузку на testflight
Начнем с задания понятного имени нашему lane’у. Переименуем custom_lane в testflight_lane. Теперь понятно, что результатом выполнения этого скрипта будет загруженная свежая сборка в TestFlight.
default_platform(:ios)
platform :ios do
desc "Builds, achieves and uploads ipa to TestFlight"
lane :testflight_lane do
# Actions
end
endБилд – прочие аксессуары
Выгрузка на testflight
Для загрузки ipa в TestFlight будем использовать Pilot:

С помощью Pilot можно:
Мы будем использовать основную его функцию: отправка сборок в Apple Store Connect.
Добавим в testflight_lane вызов upload_to_testflight с параметрами skip_submission (будем использовать только для загрузки ipa файла) и skip_waiting_for_build_processing (не дожидаемся окончания processing’a):
default_platform(:ios)
platform :ios do
desc "Builds, achieves and uploads ipa to TestFlight"
lane :testflight_lane do
cert
sigh
increment_build_number
gym
upload_to_testflight(
skip_submission: true,
skip_waiting_for_build_processing: true
)
end
endДобавляем в проект
В корневой директории проекта запускаем:
$ sudo fastlane initFastlane предложит нам варианты предустановленных скриптов в зависимости от того, что мы хотим:
Мы выберем 4 вариант, т.к. будем прописывать все необходимые команды под свою ситуацию:
Готово! Папка fastlane и файл gemfile успешно установлена к нам в проект.
Как это работает
Для начала выясним, что делает fastlane: основные его команды и как мы описываем то, что нужно сделать.
Какой профит?
На первоначальную настройку базовых команд для автоматизации выкладки приложения, например, для публикации в App Store или на TestFlight, уйдет не более двух часов, однако в будущем это сэкономит уйму времени, т.к. весь процесс будет запускаться одним вызовом из командной строки.
ВНИМАНИЕ: Для выполнения всех шагов необходима подписка Apple Developer, так как доступ в App Store Connect отсутствует для бесплатных аккаунтов.
Команды (actions)
В fastlane входит много полезных команд, упрощающих жизнь разработчику:
Конфигурируем appfile
Для того, чтобы каждый раз при запуске скрипта не вводить bundle приложения и Apple ID, выпишем их в Appfile:
Настройка клиента
Запускаем ранее скаченный установщик
openvpn-install-2.3.8-I001-x86_64
, выбор компонентов оставляем по умолчанию, путь сохраняется прежний.
После успешной установки переходим в каталог “C:Program FilesOpenVPNconfig” и создаем файл конфигурации клиента “test.ovpn” со следующим содержимым:
Настройка сервера
Для начала качаем дистрибутив с
. Запускаем установщик openvpn-install-2.3.8-I001-x86_64. В компонентах включаем следующее:
Указываем путь установки (Все дальнейшие действия будут ориентироваться на данный путь указанный в примере):
В процессе установке потребуется установить виртуальный сетевой адаптер, соглашаемся с установкой.
После успешной установки переходим в каталог “C:Programm FilesOpenVPN” где создаем директорию “SSL” (каталог может называться как угодно, в последующих настройках будет использоваться именно этот каталог), в данном каталоге будут располагаться сертификаты сервера, алгоритмы шифрования и проверка подлинности клиента.
Переходим в каталог “C:Programm FilesOpenVPNeasy-rsa”, открываем с помощью notepad или notepad (более правильный вариант) “vars.bat” (скрипт, содержащий в себе параметры ответов для создания и генерации клиентских/серверных сертификатов и последующих настроек сервера).
В самом низу файла есть следующие параметры, которые нужно настроить под себя:
set KEY_COUNTRY=RUset KEY_PROVINCE=MOset KEY_CITY=MOSCOWset KEY_ORG=OpenVPNset KEY_EMAIL=local@mos.localset KEY_CN=serverset KEY_NAME=serverset KEY_OU=OUset PKCS11_MODULE_PATH=changeme rem Параметр по умолчаниюset PKCS11_PIN=1234 rem Параметр по умолчанию
Сохраняем.
В этом же каталоге “C:Programm FilesOpenVPNeasy-rsa”, есть конфигурационный файл “openssl-1.0.0.cnf”, открываем его с помощью notepad или notepad (более правильный вариант) и изменяем настройку, отвечающую за срок жизни сертификатов, по умолчанию 365 дней, продлим срок жизни до 3650 дней.
default_days = 3650 # how long to certify for
Сохраняем.
Далее будем генерировать следующее:
ca.crt — Собственный доверенный сертификат (Certificate Authority — далее CA) для подписи клиентских сертификатов и для их проверки при авторизации клиента.dh1024.pem — ключ Диффи Хельмана позволяющий двум и более сторонам получить общий секретный ключserver.crt — сертификат сервераserver.key — ключ сервераta.key — дополнительный ключ для tls-аутентификации (повышение безопасности соединения), сервер и каждый клиент должны иметь копию этого ключа
Открываем командную строку и переходим в каталог “C:Program FilesOpenVPNeasy-rsa”
cd C:Program FilesOpenVPNeasy-rsa
Вводим команду “vars” нажимаем Enter (инициируем работу со скриптами, в случае закрытия командной строки, команду “vars” придется вводить заного)
Вводим команду “clean-all” (Очищаем каталог “C:Program FilesOpenVPNeasy-rsakeys” c последующим созданием файла“index.txt” (база клиентов, она же database) и “serial” (ключ))
Не закрывая командную строку, проверяем содержимое каталога “ C:Program FilesOpenVPNeasy-rsakeys”, должны создаться файлы “index.txt и serial”.
Вводим команду “openvpn –genkey –secret %KEY_DIR%ta.key”
Не закрывая командную строку, проверяем содержимое каталога “ C:Program FilesOpenVPNeasy-rsakeys”, должен создаться файл “ta.key”.
Вводим команду “build-dh” — генерация ключа Диффи Хельмана.
Не закрывая командную строку, проверяем содержимое каталога “ C:Program FilesOpenVPNeasy-rsakeys”, должен создаться файл “dh1024.pem”.
Вводим команду “build-ca” — генерация ключа центра сертификации (CA)На все вопросы отвечаем по умолчанию нажатием клавиши Enter, эти параметры мы прописали в “vars.bat”
Не закрывая командную строку, проверяем содержимое каталога “ C:Program FilesOpenVPNeasy-rsakeys”, должны создаться файлы “ca.crt и ca.key”.
Вводим команду “build-key-server server” — генерация сертификата сервера.На вопросы Country Name, State Name, Locality Name и т.д. отвечаем по умолчанию нажатием клавиши Enter до самого конца, эти параметры мы прописали в “vars.bat”, далее будет предложено создание сертификата сроком на 3650 дней (данный параметр мы указывали в openssl-1.0.0.cnf) нажимаем “Y”, будет предложено записать сертификат сервера в базу, нажимаем “Y”.
Не закрывая командную строку, проверяем содержимое каталога “ C:Program FilesOpenVPNeasy-rsakeys”, должены создаться файлы “server.crt, server.key, server.csr”.
Вводим команду “build-key revokecrt” — команда для создания пользовательского сертификата, но в данном случае мы создаем произвольный сертификат “revokecrt” для последующей генерации файла “crl.pem”, который отвечает за проверку и последующий отзыв сертификатов.
На вопросы Country Name, State Name, Locality Name и т.д. отвечаем по умолчанию нажатием клавиши Enter до вопросов Common Name и Name, на эти вопросы нужно отвечать согласно названию создаваемого сертификата пользователя, в нашем случае это произвольный сертификат “revokecrt” на оставшиеся вопросы нажимаем Enter, далее будет предложено создание сертификата сроком на 3650 дней (данный параметр мы указывали в openssl-1.0.0.cnf) нажимаем “Y”, будет предложено записать сертификат сервера в базу, нажимаем “Y”.
Не закрывая командную строку, проверяем содержимое каталога “ C:Program FilesOpenVPNeasy-rsakeys”, должны создаться файлы “revokecrt.crt, revokecrt.key, revokecrt.csr”
Вводим команду “revoke-full revokecrt” – команда отвечает за отзыв сертификата и последующего создания файла “crl.pem”
Не закрывая командную строку, проверяем содержимое каталога “ C:Program FilesOpenVPNeasy-rsakeys”, должен создаться файл “crl.pem”
Перед тем, как продолжим
Если в shell профайле locale не UTF-8, то будут возникать проблемы со сборкой и загрузкой билдов. Заходим в файл вашего shell profile (~/.bashrc, ~/.bash_profile, ~/.profile или ~/.zshrc) и добавляем следующие строчки:
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8Теперь все готово к написанию непосредственных шагов автоматизации сборки.
Сборка приложения
Добавим команду increment_build_number для увеличения номера билда. Если у вас главный .xcodeproj файл лежит не в корневой папке, то указываем для него путь в параметре xcodeproj:
default_platform(:ios)
platform :ios do
desc "Builds, achieves and uploads ipa to TestFlight"
lane :testflight_lane do
cert
sigh
increment_build_number
# Если главный .xcodeproj не в корневой директории проекта, то:
#
# increment_build_number(
# xcodeproj: "./path/to/MyApp.xcodeproj"
# )
end
endДля работы увеличения номера билда, необходимо зайти в Build Settings/Versioning и выставить Versioning System в Apple Generic и Current Project Version в 1:

Добавим команду gym, которая собирает ipa файл нашего приложения:

Среди параметров можно указать, куда будет положен ipa (output_directory), имя ipa (output_name), scheme (scheme), делать ли Clean (clean) и некоторые другие. Мы ничего не будем указывать в параметрах — fastlane выставит параметры по-умолчанию, соберет и подпишет ipa, но опять же: при желании и необходимости всё можно указать подробно:
default_platform(:ios)
platform :ios do
desc "Builds, achieves and uploads ipa to TestFlight"
lane :testflight_lane do
cert
sigh
increment_build_number
gym
# С заданием конкретных параметров:
#
# gym(
# workspace: "TheHatGame.xcworkspace",
# scheme: "TheHatGame",
# configuration: "Release",
# clean: true,
# output_directory: "./build",
# output_name: "TheHatGame.ipa",
# codesigning_identity: "iPhone Distribution: Evgeny Shishko"
# )
end
endСертификаты и provision profiles
Добавим команды cert и sigh для установки сертификатов и provision profiles соответственно:(Внимание: если вашего приложения нет в App Store Connect, то необходимо добавить команду produce с параметром app_name)
default_platform(:ios)
platform :ios do
desc "Builds, achieves and uploads ipa to TestFlight"
lane :testflight_lane do
# Если приложение не создавалось в App Store Connect:
# produce (
# app_name: "MyAppName"
# )
cert
sigh
end
endЗапустим наш скрипт с помощью команды $ fastlane testflight_lane
При запуске Fastlane попросит у нас ввести пароль от аккаунта, вводим его. Потребуется это только один раз - fastlane его запомнит и при следующих запусках вводить ничего не потребуется.Вот так выглядит вывод, когда fastlane успешно завершает выполнение скрипта:

Теперь сертификат и provision profiles скачены и установлены. Осталось проставить во вкладе General нужного таргета:

Устанавливаем сам fastlane
Для начала установим/обновим до последней версии Xcode Command Tools:
$ xcode-select --installУстанавливаем gem fastlane:
$ sudo gem install fastlane -NV
# или через brew
$ brew cask install fastlaneЗапускаем итоговый скрипт
Сохраняем наши изменения и запускаем из консоли:
$ fastlane testflight_laneНа этапе отправки в testflight в консоли потребуется ввести app-specific пароль (который требуется для авторизации в Application Loader). Найти его можно в личном кабинете Apple ID, сгенерировав его по нажатию на “Generate Password”:

После ввода пароля свежая сборка будет успешно загружена в TestFlight и выполнение fastlane на этом закончится:

Статус новой версии можно посмотреть в App Store Connect:

Заключение
На этом всё! Хотел бы обратить внимание, что в данной статье мы в самом общем случае попробовали возможности fastlane. В связи c этим прикрепляю опрос: будут ли интересны вам, хабровчане, посты про подробное использование упомянутых и других полезных команд в fastlane и продвинутых фишек в настройке скриптов?
Приложение с представленной настройкой fastlane можно найти здесь.
