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

erir:2Ranym7c39K
Свойство не найдено: SIGN
Лаборатория
31 июля 2024 (00:54)
Свойство не найдено: SIGN
Лаборатория
31 июля 2024 (00:54)
Свойство не найдено: 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% продуктовых команд есть общий чат, а то и не один.

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

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


Выгода

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

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

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

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

А что еще?

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

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

Лаборатория
31 июля 2024 (00:54)
Вернуться назад
Поделиться >

Журналы

Новости

В раздел
УрГУПС и ГВЦ РЖД будут реализовывать совместные научные и образовательные инициативы
УрГУПС и ГВЦ РЖД будут реализовывать совместные научные и образовательные инициативы

Цель сотрудничества – повышение качества подготовки будущих специалистов.

05 июня 2026
Октябрьская железная дорога и Московская область выстроили цифровое взаимодействие
Октябрьская железная дорога и Московская область выстроили цифровое взаимодействие

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

29 мая 2026
Генеральным директором АО «Компания ТрансТелеКом» назначен Лери Губкин
Генеральным директором АО «Компания ТрансТелеКом» назначен Лери Губкин

Соответствующее решение принял совет директоров организации

29 мая 2026
К платформе «ПоДелам» подключился Национальный совет айкидо России
К платформе «ПоДелам» подключился Национальный совет айкидо России

Теперь его сотрудники смогут оформлять деловые поездки со смартфона

27 мая 2026

Важное

Умная станция
30 апреля 2026
«Экспресс» НП, что нового?
21 апреля 2026
Роботы против рутины
29 марта 2026