Go в тулинг! Какие внутренние инструменты мы пишем на Go
Любая динамично растущая компания со временем сталкивается с потребностью во внутренних инструментах, которые могут упростить и оптимизировать разработку. Так произошло и в Lamoda Tech. В какой-то момент мы решили, что пора автоматизировать рутинные действия и стандартизировать подход к разработке.
Так родилась идея создать тулинговую команду, которая возьмется за разработку внутреннего Go-инструментария. Это поможет нам сокращать time to market, оптимизировать разработку на Go, увеличивая надежность и устойчивость сервисов.
Главный заказчик у команды — внутренняя разработка Lamoda Tech. Поэтому все решения и идеи для реализации появляются после совместного обсуждения запросов со стороны разработки.
Ниже расскажем об инструментах, которые уже внедрены внутри компании и приносят пользу нам, а один из них — и всему Go-сообществу.
Gonkey
Gonkey — библиотека для проектов на Golang и консольная утилита (для проектов на любых языках и технологиях), с помощью которой можно проводить функциональное и регрессионное тестирование сервисов путем обращения к их API по заранее составленному сценарию. Сценарии тестов описываются в YAML-файлах.
У нас более ста микросервисов, каждый из которых решает свою задачу. Когда мы поняли, что сервисов становится много, а дальше их будет еще больше, то разработали внутренний документ, описывающий стандартный подход к проектированию API, и взяли как инструмент описания Swagger.
Стандартный подход к проектированию API закономерно навел на мысль о стандартном подходе к тестированию.
Мы хотели начать тестировать сервисы через API, потому что через него и реализуется почти вся функциональность сервиса, а также автоматизировать запуск тестов, чтобы встроить его в наш процесс CI/CD.
Так появился Gonkey, который умеет:
- Обстреливать ваш сервис HTTP-запросами и следить, чтобы его ответы соответствовали ожидаемым. Подготавливать базу данных к тесту, заполнив ее данными из фикстур (тоже задаются в YAML-файлах).
- Имитировать ответы внешних сервисов с помощью моков (эта фича доступна, только если вы подключаете Gonkey как библиотеку).
- Выдавать результат тестирования в консоль или формировать Allure-отчет.
Репозиторий проекта достутен на GitHub: https://github.com/lamoda/gonkey
В Gonkey постоянно прилетают новые пул-реквесты, так как инструмент нашел отклик у сообщества. Некоторые его фичи написаны уже силами комьюнити.
Molekula
Molekula — инструмент генерации кода для десериализации Aerospike.
Aerospike — это распределённая schema-less key-value база данных, которая работает по принципу хэш-таблицы. Основная её особенность — отсутствие схемы данных. По одному ключу в ней может храниться что угодно, в том числе мапы и списки произвольной вложенности. В итоге в коде много строк и ошибок.
Проблему можно было бы решить несколькими способами:
1. Писать весь бойлерплейт-код вручную, что не очень удобно;
2. Использовать рефлексию, встроенную в официальную библиотеку, но это довольно медленно;
3. Нагенерировать код для анмаршаллинга данных.
Мы решили пойти по третьему пути и написали Molekula, которая работает как easyjson. Описываем структуру данных, запускаем бинарный файл molekula и получаем код, который может анмаршаллить данные.
C помощью Molekula можно описать анмаршаллинг для любых встроенных типов и их комбинаций, а также задавать собственные алгоритмы анмаршаллинга для кастомных типов.
Scratch
Scratch — инструмент, который позволяет генерировать код для новых сервисов.
При создании новых сервисов чаще всего используют шаблонизацию, реже — копируют код вручную. При использовании второго способа часто возникают ошибки, а ещё это сложно и долго. Быстрее и приятнее ответить CLI-утилите на несколько вопросов о будущем проекте и получить на выходе готовый «скелет» сервиса. Остаётся только начать писать бизнес-логику.
Долгое время мы пользовались популярным инструментом для генерации проектов Cookiecutter. Это отличная утилита, достаточно простая и удобная, но нам хотелось иметь более широкие возможности, чем подставление переменных в шаблоны и запуск постген-хуков.
Мы хотели управлять сгенерированным кодом не только при создании нового проекта, но и при работе с ним: например, управлять его инфраструктурными зависимостями.
Мы используем API-first подход, так что без спецификации в формате OpenAPI воспользоваться Scratch не получится. Установив и запустив исполняемый файл, отвечаем на несколько вопросов, чтобы задать имя, добавить описание, указать, какие инструменты и базы данных будут использоваться, нужны ли клиенты для других сервисов.
Если все прошло успешно, Scratch подумает, при необходимости скачает спецификации сервисов для генерации клиентов к ним и сгенерирует скелет для нового проекта.
Пример полученной на выходе структуры файлов:
Инструмент получился удобным и полезным, в перспективе хочется поделиться им с сообществом. Основная сложность тут в том, что он заточен под инфраструктуру Lamoda. Мы планируем решить эту проблему с помощью системы плагинов для более гибкой настройки, которая будет отделена от основной логики.