Atualmente, o IntelliJ IDEA possui o analisador estático de código Java mais avançado, superando de longe "veteranos" como e . Suas numerosas "inspecções" verificam o código em vários aspectos, desde o estilo de codificação até bugs característicos.
No entanto, enquanto os resultados da análise são exibidos apenas na interface local da IDE do desenvolvedor, eles têm pouca utilidade para o processo de desenvolvimento. A análise estática como o primeiro passo do pipeline de construção, seus resultados devem definir os quality gates, e a construção deve falhar se os quality gates não forem cumpridos. Sabe-se que o TeamCity CI está integrado ao IDEA. Mas mesmo que você não utilize o TeamCity, você pode tentar executar as inspecções do IDEA em qualquer outro servidor CI. Vamos ver como isso pode ser feito usando o IDEA Community Edition, Jenkins e o plugin Warnings NG.
Passo 1. Execute a análise em um contêiner e obtenha o relatório
Inicialmente, a ideia de executar uma IDE (aplicativo de desktop!) dentro de um sistema CI que não possui interface gráfica pode parecer duvidosa e bastante complicadora. Felizmente, os desenvolvedores do IDEA forneceram a possibilidade de executar e a partir da linha de comando. De fato, para executar o IDEA nesse modo, não é necessário um subsistema gráfico, e essas tarefas podem ser realizadas em servidores com shell de texto.
A execução das inspecções é feita por meio do script bin/inspect.sh diretório de instalação do IDEA. Como parâmetros, são necessários:
- o caminho completo do projeto (caminhos relativos não são suportados),
- o caminho para o arquivo .xml com as configurações das inspecções (geralmente localizado dentro do projeto em .idea/inspectionProfiles/Project_Default.xml),
- o caminho completo para a pasta onde os arquivos .xml com os relatórios de resultados da análise serão armazenados.
Além disso, espera-se que
- na IDE esteja configurado o caminho para o Java SDK, caso contrário, a análise não funcionará. Essas configurações estão contidas no arquivo de configuração
jdk.table.xmlna pasta de configuração global do IDEA. A própria configuração global do IDEA, por padrão, está localizada no diretório home do usuário, mas essa localização no arquivoidea.properties. - o projeto a ser analisado deve ser um projeto válido do IDEA, para isso, alguns arquivos que geralmente são ignorados terão que ser comitados ao controle de versão, a saber:
.idea/inspectionProfiles/Project_Default.xml— as configurações do analisador, que claramente serão usadas ao iniciar inspeções no contêiner,.idea/modules.xml— caso contrário, receberemos o erro ‘Este projeto não contém módulos’,.idea/misc.xml— caso contrário, receberemos o erro ‘O JDK não está configurado corretamente para este projeto’,*.iml-files— caso contrário, receberemos o erro sobre o JDK não configurado no módulo.
Embora geralmente esses arquivos incluam .gitignore, eles não contêm informações específicas do ambiente de um desenvolvedor específico — ao contrário, por exemplo, do arquivo workspace.xml, onde tal informação está, de fato, contida, e por isso não devemos comitá-lo.
A solução que se impõe é empacotar o JDK junto com o IDEA Community Edition no contêiner de forma pronta para ser ‘aplicada’ nos projetos analisados. Vamos escolher um contêiner base adequado, e aqui está como ficará nosso Dockerfile:
Dockerfile
FROM openkbs/ubuntu-bionic-jdk-mvn-py3
ARG INTELLIJ_VERSION="ideaIC-2019.1.1"
ARG INTELLIJ_IDE_TAR=${INTELLIJ_VERSION}.tar.gz
ENV IDEA_PROJECT_DIR="/var/project"
WORKDIR /opt
COPY jdk.table.xml /etc/idea/config/options/
RUN wget https://download-cf.jetbrains.com/idea/${INTELLIJ_IDE_TAR} &&
tar xzf ${INTELLIJ_IDE_TAR} &&
tar tzf ${INTELLIJ_IDE_TAR} | head -1 | sed -e 's//.*//' | xargs -I{} ln -s {} idea &&
rm ${INTELLIJ_IDE_TAR} &&
echo idea.config.path=/etc/idea/config >> idea/bin/idea.properties &&
chmod -R 777 /etc/idea
CMD idea/bin/inspect.sh ${IDEA_PROJECT_DIR} ${IDEA_PROJECT_DIR}/.idea/inspectionProfiles/Project_Default.xml ${IDEA_PROJECT_DIR}/target/idea_inspections -v2Com a opção idea.config.path fizemos com que o IDEA procurasse sua configuração global na pasta /etc/idea, pois a pasta inicial do usuário em um ambiente CI é uma coisa incerta e muitas vezes inexistente.
Aqui está o arquivo que é copiado para o contêiner, jdk.table.xml, no qual estão listados os caminhos para o OpenJDK, instalado dentro do contêiner (pode-se basear em um arquivo semelhante na sua própria diretório de configurações do IDEA):
jdk.table.xml
Imagem pronta .
Antes de prosseguir, vamos verificar a execução do analisador IDEA no contêiner:
docker run --rm -v :/var/project inponomarev/intellij-idea-analyzerA análise deve ser executada com sucesso e vários arquivos .xml com relatórios de análise devem surgir na pasta target/idea_inspections.
Agora não restam dúvidas de que o analisador IDEA pode ser executado offline em qualquer ambiente de CI, e passamos para o segundo passo.
Passo 2. Visualizando e analisando o relatório
Obter um relatório em formato .xml é apenas metade do trabalho, agora ele precisa ser torná-lo legível. Além disso, seus resultados devem ser utilizados em quality gates — a lógica de determinar se a alteração proposta atende aos critérios de qualidade.
Para isso, podemos contar com , cujo lançamento ocorreu em janeiro de 2019. Com a sua chegada, muitos plugins individuais para trabalhar com os resultados da análise estática no Jenkins (CheckStyle, FindBugs, PMD, etc.) agora estão marcados como obsoletos.
O plugin é composto por duas partes:
- múltiplos coletores de mensagens de analisadores ( inclui todos os analisadores conhecidos na ciência, de AcuCobol até ZPT Lint),
- um visualizador de relatórios unificado para todos eles.
Na lista do que o Warnings NG pode analisar, estão, entre outros, os avisos do compilador Java e os avisos dos logs de execução do Maven: embora estejam sempre à vista, raramente são analisados intencionalmente. Os relatórios do IntelliJ IDEA também fazem parte dos formatos reconhecidos.
Como o plugin é novo, ele interage bem desde o início com o Jenkins Pipeline. A etapa de construção que o envolve será apresentada da seguinte forma (apenas informamos ao plugin qual formato de relatório reconhecer e quais arquivos deve escanear):
stage ('Análise estática'){
sh 'rm -rf target/idea_inspections'
docker.image('inponomarev/intellij-idea-analyzer').inside {
sh '/opt/idea/bin/inspect.sh $WORKSPACE $WORKSPACE/.idea/inspectionProfiles/Project_Default.xml $WORKSPACE/target/idea_inspections -v2'
}
recordIssues(
tools: [ideaInspection(pattern: 'target/idea_inspections/*.xml')]
)
}A interface do relatório é assim:

É conveniente que essa interface seja universal para todos os analisadores reconhecidos. Ela contém um gráfico interativo de distribuição das descobertas por categoria e um gráfico da dinâmica da alteração no número de descobertas. Na grade na parte inferior da página, é possível realizar uma busca rápida. O único aspecto que não funcionou corretamente para as inspeções do IDEA foi a capacidade de navegar pelo código diretamente no Jenkins (embora para outros relatórios, como Checkstyle, este plugin consiga fazer isso adequadamente). Parece que é um bug do parser de relatórios do IDEA que precisa ser corrigido.
Entre as funcionalidades do Warnings NG está a possibilidade de aglomerar em um único relatório as descobertas de diferentes fontes e programar Quality Gates, incluindo um mecanismo de 'ratchet' com a compilação de referência. Uma certa documentação sobre a programação de Quality Gates está disponível. — no entanto, não está completo, e é necessário olhar os códigos-fonte. Por outro lado, para ter controle total sobre o que está acontecendo, o "contraponto" pode ser implementado de forma autônoma (veja meu sobre este tema).
Conclusão
Antes de começar a preparar este material, decidi procurar: alguém já escreveu sobre este assunto no Habr? Eu encontrei apenas com , onde ele diz:
Pelo que eu sei, não existe integração com Jenkins ou maven-plugin […] Na verdade, qualquer entusiasta poderia juntar o IDEA Community Edition e Jenkins, e muitos só teriam a ganhar com isso.
Então: após dois anos, temos o Warnings NG Plugin, e finalmente essa amizade se concretizou!
Fonte: habr.com
