Artigo

Automatize a investigação de bugs com git bisect

Muitas vezes bugs acabam sendo introduzidos inadvertidamente em um projeto mesmo após passarem pelos testes unitários, eventualmente sendo descobertos somente...

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, 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ê.