Você vai sair desse artigo automatizando seu código com Git Hooks, além de saber o que é e para que serve esse componente do Git. Vamos nessa?
Primeiro, a plataforma do Git, amplamente utilizada por pessoas desenvolvedoras, é um ecossistema que permite o gerenciamento de projetos de forma simples e eficaz.
Por meio dessa plataforma, é possível compartilhar e colaborar de maneira direta e fácil, tanto com código quanto com documentação.
No artigo de hoje, vamos falar sobre como é possível automatizar o gerenciamento do código por meio do uso de Git Hooks, um componente presente no Git que auxilia na modificação de processos como push, commit, pull e outros comandos.
O projeto final pode ser encontrado no repositório presente no meu GitHub.
Análise de código
O Detekt é uma biblioteca que analisa o código na linguagem Kotlin. É possível verificar a indentação de código, identificar métodos longos, implementações incorretas, entre outras personalizações possíveis.
Como exemplo, será utilizada essa biblioteca para realizarmos a verificação do código automaticamente toda vez que algo for commitado, por meio da utilização do Git Hooks.
Implementando Detekt
Abra o projeto no Android Studio e acesse o arquivo build.gradle em nível de projeto. Em seguida, importe a biblioteca para as dependências:
classpath "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:lastversion"
Clique aqui para acessar a documentação oficial do Detekt com as versões disponíveis.
O que é Git Hooks?
O Git Hooks permite que regras sejam definidas em qualquer processo de versionamento de código, como commit, push e pull.
É possível automatizar a maioria das tarefas dentro do fluxo do Git Hooks. Nós podemos configurar para executar testes unitários ou verificar bibliotecas, por exemplo.
Nesse contexto, como o Detekt é uma biblioteca de análise de código, vamos executar no pre commit, ou seja, quando qualquer pessoa desenvolvedora fizer o comando git commit irá executar o Detekt.
Client-Side vs Server-Side
É importante entender a diferença desses dois lados, pois interfere em quais fluxos de trabalho vai fazer sentido ser alterado por você.
Processos que são executados no Client-Side, mesmo que seja modificado, se por acaso alguma outra pessoa desenvolvedora clonar o projeto, não são copiados.
Por outro lado, processos chamados no Server-Side, caso alterados, são impostos no projeto todo, sendo copiado quando outra pessoa clonar o repositório.
Fluxos de trabalho do Git
- Client-Side hooks
- pre-commit: executado antes de digitar a mensagem do commit.
- commit-msg: fluxo efetuado após a pessoa desenvolvedora digitar a mensagem do commit.
- prepare-commit-msg: processo que roda após o pre-commit.
- pre-push: cumprido antes do git push.
- pre-rebase: concretizado antes do merge.
- Server-Side hooks
- pre-commit: executado antes de digitar a mensagem do commit.
- pre-receive: tarefa realizada antes do git push.
- update: chamado após o pre-rebase.
Automatizando seu código com Git Hooks
Será necessário acessar o seu projeto através de um terminal de comando, aqui irei utilizar o git bash. Para acessar uma pasta, use o seguinte comando:
cd C:\Users\ada\AndroidStudioProjects\myproject
Iremos navegar até o arquivo hooks presente no nosso projeto:
cd C:\Users\ada\AndroidStudioProjects\myproject>cd .git/hooks
Resta agora criar o arquivo pre-commit:
cd C:\Users\ada\AndroidStudioProjects\myproject\.git\hooks>nano pre-commit
Feito isso, colocamos o trecho de código dentro da pasta pre-commit:
#!/usr/bin/env bash
# começando a executar a tarefa
echo "Running detekt check..."
OUTPUT="/tmp/detekt-$(date +%s)"
./gradlew detekt > $OUTPUT
EXIT_CODE=$?
# exibindo a mensagem de erro customizada caso o detect ache alguma # falha no código
if [ $EXIT_CODE -ne 0 ]; then
cat $OUTPUT
rm $OUTPUT
echo "*************************************************"
echo " detekt falhou "
echo " Por favor verifique os erros antes de committar "
echo "*************************************************"
exit $EXIT_CODE
fi
rm $OUTPUT
Por último, ativamos a nossa pasta, utilizando o comando:
cd C:\Users\ada\AndroidStudioProjects\myproject\.git\hooks>chmod +x pre-commit
Prontinho, agora o Git irá executar o Detekt e exibir um erro caso não passe nos parâmetros de aceite.
Um exemplo do que será exibido:
***************************************************
" detekt falhou "
" Por favor verifique os erros antes de committar "
***************************************************
Conclusão
O exemplo acima mostra a utilização da biblioteca Detekt, mas a imaginação é o limite! Você pode automatizar qualquer outra tarefa do projeto, aprimorando o seu projeto.
O uso do Git Hooks somado aos frameworks de CI/CD permite que você tenha controle de qualidade do seu código de uma forma muito simples e concreta, diminuindo as chances de erros na produção.
Inclusive, todo código-fonte estará no repositório presente no meu GitHub.
Caso queira aprofundar seus conhecimentos sobre automação de processos no seu código, indico os seguintes artigos:
- Git Hook – Atlassian
- Git Hooks: How to automate actions in your Git repo – Redhat
- Git Flow customizado no GitHub Actions – blog da Zup
Tem alguma dúvida sobre como automatizar seu código utilizando o Git Hooks? Deixe nos comentários ou fique à vontade para me mandar mensagem!