Code Review — Revisão de código pode ser automatizada!

Clayton K. N. Passos
codigorefinado
Published in
10 min readOct 14, 2018

É verdade, parte da revisão de código pode ser automatizada, e ser colocada no seu pipeline de entrega contínua, há uma legião de programadores que não sabem disto, e quando digo que nós estamos repetidamente falhando ao avaliar um código, que diversas falhas poderiam ser pegas de forma automática recebo aquelhe olhar dizendo… QUE MERDA ESSE CARA TA FALANDO? PQP!

Além de afirmar, vou mostrar algumas ferramentas que podem ser utilizadas no Github. A idéia não é entrar em detalhes, mas mostrar que há opções, e explicar oque cada uma destas opções fazem para você.

Tenho testado algumas destas ferramentas, no meu buscador de vagas, parapasa, se desejar você pode contribuir, o código é open-source (MIT), veja os Pull Request abertos automaticamente, o script de integração contínua, está tudo ai. https://netstart.github.io/parapasa/

Iniciantes podem pensar que estas verificações estáticas de código é algo novo, na realidade não. Acadêmicamente, há diversos textos propondo encontrar padrões de código conhecido a busca de conformidade, ou não confirmidade. A cerca de 5 anos eu mesmo escrevi um meio de encontrar padrões de bugs e formatação de código errada, em testes unitários em Java. Para isto, fiz um wrapper de ferramentas ainda mais antigas como PMD, Findbugs e Checkstyle.

Sua equipe compila, gera uma versão e roda os testes manualmente?

travis-ci

Ha várias ferramentas de integração continua, hoje venho mostrar uma que integra bem em projetos open-source, o Travis, utilizando-se de scripts podemos construir no nosso pipeline de entrega contínua, ou de integração contínua. Nele, configuro o construção da aplicação, execução de todos os testes automatizados, publicação da cobertura, verificação dos padrões, e até a publicação do projeto em ambiente de produção. A única coisa que você precisa fazer, é criar o script que ele faz tudo, sempre que você precisar.

No caso do meu projeto de busca de vagas, parapasa, parte do script é executado em todas as Pull Request, e sempre que é feito o Merge. O deploy em produção é executado apenas quando algum código entra na branch Master, se entra, e não quebrar o código da Master é publicado, caso ocorra algum erro, o script é interrompido assim como a sua publicação no ambiente.

Quando passa fica verdinho :D

Sua equipe verifica se o código está aderente a convenção?

Há diversas ferramentas para isto, e a boa prática nos direciona para executar estas ferramentas antes de enviar o codigo para o repositório remoto, mesmo antes de executar na ferramenta de integração continua a fim de antecipar a não aderência aos padrões da empresa. Algumas ferramentas que fazem isto para nós: ESLint, TSLint, Codelizer, Checkstyle, SonarQube.

Estas ferramentas, através de plugins podem ser integradas a sua IDE, e te avisar da não conformidade enquanto você digita o código.

Se for do seu interesse, você pode incluir o husky.js em seu projeto de software node.js, afim de incluir no hook do git verificações automáticas, em outras palavras, você pode fazer com que o git execute execute ações como executar o lint, compilar, executar teststes sempre que quando alguém fizer o push.

Se você não está desenvolvendo sobre o node.js, tudo bem o conceito é o mesmo para outros ecossistemas, você pode entender como os hooks do git funciona e escrever o script você mesmo. O Husk.js apenas facilita algumas coisas.

Todas as ferramentas que estou listando aqui, podem ser colocadas no seu pipeline de entrega contínua. De maneira que, ao olhar uma PR, você terá a avaliação destas ferramentas, e pode olhar no detalhe oque elas estão sinalizando.

https://github.com/marketplace/restyled-io

Com o auxilio de um .prettier.json ou .brittany.yaml ele promete abrir PR formatando o seu código, pra aderir ao padrão por você estipulado :D

https://github.com/marketplace/commit-message-lint

App para verificar e formatar a mensagem de commit das PRs. Dentro da pasta .github você cria o arquivo config.yml e configura como deve ser o padrão de messangens dos commits, algo como:

PR_TITLE_REGEX: /((?:[a-z][a-z]+))(\d{3})(:)([a-z0-9])/i
COMMIT_MESSAGE_REGEX: /(#)(#)((?:[a-z][a-z]+))(\d{3})(:)([a-z0-9])/i

Como você verifica a qualidade, padrões de bugs, utilização de código lento?

codefactor

Codefactor, Certifique-se de que seu código atenda aos padrões de qualidade. O CodeFactor.io integra-se perfeitamente ao GitHub, realiza instantaneamente o Code Review com cada GitHub Commit ou PR. Tempo de configuração zero. Receba feedback acionável em segundos para qualquer agência. Personalize regras e ignore problemas irrelevantes. Obtenha dicas de refatoração em todos os problemas.

codacy

Codacy, éuma ferramenta automatizada de análise / qualidade de código que ajuda os desenvolvedores a enviar um software melhor, mais rápido. Com Codacy, você obtém alterações de análise estática, complexidade ciclomática, duplicação e cobertura de teste de unidade de código em cada solicitação de confirmação e pull. Você pode usar o Codacy para impor seu padrão de qualidade de código, economizar tempo em revisões de código, aplicar melhor as práticas recomendadas de segurança e os desenvolvedores onboard mais rapidamente. Integre com seus repositórios GitHub para obter uma análise de qualidade de cada solicitação pull dentro do GitHub.

codebeat

Codebeat, Cansado de extrair manualmente seu código procurando os menores problemas? O codebeat é uma ferramenta automatizada de análise de código estático que suporta vários idiomas usados por desenvolvedores da Web e de dispositivos móveis em todo o mundo. Agora também fornece análise de estilo para projetos escritos em Swift. SwiftLint, um dos melhores linters para Swift em nosso aplicativo de revisão de código!

Você verifica se a cobertura de teste automatizado mudou?

coveralls

Seria melhor se no Pull Request já estivesse esta informação, dizendo se a cobertura diminuiu ou aumentou?

Além de oferecer esta informação no Pull Request, Coveralls também oferece relatórios do que foi coletado da execução dos seus testes automatizados, incluindo a cobertura por arquivo, quantidade de vezes que seu código foi atingido pelos testes, testes que falharam, entre outras informações.

Exemplo de relatório do Coveralls
codecov

O Codecov fornece ferramentas altamente integradas para agrupar, mesclar, arquivar e comparar relatórios de cobertura. Independentemente de sua equipe estar comparando as alterações em uma solicitação pull ou revisando uma única confirmação, o Codecov melhorará o fluxo de trabalho e a qualidade da revisão de código.

Você ou sua equipe verifica se uma imagem pode ser menor?

Este é um trabalho manual, que envolve abrir a imagem, e trabalhar nela em um editor de imagem a fim de buscar uma qualidade adequada ao mesmo tempo que diminuimos o tamanho do arquivo (não confunda com as dimensões), lembre-se que estamos falando do tamanho que ele ocupa em disco.

Esta é uma tarefa importante, além de ocupar menos espaço em disco, no seu git, e consumir menos banda de dados, diminuindo assim o custo com o seu provedor de nuvem (cloud provider). Apesar disto, é uma tarefa esquecida, e despresada por muitos, que pode ser feita de maneira automática.

imgbot

No marketplace você vai encontrar o ImgBot, que é uma ferramenta que após você dar permisão, irá analisar o seu repositório, e sempre que encontrar uma imagem, irá otimiza-la e abrir um PullRequest com a imagem alterarada. Assim, você só tem o trabalho de avaliar a PR e aprovar.

Você verifica se é possível atualizar alguma dependência do seu projeto manualmente?

dependabot

Dependabot, é uma ferramenta que visa manter as dependências atualizadas, ele analisa seu projeto, verifica se há uma versão mais nova, ou insegura e abre um Pull Request para você. É uma boa prática, ter sem seu projeto alguma ferramenta de integração continua construindo e executando os testes automatizados também nas Pull Requests, assim, você verá se a atualização irá quebrar algo, antes de baixar a PR e averiguar manualmente.

O dependabot é capaz de abrir o PR pra você, e justificar que esta PR resolve um problema de Segurança.

Sua equipe verifica se há alguma dependência do projeto com falhas de segurança?

snyk

Snyk está em uma missão para ajudar os desenvolvedores a usar o código aberto e manter a segurança. O Snyk ajuda a encontrar, corrigir (e prevenir!) Vulnerabilidades conhecidas em seus aplicativos Node.js, Java, Ruby, Python e Scala. Snyk é gratuito para código aberto. O Snyk rastreia vulnerabilidades em mais de 800.000 pacotes de código aberto e ajuda a proteger mais de 25.000 aplicativos. 83% dos usuários do Snyk encontraram vulnerabilidades em seus aplicativos, e novas vulnerabilidades são divulgadas regularmente, colocando seu aplicativo em risco.

Possivelmente você pode receber um e-mail, avisando que seu projeto está vulnerável, e disponibilizando a possibilidade de abrir uma PR para corrigir, como na imagem abaixo.

e-mail avisando do MitM
https://github.com/marketplace/sonatype-depshield

Sonatype DepShield — é capaz de identificar e criar uma issue para resolve problemas de segurança em seu código ou dependências

https://github.com/marketplace/lgtm

Identifica vulnerabilidades com base no repositório compartilhado da Semmle

SecretScan — Varre o projeto por AWS Tokens, keys

https://github.com/apps/lock

Que tal um bot que fecha issues automaticamente após um tempo sem interação sobre nela?
https://github.com/marketplace/stale

Revisão de arquitetura

Confia, você também pode fazer code review a nível de arquitetura de forma automatizada, mas até o momento não encontrei ferramentas focadas neste propósito no github, enquanto isto começe dando uma olhada no archunit e no sonarqube.

dependency-cruiser — Este não testei, mas ele promete fazer verificações sobre regras da sua arquitetura, algo como, um pacote não pode chamar outro, com isto você pode criar uma arquitetura em camadas, e evitar que elas sejam infringidas como se faz no archunit.

Da pra usar inteligência artificial?

Ainda não testei, mas veja o https://www.deepcode.ai/

Conclusão

Todas estas ferramentas que apresentei, podem ser utilizadas individualmente, ao incluir muitas delas, você pode deixar a entrega mais lenta, porém, aumentará a confiabilidade de suas entregas.

Escolha as ferramentas que se adequam ao seu contexto, deixe elas trabalhar para você, eles irão te dar insumo para identificar código que pode ser melhorado, melhorando a entrega de forma consistente, automatizada, deixando o programador com mais tempo para se preocupar com código de negócio.

Gosto da idéia de ter mais de uma ferramenta de mesmo propósto em meus projetos, cada uma mostra a informação de maneira diferente, logo, isto tende a promover melhor entendimento doque elas estão apontando, tornando a decisão de aceitar ou recusar um Pull Request mais acertivo.

Caso alguma destas ferramentas falhe no seu pipeline, você ainda tem a opção de aprovar a Pull Request manualmente caso deseje, elas não irão te impedir, elas apenas irão apontar possíveis problemas.

Turbot

Permite varrer contas AWS em busca de oportunidades de melhoria, configurações erradas, recursos não utilizados, etc.

https://turbot.com/

Outros que você pode se interessar

https://github.com/marketplace/wip
https://github.com/marketplace/gitkraken-glo-boards
https://github.com/marketplace/teamlytics

--

--