Como adicionar hooks aos commits de seu projeto utilizando Husky
Tags: husky, programming, git, testing
Published: 2023-12-07 17:11:39

*Foto por <a href="https://unsplash.com/@yapics?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash">Leon Seibert</a> em <a href="https://unsplash.com/photos/a-dog-tied-to-a-pole-on-a-city-street-HlSyNdj2goU?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash">Unsplash</a>*

## Glossário
* [Introdução](#chapter-1)
* [Setup do projeto](#chapter-2)
* [Primeiros comandos nos *hooks*](#chapter-3)
* [Criando um teste](#chapter-4)

### Introdução <a name="chapter-1"></a>

Em qualquer projeto de desenvolvimento de software, é importante que os *commits* sejam consistentes e atendam a padrões predefinidos. Isso ajuda a melhorar a legibilidade e a manutenção do código, além de facilitar a colaboração entre os desenvolvedores.

O Husky é uma ferramenta que permite adicionar *git hooks*  personalizados aos seus projetos. *Git hooks* são scripts que são executados antes ou depois de certas ações do sistema *git*, como fazer um *commit* ou enviar um *push*. As utilidades de Husky incluem *lint* de mensagens de *commit*, execução de testes, *lint* de código e muito mais.

Neste tutorial, ensinarei como fazer com que só seja possível realizar *commits* após passar nos testes.

### Setup do projeto <a name="chapter-2"</a>

Para começar, vamos precisar de um de um repositório com o pacote *npm* inicializado. Para isso, crie um repositório novo (`mkdir **NOME DO REPOSITÓRIO**` no Ubuntu), navegue para o  repositório criado no seu terminal (`cd **NOME DO REPOSITÓRIO**`) e então insira o comando `npm init -y` no terminal para inicializar o pacote *npm*.

> Caso não saiba o que é ou não tenha o Node instalado em sua máquina, acesse (aqui)[https://kinsta.com/pt/blog/como-instalar-o-node-js/] para ler um tutorial.

 Agora, vamos agora instalar o Husky como uma `devDependencies`. Para isso, utilizaremos o comando `npm install husky --save-dev`.

> Apenas um breve adendo: `devDependencies` são dependências necessárias durante o desenvolvimento da aplicação, mas não necessárias para seu código funcionar em produção. Um uso de caso bem comum para isso é quando você tem um servidor com baixo limite de armazenamento. Sua pasta *node_modules*, se for muito grande, pode não ser aceita com todas as dependências dela. Neste caso, para reduzirmos o espaço armazenamento necessário para nossa aplicação rodar no nosso servidor, instalamos alguns pacotes como `devDependencies` e, quando formos instalar as dependências para nossa aplicação rodar no servidor, utilizamos o comando: `npm install --production`, garantindo assim que as `devDependencies` não sejam instaladas também.

Em seguida, habilitaremos os *git hooks* com o comando `npx husky install`.

Para garantir que toda vez que seu projeto for instalado você tenha *git hooks* habilitados, utilize o comando `npm pkg set scripts.prepare="husky install"`. Este comando irá adicionar na propriedade "scripts" de seu package.json a seguinte linha: `"prepare": "husky install"`.

### Primeiros comandos nos *hooks* <a name="chapter-3"</a>

Agora, iremos adicionar comandos aos *hooks* de nossa aplicação. Digite os comandos abaixo em seu terminal. 

    npx husky add .husky/pre-commit "npm test"
    git add .husky/pre-commit

Feito isso, será criado um arquivo na pasta `.husky`  com o seguinte conteúdo:

    #!/usr/bin/env sh
    . "$(dirname -- "$0")/_/husky.sh"

    npm test

Não se esqueça de adicionar o script correto para o comando `npm test`. No caso deste tutorial, iremos utilizar o Jest, portanto, insira o seguinte comando no seu terminal, caso queira utilizar o Jest também `npm pkg set scripts.test="jest"`. Este comando adiciona nos scripts do package.json o comando "test".

Esse arquivo contém comandos para executar o *shell script* `husky.sh` para validar se o Husky está funcionando corretamente, e por fim, define que deverá ser executado o `npm test` para que o *commit* seja aceito. Caso falhe, o *commit* não irá funcionar e uma mensagem de erro será exibida.

> É possível "burlar" a verificação executada pelo *hook* com o seguinte comando: `git commit -m "*NOME DO SEU COMMIT AQUI*" --no-verify`. O `--no-verify` ou `-n` desabilitam a verificação do commit.

### Criando um teste <a name="chapter-4"></a>

Agora, vamos para a parte favorita de todo desenvolvedor: escrever testes.

Utilizarei Jest como ferramenta de teste neste exemplo, mas fique à vontade para escolher a que for mais adequada para suas necessidades.

Inicialmente, rodaremos o comando `npm install --save-dev jest` para instalar o Jest no seu projeto. 

Depois, criaremos um arquivo na raíz do projeto com o nome `sum.js`. Copie e cole o código abaixo nele:

    function sum(a, b) {
        return a + b;
      }
    module.exports = sum;

Agora criaremos o arquivo de testes dele `sum.test.js`
.

    const sum = require('./sum');

    test('adds 1 + 2 to equal 3', () => {
      expect(sum(1, 2)).toBe(3);
    });

Pronto. Agora é só tentar fazer um *commit*. Primeiro, vamos adicionar os arquivos na *index* do Git com o comando `git add .`. Depois vamos tentar escrever uma mensagem de *commit* utilizando `git commit -m '*SUA MENSAGEM AQUI*'`. Se tudo ocorrer bem, você deverá ver o teste do Jest rodando e por fim uma mensagem dizendo que os arquivos foram adicionados à *index* com sucesso.

Por fim, rode `git push` para enviar estes *commits* para sua plataforma de versionamento de preferência.

Caso queira saber mais sobre o Husky, acesse o repositório  oficial no github [aqui](https://github.com/typicode/husky) e a documentação oficial deles [aqui][https://typicode.github.io/husky/).