РЖД ГЕНЕРАЛЬНЫЙ ПАРТНЕР – ОАО «РЖД» Реклама
Рекламодатель: ОАО "РЖД"

erir:2Ranym7c39K

Как автоматизация поможет снять сливки с соглашения о коммитах

Как автоматизация поможет снять сливки с соглашения о коммитах
Свойство не найдено: SIGN

Руководитель отдела развития решений по управлению данными компании «Цифровые сервисы» (входит в цифровой холдинг «РЖД-Технологии») Сергей Валюшицкий о том, как меняет соглашение о коммитах отношение к коду и процессам поверх него


Как улучшить процесс обмена программным кодом? Как при работе с git оставлять понятные сообщения к коммитам и получать дополнительный эффект для процесса производства кода, а в сообщении рассказать о семантике изменений в коде: исправлении дефекта, новых функциях, влияниях на сборку и документацию?

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

Соглашение

Соглашение говорит о том, как писать сообщения к коммитам.

Минимальная структура сообщения такая:

<тип>: <описание>

Выглядит примерно так:

feat!: обязательное поле цвет глаз в форме

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


Типы

Мы в проекте используем такие типы:

  • feat: новая фича;
  • fix: исправление дефекта;
  • perf: изменение кода, повышающее производительность;
  • refactor: переработка кода, чтобы он стал более простым и понятным;
  • chore: прочие изменения в коде, обычно ничего такого, что увидел бы внешний
  • пользователь (изменения в .gitignore, вывод данных в консоль, версия релиза в манифесте и т. д.);
  • build: изменения, влияющие на систему сборки или внешние зависимости;
  • ci: изменения в файлах конфигурации CI и скриптах;
  • docs: изменения документации (README.md);
  • style: стилевые изменения кода (пробелы, форматирование, прочий линтинг);
  • test: добавление отсутствующих тестов или исправление существующих тестов.

Ошибок с выбором типа не избежать. Но рука набивается быстро.

  • feat: новая фича;
  • fix: исправление дефекта;

Автоматизация

Поверх типизированного графа коммитов можно придумать ряд автоматизаций.

И первое, что напрашивается – версионирование компонентов системы.

Версионирование

В мире материальных объектов все просто и чаще всего подойдет инкрементальное

версионирование (АйФон 12, 13, 14 ... 42).

В подсистемах и сервисах, работающих в интеграционной среде, чаще всего используют семантическое версионирование (СемВер), чтобы показать класс вносимых изменений.

Структура Cемвера такая:

vМАЖОР. МИНОР. ПАТЧ

Пример:

v9.4.12

Разберем каждый разряд слева направо.

МАЖОР

9 — в компоненте было девять ломающих совместимость изменений, мажоров.

Пример в физическом мире: у футболки зашиваем один рукав – руку через него уже не

просунуть.

МИНОР

4 — столько фич завезли в 9 мажорной версии.

Пример в физическом мире: к нашей футболке пришили карман.

ПАТЧ

12 — количество патчей (багов или прочих мелких дополнений, не влияющих на

исполняемую часть кода) после добавления последней фичи.

Пример в физическом мире: поставили заплатку на футболку.

При увеличении (бампе) разряда — обнуляем все разряды правее текущего.

Для нашего примера при выпуске мажора версия будет выглядеть так: v10.0.0

Версионирование на эмоджи:

v1.0.0 — исходное состояние.

v1.0.1 — пропатчили.

v1.1.0 — добавили фичу.

v2.0.0 — сломали обратную совместимость.

Мы автоматизировали выпуск версий по СемВер на основе сообщений к коммитам, выпущенным по Cоглашению.

Код попадает в главную ветку — выпускаем версию. 

Задачу выпуска у нас решает standard-version. Официально этот пакет в статусе deprecated, но работает, как часики.

Снижаем человеческий фактор

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

Мы используем commitlint.

Библиотеку необходимо запускать на хуке commit-msg (как это сделать – описано в документации пакета). Там она валидирует сообщение и, в случае неконвенциональности, в консоли сообщает об ошибках и не завершает коммит.

Исправляем ошибки — коммит готов!

Ченджлог

Второй соблазн по автоматизации после версионирования — формирование перечня изменений в приложении или компонентах — ченджлога.

Мы формируем ченджлог между двумя последними версиями компонента и сохраняем его в артефакты Гитлаба.

Инструменты для формирования лога в ассортименте, да и в конце концов можно самому написать простой шел-скрипт.

Но я, как сорока, подслушал в подкасте Радио-Т библиотеку git-cliff, принес «яркую монету» в проект — так с ней и живем.

Ключевые плюшки Клиффа:

  • шаблон для формирования ченджлога;

[changelog]

header = "Changelog"

body = """

{% for group, commits in commits | group_by(attribute="group") %}

### {{ group | upper_first }}

{% for commit in commits %}

- {{ commit.message | upper_first }}

{% endfor %}

{% endfor %}

"""

trim = true

footer = ""

postprocessors = [{ pattern = "foo", replace = "bar"}]

  • фильтрация неконвенциональных коммитов (надо выставить в конфиге
filter_unconventional = true) — если линтер не настроен, то может быть полезно.
  • типы позволяют сгруппировать изменения в секции: фичи будут перечислены с
фичами, баги с багами и так далее.

Уведомления

Уверен, что в 100% продуктовых команд есть общий чат, а то и не один.

Мы живем в мессенджере «Телеграм». Туда же помимо доставки на окружения компонентов отправляем ченджлог.

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


Выгода

Соглашение о коммитах однозначно добавит в ваши репозитории порядка, если раньше там царила анархия. 

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

Релизные процессы можно автоматизировать (выпуск версий, формирование лога изменений).  

Граф коммитов станет более понятным для участников процесса.

А что еще?

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

Спросите про «ягоду на десерте»? Пожалуйста: мы обобщаем изменения в версии приложения, но уже — для конечного пользователя. Для этого мы используем тулинг на основе больших языковых моделей.

Вернуться назад
Поделиться
Наверх
Вы подписаны!
Ошибка
email
Подписка на новости

РЖД цифровой

Нажимая на кнопку “Подписаться”, вы даете согласие на обработку персональных данных и соглашаетесь c политикой конфиденциальности