29.8.23

Go в тулинг! Какие внутренние инструменты мы пишем на Go

Go в тулинг! Какие внутренние инструменты мы пишем на Go
No items found.

Любая динамично растущая компания со временем сталкивается с потребностью во внутренних инструментах, которые могут упростить и оптимизировать разработку. Так произошло и в Lamoda Tech. В какой-то момент мы решили, что пора автоматизировать рутинные действия и стандартизировать подход к разработке.

Так родилась идея создать тулинговую команду, которая возьмется за разработку внутреннего Go-инструментария. Это поможет нам сокращать time to market, оптимизировать разработку на Go, увеличивая надежность и устойчивость сервисов.

Главный заказчик у команды — внутренняя разработка Lamoda Tech. Поэтому все решения и идеи для реализации появляются после совместного обсуждения запросов со стороны разработки. 

Ниже расскажем об инструментах, которые уже внедрены внутри компании и приносят пользу нам, а один из них — и всему Go-сообществу.

Gonkey


Gonkey —  библиотека для проектов на Golang и консольная утилита (для проектов на любых языках и технологиях), с помощью которой можно проводить функциональное и регрессионное тестирование сервисов путем обращения к их API по заранее составленному сценарию. Сценарии тестов описываются в YAML-файлах.

У нас более ста микросервисов, каждый из которых решает свою задачу. Когда мы поняли, что сервисов становится много, а дальше их будет еще больше, то разработали внутренний документ, описывающий стандартный подход к проектированию API, и взяли как инструмент описания Swagger.

Стандартный подход к проектированию API закономерно навел на мысль о стандартном подходе к тестированию.

Мы хотели начать тестировать сервисы через API, потому что через него и реализуется почти вся функциональность сервиса, а также автоматизировать запуск тестов, чтобы встроить его в наш процесс CI/CD. 

Так появился Gonkey, который умеет: 

  1. Обстреливать ваш сервис HTTP-запросами и следить, чтобы его ответы соответствовали ожидаемым. Подготавливать базу данных к тесту, заполнив ее данными из фикстур (тоже задаются в YAML-файлах). 
  2. Имитировать ответы внешних сервисов с помощью моков (эта фича доступна, только если вы подключаете Gonkey как библиотеку).
  3. Выдавать результат тестирования в консоль или формировать 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. Мы планируем решить эту проблему с помощью системы плагинов для более гибкой настройки, которая будет отделена от основной логики.

Eщё про команду:
C PHP/Python на Go: как мы помогаем разработчикам (почти) безболезненно сменить стек
C PHP/Python на Go: как мы помогаем разработчикам (почти) безболезненно сменить стек
Команда Golang-разработчиков
This is some text inside of a div block.
This is some text inside of a div block.
This is some text inside of a div block.
Главное о команде Golang-разработчиков
Главное о команде Golang-разработчиков
Команда Golang-разработчиков
This is some text inside of a div block.
This is some text inside of a div block.
This is some text inside of a div block.
Чем живёт IT-комьюнити в Lamoda Tech
Чем живёт IT-комьюнити в Lamoda Tech
Команда Golang-разработчиков
This is some text inside of a div block.
This is some text inside of a div block.
This is some text inside of a div block.
Мысли кросс-функционально. Как мы прокачали скорость и гибкость разработки
Мысли кросс-функционально. Как мы прокачали скорость и гибкость разработки
Команда Golang-разработчиков
This is some text inside of a div block.
This is some text inside of a div block.
This is some text inside of a div block.
Почитать о других:
Чем живет команда Digital?
Чем живет команда Digital?
Команда Digital
This is some text inside of a div block.
This is some text inside of a div block.
This is some text inside of a div block.
Как мы придумали внутренний хакатон
Как мы придумали внутренний хакатон
Команда разработки внутрибанковского ПО
This is some text inside of a div block.
This is some text inside of a div block.
This is some text inside of a div block.
Как внешность влияет на трудоустройство: истории соискателей
Как внешность влияет на трудоустройство: истории соискателей
Core Team
This is some text inside of a div block.
This is some text inside of a div block.
This is some text inside of a div block.
Новый процесс тиражирования в 4 раза увеличил скорость поставки продуктового инкремента
Новый процесс тиражирования в 4 раза увеличил скорость поставки продуктового инкремента
Команда С#-разработчиков
This is some text inside of a div block.
This is some text inside of a div block.
This is some text inside of a div block.
Главное о команде
Главное о команде
Команда DevOps инженеров
This is some text inside of a div block.
This is some text inside of a div block.
This is some text inside of a div block.
Главное о команде
Главное о команде
Продуктовый менеджмент
This is some text inside of a div block.
This is some text inside of a div block.
This is some text inside of a div block.