Сколько автоматизированных задач у вас есть в процессе мобильной разработки?

Если ваш ответ несколько или даже 0, я надеюсь показать вам мощь, которую автоматизация может привнести в ваш процесс разработки. Используя инструмент с открытым исходным кодом под названием fastlane, я покажу вам, как вы можете сэкономить себе и своей команде часы времени разработки.

Почему стоит сосредоточиться на автоматизации?

Автоматизация рабочих процессов одинаково полезна как для независимых разработчиков, так и для небольших стартапов и крупных компаний. Вот несколько причин для автоматизации процесса разработки.

Экономия затрат

Мобильная разработка стоит дорого. По моему опыту, средняя почасовая стоимость iOS-разработчика составляет примерно 50–70 долларов. Для подрядчиков или фрилансеров это может легко стоить более 100 долларов в час. Автоматизируя задачи, вы избавляетесь от часов ручного рабочего процесса и позволяете разработчикам заниматься тем, что у них получается лучше всего: писать код.

Сократите количество утомительных задач

Разработчики гордятся своим кодом и результатами своих усилий. Они не гордятся управлением профилями обеспечения, сертификатами или ручным процессом выпуска специальной или производственной сборки. Такими утомительными задачами можно легко управлять и автоматизировать.

Повышение стабильности приложения

Стабильность приложения должна быть главной заботой разработчика и организации. Частота сбоев, покрытие модульными тестами и общая производительность приложения должны оцениваться в максимально возможной степени и на каждом этапе процессов разработки. Наличие автоматизированных задач, которые могут запускать правила линтинга, модульные тесты, тесты пользовательского интерфейса, тесты производительности и процессы сборки через регулярные промежутки времени, гарантирует, что ваш код будет развиваться с меньшим количеством проблем регрессии и более высокой степенью общей стабильности.

Привлекает будущие таланты

Великим разработчикам нужны отличные команды с отличными процессами. Чем надежнее ваши автоматизированные процессы, тем больше вероятность, что вы привлечете талантливых разработчиков.

Поставьте себя на место разработчика, подающего заявку на новую работу. Если компания заботится о качестве кода (модульные тесты и линтинг), фокусируется на покрытии кода (тестирование) и имеет сложный конвейер CICD (автоматизация), вы, скорее всего, будете в восторге от компании и должности.

Что такое фастлейн?

Слоган на сайте Fastlane говорит сам за себя:

Самый простой способ создавать и выпускать мобильные приложения.
fastlane справляется с утомительными задачами, поэтому вам не нужно.

Благодаря более чем 400 различным интеграциям вы действительно можете автоматизировать все утомительные задачи и сосредоточиться на разработке нового кода.

Fastlane — это инструмент с открытым исходным кодом, распространяемый по лицензии MIT. Это программный инструмент автоматизации, который можно запускать локально на вашем компьютере для разработки или удаленно на сервисе, таком как Bitrise, circleci или на сервере jenkins.

Следующие четыре задания помогут вам быстро настроить fastlane, а также позволят увидеть, какие возможности fastlane может обеспечить для вашего процесса разработки.

Шаг 1: Установка быстрой полосы

Установив инструмент CLI (интерфейс командной строки) с помощью пары простых команд в своем терминале, вы получите всю мощь всей автоматизации на кончиках ваших пальцев.

Я не из тех, кто повторяет чужие инструкции, поэтому вот ссылка для установки fastlane на ваш локальный компьютер: Начать.

По сути, откройте свой терминал, введите эти команды в окно и нажмите клавишу возврата. Если у вас возникнут проблемы с первыми несколькими шагами, напишите ниже, и я постараюсь синхронизироваться с вами и помочь.

После выполнения следующей команды: и выбора варианта ручной настройки:

fastlane init

Вам будет предложено несколько вариантов настройки. Я рекомендую процесс ручной настройки. Не беспокойтесь. Он по-прежнему автоматизирован. Просто нажимайте return, пока процесс установки не завершится. После этого вы должны увидеть в своем терминале много информации о настройке полосы быстрого доступа. Я хотел бы выделить следующее:

Generated Fastfile at path `./fastlane/Fastfile`
Generated Appfile at path `./fastlane/Appfile`
Gemfile and Gemfile.lock at path `Gemfile`
Please check the newly generated configuration files into git along with your project
This way everyone in your team can benefit from your fastlane setup

Вы увидите новый каталог fastlane в корне вашего проекта. Это содержит Fastfile и Appfile . Fastfile — это место, где вы будете кодировать всю свою автоматизацию. Вы можете думать о Appfile как о файле, который содержит важную информацию для использования в вашем `Fastfile`.

Теперь Fastlane установлен. Шаг 1 завершен!

Шаг 2: Создание первой дорожки

«Полосу» можно рассматривать как функцию, которая может выполнять один или несколько типов задач автоматизации. Дорожки могут даже вызывать другие дорожки, как функции.

Давайте начнем с создания простой задачи автоматизации тестирования. Эта задача запустит ваши модульные тесты и тесты пользовательского интерфейса.

Чтобы создать свою первую дорожку, откройте Fastfile в любом редакторе кода.

Примечание. Вы сразу заметите, что этот код написан не на Objective-C, Swift, Kotlin или Java. Вместо этого он написан на Ruby. Есть бета-версия написания yourFastfile с помощью Swift; однако, учитывая, что это все еще бета-версия, я еще не использовал ее.

Синтаксис Ruby отличается от синтаксиса Swift; тем не менее, вы должны быть в состоянии написать базовый файл Fastlane с очень небольшим пониманием Ruby. По мере того, как ваш Fastfile будет становиться все сложнее, изучение некоторых нюансов Ruby будет хорошей идеей.

Когда вы откроете свой Fastfile, вы увидите уже настроенный стандартный код. Идите вперед, скопируйте и вставьте выделенный жирным шрифтом код ниже в свой Fastfile между этими строками:

default_platform(:ios)
platform :ios do
    desc "Run Unit and UI Tests"
    lane :tests do
        scan()
    end
end

Что делает этот код, так это устанавливает полосу под названием tests, которая запускает действие полосы быстрого доступа scan в вашем проекте. Сканировать — это действие (автоматизированное задание), которое имеет множество возможностей настройки в зависимости от структуры вашего проекта, но если вы используете простой начальный проект, все, что вам нужно, это scan() . Вы увидите desc, описание, позволяющее кратко объяснить, что именно автоматизирует полоса. Лучше всего делать эти описания краткими, как вы сейчас увидите.

Все полосы следуют этой простой структуре.

desc "Custom Brief Description"
lane :lane_name do
    action(
      action_key : value
    )
    # Additional lane logic
end

Теперь пришло время запустить эту задачу автоматизации. Откройте свой терминал, убедитесь, что вы cd в корневой каталог вашего проекта, и введите fastlane . Это должно быть вашим результатом:

Вы можете видеть, что наша полоса tests доступна для запуска, а desc указан в таблице для понимания того, что делает эта lane. Введите 1 и позвольте fastlane управлять вашим tests.

Предполагая, что ваши тесты находятся в хорошем состоянии, вы должны увидеть много вывода консоли Fastlane с окончательным результатом:

На данный момент вы можете подумать, что тот же результат может быть достигнут одним нажатием кнопки внутри Xcode. Вы были бы правы, но вы упускаете суть.

Шаг 2 завершен! Давай продолжим.

Шаг 3. Добавление дополнительной автоматизации

Запуск тестов изолированно — хорошая практика, но что, если команда fastlane была запущена удаленным конвейером CICD? Что делать, если сборка не удалась из-за плохого модульного теста? По моему опыту, это должно вызвать некоторое предупреждение, чтобы убедиться, что модульные тесты исправлены, прежде чем объединять этот код обратно в базовую ветку.

В трех последних компаниях я использовал Slack в качестве инструмента общения между сотрудниками. Мы можем использовать этот инструмент, добавив в нашу полосу быстрого доступа еще одно действие slack, которое будет сообщать о наших тестах.

Во-первых, вам нужно разрешить Slack принимать веб-перехватчики из ваших автоматизированных задач. Эти веб-хуки дают вам авторизованный URL-адрес, который вы можете использовать в Fastlane для публикации непосредственно в вашем рабочем пространстве Slack. Чтобы настроить вебхук, перейдите на страницу Slack Incoming WebHooks Configuration, разрешите интеграцию и выберите канал в рабочей области Slack, где fastlane должен публиковать сообщения:

Выполнение этого шага даст вам URL-адрес веб-перехватчика, который вам понадобится при интеграции с Fastlane Slack.

Вернемся к вашему fastfile. Я хочу, чтобы вы обновили свою полосу tests следующим образом:

desc "Run Unit and UI Tests"
    lane :tests do
        begin
            scan()
            slack(
                message: "Tests Passed!", 
                success: true,
                slack_url: "https://hooks.slack.com/..."
            )
        rescue => exception
            slack(
                message: "<!here> Tests failed with exception : #{exception}",
                success: false,
                slack_url: "https://hooks.slack.com/..."
                )
        end
end

Приведенный выше код делает несколько вещей:

  1. begin определяет код, который вы хотите запустить и передать в процессе автоматизации (синтаксис языка Ruby для исключений здесь).
  2. rescue => exception фиксирует исключение/ошибку из предыдущего шага, если оно встречается в процессе автоматизации.
  3. slack() — это действие полосы быстрого доступа для взаимодействия с API веб-перехватчика приложения Slack.
  4. message , success и slack_url — это несколько параметров, которые вам нужно использовать для правильной публикации в slack.
  5. Вы можете видеть, что success это либо true, либо false. Это обеспечивает зеленый или красный цвет, который отображается в Slack, чтобы выделить сообщение как успешное или неудачное.

Примечание. <!here> — это синтаксис, который можно использовать в этом сценарии веб-перехватчика для репликации оповещения @here, используемого в Slack.

Теперь, когда все это подключено, запустите следующую команду в своем терминале, чтобы активировать полосу tests:

fastlane tests

Теперь вы должны увидеть, как модульные тесты проходят или не проходят в консоли, а также в вашем слабом канале:

Теперь у вас есть уведомления, сообщения и осведомленность о стабильности вашего модульного теста в рамках одной команды fastlane. Это намного мощнее, чем нажатие одной кнопки в Xcode для запуска ваших тестов :).

Шаг 3 завершен!

Шаг 4: Добавьте автоматизацию линтинга

Еще один инструмент, который я считаю очень полезным, — SwiftLint. Это инструмент для обеспечения соблюдения стиля и соглашений Swift в вашем приложении и вашей команде. Больше никаких споров о вкладках и пробелах. Swiftlint будет применять все, что определяет команда.

Как и в случае с интеграцией Slack, для настройки Swiftlint в вашем проекте необходимо выполнить несколько действий.

README.md репозитория Github содержит всю информацию, необходимую для настройки. Моя личная рекомендация — использовать brew (проверьте здесь). После установки SwiftLint убедитесь, что вы добавили Run Script на этапах сборки вашего проекта (проверьте это здесь). Чтобы добавить это, коснитесь + в левом верхнем углу вкладки Build Phases вашего проекта Xcode.

Вот скриншот этого последнего шага в разделе Build Phases в вашем проекте Xcode:

Чтобы убедиться, что вы все настроили правильно, запустите

swiftlint autocorrect

Это должно быстро обновить основные синтаксические ошибки вашего проекта, которые SwiftLint может исправить автоматически. Скорее всего, вы также увидите новые предупреждения в вашем AppDelegate относительно метода line_length. Если обе эти вещи происходят, значит, вы успешно настроили его.

Теперь мы хотим, чтобы fastlane запускал SwiftLint. Снова откройте файл Fastlane и добавьте следующий полужирный метод swiftlint() в начальный блок:

...
        begin
            swiftlint()
            scan()
            slack(...

Теперь снова запустите fastlane в своем терминале.

fastlane tests

И вы должны увидеть, что swiftlint теперь работает как часть вашего процесса автоматизации.

Этот шаг не позволяет вашим товарищам по команде загружать код, который не был должным образом проверен на наличие ошибок. При правильном линтинге вы получаете согласованность кода, создавая общее понимание среди команды относительно того, что приемлемо, а что нет.

Шаг 4 Готово!

Текущее состояние

Теперь у нас есть единый lane, который может анализировать ваш код, тестировать модуль и пользовательский интерфейс вашего кода и предоставлять вашей команде сообщения об успехах и неудачах. Мощь, которую это добавляет к вашему рабочему процессу, действительно реализуется, когда эту автоматизацию быстрой полосы можно запустить на сервере CICD, таком как Bitrise, Circleci или jenkins. Если вы правильно настроили CICD, у вас будет автоматизированный процесс, который можно запускать при каждом создании Push или PR. Это гарантирует, что ваш интегрированный код передает процессы, которые должны существовать для объединения вашего кода обратно в базовую ветвь.

Дополнительная автоматизация и советы и рекомендации

Количество шагов автоматизации, которые вы можете интегрировать в свой рабочий процесс, кажется бесконечным. Процессы и требования вашей команды будут определять, как вам настроить это, чтобы облегчить эти утомительные задачи и защитить стабильность вашего кода.

В Fastlane так много действий, которые вы можете использовать, но вот несколько действий, которые мне действительно нравятся:

  1. match()Match — это мощный инструмент, который действительно может значительно снизить нагрузку при работе с профилями и сертификатами. Он может автоматически управлять и устанавливать ваши сертификаты разработки, специальные и рабочие сертификаты. Если срок действия чего-либо истекает, он может автоматически обновить его при выполнении этой команды. С большой силой приходит и большая ответственность. Любой, кто имеет опыт разработки для iOS, знает, что сертификаты распространения очень важны, поэтому передача управления этими файлами в узкие места может быть слишком сложной задачей для некоторых организаций.
  2. gym()Gym — это широко используемое действие Fastlane, которое архивирует, подписывает и компилирует ваш развертываемый файл .ipa. Это в сочетании с match() действительно может уменьшить много потраченного времени на выпуск приложений.
  3. increment_build_number()Increment_build_number делает именно то, на что это похоже. Если вы добавлены в полосу, которая выпускает файл .ipa в App Store, вы можете быть уверены, что ваши номера сборки будут правильно увеличиваться и никогда не приведут к отклонению сборки из-за проблемы с отправкой номера сборки.
  4. appstore() — Действие App Store делает именно то, что вы ожидаете. Он использует файл .ipa, созданный из gym(), и публикует его в App Store. Какое огромное спасение жизни.
  5. sh() — Команды Shell очень полезны в автоматизации. Иногда у вас уже есть сценарии оболочки или команды CLI, которые запускают рабочие процессы, и эта команда позволит вам продолжать использовать эти другие инструменты.

Пара дополнительных моментов, на которые стоит обратить внимание:

  1. Переменные среды: у каждого процесса CICD есть переменные, которые могут меняться в зависимости от среды или могут храниться как константы в файле. В Fastlane вы можете определить переменные среды в любом месте кода, чтобы они были доступны на следующих шагах:
ENV["USER_EMAIL"] = "[email protected]"

После определения вы можете использовать ENV["USER_EMAIL"] для любого значения в ваших действиях или полосах быстрого доступа.

2. Если вы выпишите достаточно надежную полосу быстрого доступа, ваш CICD станет менее актуальным. Разделение задач (автоматизация и сервер CICD) и абстракция зависимостей (использование любой платформы CICD) действительно могут быть достигнуты. Люди в руководстве будут пускать слюни по этому поводу, если преподнести его правильно ;).

3. Fastfile — это просто Ruby, поэтому изучение синтаксиса Ruby, объявления переменных, потоков управления и функций может действительно помочь в организации этого файла. Этот пример был написан очень просто для целей руководства; однако вы можете легко организовать этот код в отдельные функции с параметрами, которые затем запускают определенные действия.

Последние мысли

Я немного не решался использовать fastlane, потому что это был неизвестный инструмент, ценность которого я не видел; однако, как только я начал автоматизировать проекты, я начал понимать, какие возможности это дает. Я настоятельно рекомендую вам глубже изучить этот инструмент и посмотреть, как он может помочь вашему проекту или организации. Также очень здорово, что он поддерживает и iOS, и Android. Многие из этих дорожек могут быть разделены между обеими платформами.

Мысли сообщества?

Как вы все использовали fastlane? Какая задача автоматизации была самой мощной, которую вы когда-либо видели?