DEV Community

Murilo Nascimento
Murilo Nascimento

Posted on

Simplificando e Padronizando Commits com Conventional Commits, Commitlint e Husky

Introdução

Em um mundo cada vez mais voltado para o desenvolvimento ágil de software, a eficiência e a colaboração são essenciais. Uma parte fundamental desse processo é a comunicação clara entre membros de uma equipe de desenvolvimento. E é aqui que entram os Conventional Commits (Commits Convencionais) e as ferramentas auxiliares, como o Commitlint e o Husky. Neste artigo, irei discorrer como essas práticas e ferramentas podem simplificar e padronizar o processo de commits, resultando em um fluxo de trabalho mais organizado e produtivo.

O que são Conventional Commits?

Os Conventional Commits são uma convenção simples para utilizar nas mensagens de commit. Ela define um conjunto de regras para criar um histórico de commit explícito, o que facilita a criação de ferramentas automatizadas baseadas na especificação. A ideia é que cada commit siga um formato predefinido, composto por um tipo, um escopo opcional e uma mensagem.

A mensagem do commit deve ser estruturada da seguinte forma:

<tipo>[escopo opcional]: <descrição>

[corpo opcional]

[rodapé(s) opcional(is)]
Enter fullscreen mode Exit fullscreen mode

Tipos de Commits Conventional

Os tipos de commits convencionais são a base da estruturação das mensagens de commit. Cada tipo representa a natureza das alterações feitas no código. Embora os tipos possam variar ligeiramente de projeto para projeto, aqui estão alguns tipos comuns:

  • build: Alterações que afetam o sistema de construção ou dependências externas ( escopos de exemplo: gole, brócolis, npm )
  • ci: Alterações nos arquivos e scripts de configuração do IC ( escopos de exemplo: Travis, Circle, BrowserStack, SauceLabs )
  • feat: Indica a adição de uma nova funcionalidade ao código. Isso pode envolver novos recursos, melhorias visíveis ou qualquer mudança que agregue valor ao projeto.
  • fix: Corrige um bug, problema ou erro no código existente. Geralmente, esse tipo de commit é usado para correções de funcionamento.
  • docs: Refere-se a alterações na documentação, como atualizações em arquivos README, documentação interna ou comentários no código.
  • style: Envolve alterações que não afetam o comportamento do código, mas sim a sua formatação. Isso pode incluir mudanças em espaçamento, formatação de código, indentação, etc.
  • refactor: Indica uma modificação no código que não corrige um bug nem adiciona uma nova funcionalidade, mas melhora sua estrutura interna ou legibilidade.
  • perf: Uma alteração de código que melhora o desempenho
  • test: Relaciona-se a alterações nos testes existentes ou à adição de novos testes para melhorar a cobertura ou a eficácia dos testes automatizados.
  • chore: Refere-se a tarefas de manutenção, ajustes no fluxo de trabalho, configurações ou outras tarefas que não afetam o código em si.

Exemplos

Mensagens de Commit sem Escopo

feat: Adicionar página de perfil do usuário
Enter fullscreen mode Exit fullscreen mode

Mensagem de Commit com Escopo

feat(lang): adiciona tradução para português brasileiro
Enter fullscreen mode Exit fullscreen mode

Mensagem de Commit com Corpo e Rodapé

fix: corrige pequenos erros de digitação no código

veja o ticket para detalhes sobre os erros de digitação corrigidos

Revisado por: Murilo Nascimento
Refs #007
Enter fullscreen mode Exit fullscreen mode

Commitlint: Enforce a Padronização de Commits

Mesmo entendendo o Conventional Commits nada garante que vamos respeitar as regras impostas, pois é possível que esqueçamos de seguir o padrão que foi definido. É aí que entra o commitlint. O Commitlint é uma ferramenta que ajuda a impor a convenção de commits em um projeto. Ele permite definir regras específicas para os tipos, escopos e mensagens dos commits. Ao integrar o Commitlint ele garante que todos os commits estejam em conformidade com a convenção definida.

Instalando o commitlint

# Instalando o commitlint com NPM
npm install --save-dev @commitlint/config-conventional @commitlint/cli

# Instalando o commitlint com Yarn
yarn add @commitlint/config-conventional @commitlint/cli -D

# Configuração do commitlint para utilizar o Conventional Commits
echo "module.exports = { extends: ['@commitlint/config-conventional'] };" > commitlint.config.cjs

Enter fullscreen mode Exit fullscreen mode

Caso esteja no Windows e o comando para configuração do commitlint der erro, crie um arquivo com o seguinte nome:

  • commitlint.config.cjs

E dentro dele adicione esse conteúdo:

  • module.exports = { extends: [ '@commitlint/config-conventional' ] }

Husky: Automação de Ações no Git Hooks

Integrar o Husky ao projeto permite automatizar a execução do Commitlint e outras ações nos chamados Git hooks, que são gatilhos para a execução de scripts em momentos específicos do ciclo de vida do Git, como pré-commit, commit-msg e outros.

Instalando o Husky

# Instalando o Husky com NPM
npm install husky --save-dev

# Instalando o Husky com Yarn
yarn add husky --dev

# Ativando os Hooks com NPM
npx husky install

# Ativando os Hooks com Yarn
yarn husky install

# Adicionando o Hook para disparar o commitlint com NPM
npx husky add .husky/commit-msg  'npx --no -- commitlint --edit ${1}'

# Adicionando o Hook para disparar o commitlint com Yarn
yarn husky add .husky/commit-msg 'yarn commitlint --edit $1'
Enter fullscreen mode Exit fullscreen mode

Testanto

$ git commit -m "Keep calm and commit"
⧗   input: Keep calm and commit
✖   subject may not be empty [subject-empty]
✖   type may not be empty [type-empty]

✖   found 2 problems, 0 warnings
ⓘ   Get help: https://github.com/conventional-changelog/commitlint/#what-is-commitlint

husky - commit-msg hook exited with code 1 (error)
Enter fullscreen mode Exit fullscreen mode

Os Conventional Commits, aliados ao Commitlint e ao Husky, oferecem uma abordagem sistemática para padronizar, simplificar e automatizar o processo de commits. Essa prática não apenas torna o histórico do Git mais claro e compreensível, mas também proporciona uma base sólida para automações futuras e uma colaboração mais eficiente entre os membros da equipe de desenvolvimento. Ao implementar essas práticas e ferramentas, os projetos podem desfrutar de um fluxo de trabalho mais organizado, produtivo e com menos erros relacionados a comunicação e padronização.

Top comments (0)