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

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)
Вернуться назад
Поделиться >

Журналы

Новости

В раздел
РЖД вместе с партнерами создают востребованные цифровые решения
РЖД вместе с партнерами создают востребованные цифровые решения

В фокусе внимания – технологии искусственного интеллекта

21 апреля 2026
Представители Главного вычислительного центра РЖД приняли участие в Международной выставке ExpoElectronica
Представители Главного вычислительного центра РЖД приняли участие в Международной выставке ExpoElectronica

Эксперты обсудили подходы к выстраиванию сквозного процесса создания отечественного ИТ-оборудования

20 апреля 2026
В РЖД стартует новый сезон образовательного проекта «Знания.Экспресс»
В РЖД стартует новый сезон образовательного проекта «Знания.Экспресс»

Он предполагает несколько дистанционных форматов участия

20 апреля 2026
Олег Белозёров переназначен на пост главы РЖД
Олег Белозёров переназначен на пост главы РЖД

Соответствующее распоряжение подписал председатель правительства Михаил Мишустин

23 марта 2026

Важное

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