Oi Thalysson, tudo blz?
Deixa eu dar uma complementada na resposta do Lucas trazendo uma forma de trabalho que a gente costuma ver por aí de vez em quando, e que vai de encontro à necessidade que você descreveu.
Considerando uma prática bastante usada no mercado, para você fazer a checagem de qualidade de código antes de enviar o código para o seu branch principal você precisa ajustar um pouco o seu fluxo de trabalho.
a) Na hora de desenvolver uma nova funcionalidade ou corrigir um bug, cada desenvolvedor trabalha no seu próprio branch e você define um padrão de nomenclatura como, por exemplo: */features/NOME_DA_FEATURE
ou */bugfix/DESCRICAO_DO_BUG
b) Daí você configura no seu arquivo de build (pom.xml, no caso do curso) as opções de análise estática que você deseja (findbugs, pmd e/ou checkstyle) e cobertura de testes (a gente tá usando o JaCoCo no curso).
Ainda sobre a análise estática, lembre-se de usar as configurações que falham o build em caso de não conformidade com algum critério, caso seja isso que você queira. O ideal, também, é sobreescrever/complementar as regras de cada ferramenta com as suas próprias regras.
c) Então você cria no Jenkins um job que vai fazer o quality enforcement em cima dos branches de features e bugfix. Nesse job você configura a seção SCM/GIT informando os branches conforme o padrão de nomenclatura que você definiu, no exemplo que eu dei ficaria assim: */features/*
e */bugfix/*
.
Plus 1: A gente costuma, também, configurar o Jenkins para notificar o repositório git se o build passou ou falhou - isso pode ser útil para bloquear o merge, por exemplo - mas essa configuração depende dos serviços que você está usando... no Github você consegue fazer tudo via plugins... no Gitlab eu já não sei como faz - sorry :(
d) Nesse mesmo job você configura o JaCoCo Plugin para checar a cobertura de testes conforme o threshold definido e falhar o build, se for o caso. JaCoCo Plugin
e) Com essa configuração feita, em todo push enviado para um branch de funcionalidade/bugfix o job de QE (quality enforcement) vai ser executado e você consegue saber (via notificações, preferencialmente) se algo está errado. Importante notar que, embora tenhamos um job só, ele executa em cima dos branches isoladamente.
f) Se tudo está ok e o trabalhado finalizado, o desenvolvedor está apto a fazer o merge para um branch de integração (que a gente costuma chamar de branch de desenvolvimento) - este branch é interessante porque nele você consegue checar se uma funcionalidade introduziu defeitos em outras.
Plus 2: Idealmente, esse merge só será feito após uma revisão de código via Pull Request.
Plus 3: Alguns times não gostam desse branch de integração e fazem o merge direto para o master, você vai ver isso referenciado como boa prática algumas vezes, mas eu, particularmente, não gosto.
Com isso, você tem um processo que garante que somente código-fonte dentro dos requisitos estabelecidos de qualidade vai passar adiante.
Desculpe a demora na resposta, Thalysson. Espero que chegue em tempo de ajudar.
Você conseguiu captar a ideia do fluxo que tentei passar acima? As configurações são bem específicas e dependem bastante dos fornecedores que você está usando, mas o mais importante é entender o fluxo. Se você precisar de ajuda com algum detalhe de configuração, posta aí que a gente te ajuda.
Grande abraço,
Romulo