Git commits Linting с помощью commitlint и husky

Table of contents

Introduction

Обычно в проекте с системой контроля версий git определен порядок работ, это может быть git-flow или github-flow. Но не всегда у проекта определены правила написания коммитов. Существует стандарт по оформлению коммитов Conventional Commits. Для помощи в генерации коммита по указанному стандарту будем использовать утилиту commitizen, а также рассмотрим каким образом можно настроить проверку на соответствие коммита данному стандарту.

Для демонстрации работы линтирования был создан тестовый проект: https://github.com/superrosko/example-commits-lint.

Установка пакетов

Т.к. commitizen, husky и commitlint - это npm-пакеты, то мы должны инициализировать проект:

npm init

После того, как мы инициировали node-проект и заполнили информацию о нем, нам необходимо установить пакеты, которые мы будем использовать для помощи по коммитам и линтирования.

npm install -g commitizen
npm install @commitlint/cli cz-customizable husky --save-dev

commitizen - утилита командной строки commitizen

@commitlint/cli - утилита, которая проверяет на соответствие ваших сообщений в коммитах общепринятому формату фиксации

cz-customizable - настраиваемый плагин, помогающий добиться согласованных сообщений коммита

husky - git hooks

Настройка commitizen

Для настройки правил формирования коммитов создадим в корне проекта файл commitizen.js со следующим содержимым:

'use strict';

module.exports = {
  types: [
    {
      value: 'feat',
      name: 'feat:      A new feature',
    },
    {
      value: 'fix',
      name: 'fix:       A bug fix',
    },
  ],
  allowCustomScopes: true,
  allowBreakingChanges: false,
  footerPrefix: 'METADATA:',
  subjectLimit: 72,
};

Затем добавим конфигурацию в файл package.json:

{
  "config": {
    "commitizen": {
      "path": "node_modules/cz-customizable"
    },
    "cz-customizable": {
      "config": "./commitizen.js"
    }
  },
}

Для проверки работы утилиты выполним следующую команду:

git cz

На данном этапе настройка подсказок для формирования коммитов с помощью утилиты commitizen завершена.

Настройка husky и commitlint

Настроенные подсказки работают только при выполнении команды git cz, т.е. если мы выполним git commit, то нам будет доступно введение любого сообщения. Так не должно быть, поэтому с помощью husky мы установим хуки на создание коммитов и настроим линтирование.

Для настройки правил линтирования коммитов создадим в корне проекта файл commitlint.js со следующим содержимым:

module.exports = {
  rules: {
    'body-leading-blank': [2, 'always'],
    'footer-leading-blank': [2, 'always'],
    'header-max-length': [2, 'always', 72],
    'scope-case': [2, 'always', 'lower-case'],
    'subject-empty': [2, 'never'],
    'subject-full-stop': [2, 'never', '.'],
    'type-case': [2, 'always', 'lower-case'],
    'type-empty': [2, 'never'],
    'type-enum': [
      2,
      'always',
      [
        'feat',
        'fix',
      ],
    ],
  },
};

Затем добавим конфигурацию в файл package.json:

 "husky": {
    "hooks": {
      "commit-msg": "commitlint -E HUSKY_GIT_PARAMS -g './commitlint.js'"
    }
  }

На данном этапе настройка хуков для проверки соответствия коммита принятому стандарту завершена.

Запуск линтирования

Для проверки работы настроенных правил попробуем сделать изменения в файле ./src/example.txt и закоммитить их, введя сообщение коммита не по стандарту. Если все настроено правильно, то мы получим ошибку. И только в случае указания сообщения по стандарту коммит будет принят.

Настройка линтирования в PHPStorm

Для того, чтобы не пользоваться командой git cz, а вводить сообщения коммита в поля через PHPStorm, существует плагин Git Commit Template, который предоставляет визуальный интерфейс для создания коммитов по стандарту Conventional Commits.

Дата публикации :
Дата редактирования : 2020-11-12 00:33:56
Автор :

Cookies and IP addresses allow us to deliver and improve our web content, resolve technical errors, and provide you with a personalized experience. Our website uses cookies and collects your IP address for these purposes.