Executando inspeções do IntelliJ IDEA no Jenkins

Atualmente, o IntelliJ IDEA possui o analisador estático de código Java mais avançado, superando de longe "veteranos" como Checkstyle e Spotbugs. 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 deve ser realizada 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 formatação de código e inspecções 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.xml na 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 pode ser explicitamente especificada no arquivo idea.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 -v2

Com 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 disponível no Docker Hub.

Antes de prosseguir, vamos verificar a execução do analisador IDEA no contêiner:

docker run --rm -v :/var/project inponomarev/intellij-idea-analyzer

A 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 o Jenkins Warnings NG Plugin, 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 (lista completa 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:

Executando inspeções do IntelliJ IDEA no Jenkins

É 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. aqui — 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 post anterior 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 uma entrevista de 2017 com lany, 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

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster