Como automatizar seu processo com hooks do git

Como automatizar seu processo com hooks do git
AdsTerra, Junte-se ao AdsTerra

O Problema

Todos nós verificamos a formatação, testamos e deixamos nosso código organizado. Isso é algo que, em poucas palavras, facilita nossas vidas, torna as solicitações de pull mais legíveis e torna todo o código consistente em uma base de código. Normalmente, essas tarefas são executadas em algum tipo de pipeline de CI e, ocasionalmente, esquecemos de executá-las localmente antes de enviar as alterações. Como resultado, achamos que terminamos de escrever a funcionalidade, apenas para descobrir que nossa ação do GitHub falhou. Descobrimos que a verificação de código falhou ou que um teste que foi afetado agora está quebrado. Ou ainda, a formatação está inconsistente em um dos arquivos que editamos.

Bom saber

Este artigo pressupõe que você esteja familiarizado com o eslint, prettier e jest. Além disso, é necessário ter conhecimento em git.

A Solução

Existem três partes na nossa solução:

  • Configurar os comandos apropriados no package.json
  • Configurar o lint-staged (mais sobre isso depois)
  • Configurar o husky

Parte 1: Configurando os comandos apropriados

O package.json é onde todos os nossos comandos estão armazenados. Agora, como mencionado na introdução, frequentemente queremos executar a verificação de código, teste e formatação do nosso código antes de mesclá-lo na brach principal. Isso significa que precisamos ter pelo menos esses 3 comandos em nosso arquivo:

  • "lint": "eslint" executará a verificação de código para o nosso projeto e garantirá que não quebramos nenhuma regra.
  • "prettify": "prettier --write" executará o prettier em nosso projeto e garantirá que todos os arquivos estejam formatados corretamente. Consistência, consistência, consistência
  • "test:changed": "jest --onlyChanged" tentará identificar quais arquivos foram alterados e, com base nisso, quais testes são afetados (precisa do gráfico de dependência). Em seguida, executará esses testes.

Parte 2: Configurando o lint-staged

O lint-staged é uma ferramenta notável. Ele permite que você execute automaticamente scripts em um subconjunto dos arquivos que está prestes a confirma, aqui está um exemplo de arquivo .lintstagedrc:

{
    "*.+(ts|html)": [
      "eslint"
    ],
    "*.{js,ts,html,css,scss}": [
      "prettier --write"
    ],
    "*.spec.ts": [
      "jest --findRelatedTests"
    ]
}

Já que os comandos são bastante simples, eu pulei a parte de usar npm run. Aqui está uma breve explicação do que está acontecendo no arquivo:

Selecionamos todos os arquivos com extensão .ts ou .html e executamos o eslint neles. Selecionamos todos os arquivos com extensão .js, .ts, .html, .css ou .scss e executamos o prettier --write neles. Selecionamos todos os arquivos que terminam com .spec.ts e executamos o jest --findRelatedTests neles. Isso significa que executaremos todos os testes nesses arquivos. Mais sobre isso depois. Legal! Agora temos uma configuração adequada para o lint-staged. Estamos quase lá.

Parte 3 - Configurando o husky

Parte 3 - Configurando o husky Não, não é o cão. husky é uma ferramenta que permite executar comandos pré-commit e pré-push (entre outras coisas). Mais informações sobre o husky. Para nossa configuração, teremos 2 novos arquivos. O primeiro será o .husky/pre-commit. Ele terá apenas 1 linha:

npx lint-staged

Isso é tudo. Isso garantirá que toda vez que você tentar fazer um commit, este comando será executado, que por sua vez iniciará o processo de lint-staged que configuramos acima. Em detalhes, isso significa que antes de o comando de commit ser concluído, os comandos eslint, prettier --write e jest --findRelatedTests precisam passar.

Mas isso não é tudo, apenas para ter uma confiança extra, podemos configurar um hook pre-push. Fazemos isso criando um novo arquivo: .husky/pre-push. Este também é um comando de uma linha:

npm run test:changed

Isso garantirá que, quando você estiver tentando fazer push, todos os testes estejam saudáveis. Para fazer isso de maneira eficiente, ele usará o gráfico de dependência e tentará identificar todos os testes que precisam ser executados com base nos arquivos alterados.

Parte 4 - Esclarecimentos

Eu sei, eu sei, a etapa 4 não fazia parte do plano. Eu só queria ter certeza de que as coisas estavam um pouco mais claras.

Em primeiro lugar, você precisará instalar essas ferramentas. Você precisará executar:

npm install husky --save-dev

npm install --save-dev lint-staged

Apenas para esclarecer.

Para testes, você percebeu que temos 2 tipos: --findRelatedTests e --onlyChanged. Eu não fiz muita pesquisa sobre esses comandos, mas aqui está o que entendi.

  • --findRelatedTests precisa de uma lista de arquivos como argumento, não faz nenhuma análise estática e executa todos os testes nos arquivos passados. Isso é usado com o lint-staged para garantir que executemos todos os testes que foram alterados ou adicionados. Novamente, a única informação necessária para isso é: quais arquivos .spec.ts fazem parte do commit.
  • --onlyChanged precisa fazer uma análise estática do projeto. Ele usará essa informação, juntamente com a lista de arquivos que mudaram (todos os arquivos, não apenas os arquivos .spec.ts), para descobrir quais testes precisam ser executados novamente. Por exemplo, digamos que você tenha alterado o button.component.ts. Isso significa que você pode ter afetado os testes em button.component.spec.ts, mesmo que aquele arquivo não tenha mudado. Essa situação será detectada pelo comando --onlyChanged, mas será perdida pelo comando --findRelatedTests. Espero que isso esclareça as coisas um pouco.

AdsTerra, Junte-se ao AdsTerra