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

Deixe um comentário