Muitas vezes bugs acabam sendo introduzidos inadvertidamente em um projeto mesmo após passarem pelos testes unitários, eventualmente sendo descobertos somente após a execução de testes de integração, performance ou e2e na CI.
Nem sempre é fácil encontrar qual foi o commit causador do problema, dependendo do volume de alterações do projeto, práticas internas de engenharia de software e do número de desenvolvedores trabalhando no código.
Felizmente o git tem uma ferramenta bastante prática para automatizar o processo de encontrar o commit problemático: git bisect
.
O git bisect
é uma funcionalidade do git que usa um algoritmo de busca binária para “navegar” pelo histórico de commits do projeto e encontrar qual o commit problemático (não sabe o que é busca binária? Aprenda aqui).
Para isso o git bisect
precisa de duas informações: um commit “ruim” (o hash do commit onde o problema ocorre) e um commit “bom” (o hash do commit onde o problema não ocorre). Tendo essas informações em mãos você pode rodar: git bisect start "ruim" "bom"
e ele vai fazer o checkout dos commits para você.
Aí, basta você executar os comandos para compilar e testar a aplicação (por exemplo: “mvn clean verify
“). Se o teste passar, você deve marcar o commit como bom (git bisect good
). Caso ele falhe, você deve marcar o commit como ruim (git bisect bad
). Após rodar um desses dois comandos para marcar o commit como bom ou ruim, ele vai prosseguir para o próximo commit no histórico.
Você deve repetir o processo até que ele termine de navegar pela lista de commits e lhe mostre qual foi o primeiro commit problemático que introduziu o problema.
Mas peraí, eu falei que o lance era automatizar a investigação de bugs, e esse processo parece muito manual né? É aí que entra o git bisect run
. Essa funcionalidade permite que você forneça um script que teste o projeto. O script tem um requisito básico: o script deve retornar 0 para marcar um commit como bom, e um valor entre 1 e 127 para marcar um commit como ruim.
Por exemplo, suponha que você precise usar o docker-compose para subir a infra de testes, então rodar o build e os testes, e depois de executado encerrar a execução dessa infraestrutura. Para isso, você usaria um script parecido com esse aqui.
E, então, basta rodar o script usando o seguinte comando: git bisect run meu-script-de-testes.sh
.
cf63ab12cbe3cfa598fcb83e6447c3c39718b3a4 is the first bad commit
commit cf63ab12cbe3cfa598fcb83e6447c3c39718b3a4
Author: Otavio R. Piske some-email@domain.com
Date: Wed Jun 28 09:05:14 2022 +0300
Added support for whatever in module foo.
Dependendo de quão grande é seu projeto, esse processo pode demorar um pouco. Então, agora basta sair para tomar um café, ler as notícias do dia ou fazer uma thread legal no Twitter, enquanto o git bisect procura o commit problemático para você.