Teste de qualidade do código code-quality-testing

Saiba como funciona o teste de qualidade do código dos pipelines e como ele pode melhorar a qualidade das suas implantações.

Introdução introduction

O teste de qualidade do código avalia o código do aplicativo com base em um conjunto de regras de qualidade. É o objetivo principal de um pipeline somente de qualidade do código e é executado imediatamente após a etapa de compilação em todos os pipelines de produção e não produção.

Consulte Configuração do pipeline de CI-CD para saber mais sobre os diferentes tipos de pipelines.

Regras de qualidade do código understanding-code-quality-rules

O teste de qualidade do código verifica o código-fonte para garantir que atenda a determinados critérios de qualidade. Uma combinação de SonarQube e exame em nível de pacote de conteúdo usando OakPAL implementa essa etapa. Há mais de 100 regras, que combinam regras do Java genéricas e regras específicas do AEM. Algumas regras específicas do AEM são baseadas nas práticas recomendadas pela Engenharia do AEM e são conhecidas como regras de qualidade do código personalizado.

Você pode baixar a lista completa atual de regras usando este link.

IMPORTANT
A partir de quinta-feira, 13 de fevereiro de 2025 (Cloud Manager 2025.2.0), a Qualidade do código Cloud Manager está usando uma versão atualizada do SonarQube 9.9 e uma lista atualizada de regras que você pode baixar aqui.

Classificações de três níveis three-tiered-gate

Os problemas identificados pelos testes de qualidade do código são atribuídos a uma de três categorias.

  • Crítico: problemas que causam uma falha imediata do pipeline.

  • Importante: problemas que causam a pausa do pipeline. Um gerente de implantação, gerente de projeto ou proprietário da empresa pode substituir os problemas, permitindo que o pipeline continue. Alternativamente, eles podem aceitar os problemas, interrompendo o pipeline com uma falha.

  • Informações - Problemas fornecidos exclusivamente para fins informativos e que não têm impacto na execução do pipeline

NOTE
Em um pipeline somente de qualidade do código, falhas importantes no portal de qualidade do código não podem ser substituídas, pois a etapa de teste de qualidade do código é a etapa final no pipeline.

Classificações ratings

Os resultados desta etapa são fornecidos como Classificações.

A tabela a seguir resume as classificações e os limites de falha para cada uma das categorias: crítico, importante e informativo.

Nome
Definição
Categoria
Limite de falha
Classificação de segurança
A = Sem vulnerabilidades
B = Pelo menos 1 vulnerabilidade baixa
C = Pelo menos 1 vulnerabilidade alta
D = Pelo menos 1 vulnerabilidade crítica
E = Pelo menos 1 vulnerabilidade limitante
Crítico
< B
Classificação de confiabilidade
A = Sem erros
B = Pelo menos 1 erro baixo
C = Pelo menos 1 erro alto
D = Pelo menos 1 erro crítico
E = Pelo menos 1 erro limitante
Crítico
< D
Classificação da capacidade de manutenção

Definido pelo custo de remediação pendente de code smells como uma porcentagem do tempo já dispendido no aplicativo

  • A = <=5%
  • B = 6-10%
  • C = 11-20%
  • D = 21-50%
  • E = >50%
Importante
< A
Abrangência

Definida por uma combinação de abrangências da linha de teste unitária e da condição utilizando a fórmula:
Coverage = (CT + CF + LC)/(2*B + EL)

  • CT = Condições que foram avaliadas como true pelo menos uma vez durante a execução dos testes da unidade
  • CF = Condições que foram avaliadas como false pelo menos uma vez durante a execução dos testes da unidade
  • LC = Linhas abrangidas = lines_to_cover - uncovered_lines
  • B = número total de condições
  • EL = número total de linhas executáveis (lines_to_cover)
Importante
< 50%
Testes de unidade ignorados
Número de testes de unidade ignorados
Informações
> 1
Problemas em aberto
Tipos de problemas gerais - Vulnerabilidades, Erros e Code Smells
Informações
> 0
Linhas duplicadas

Definido como o número de linhas envolvidas em blocos duplicados. Um bloco de código é considerado duplicado nas condições a seguir.
Projetos não Java:

  • Deve haver pelo menos 100 tokens sucessivos e duplicados.
  • Esses tokens devem estar distribuídos por pelo menos:
  • 30 linhas de código para COBOL
  • 20 linhas de código para ABAP
  • 10 linhas de código para outras linguagens

Projetos Java:

  • Deve haver pelo menos 10 declarações sucessivas e duplicadas, independentemente do número de tokens e linhas.

As diferenças no recuo, bem como nos literais de string são ignoradas ao detectar duplicadas.

Informações
> 1%
Compatibilidade do Cloud Service
Número de problemas de compatibilidade do Cloud Service identificados
Informações
> 0
NOTE
Consulte Definições das métricas do SonarQube para obter definições mais detalhadas.
NOTE
Para saber mais sobre as regras de qualidade do código personalizado executadas pelo Cloud Manager, consulte Regras de qualidade do código personalizado.

Como lidar com falsos positivos dealing-with-false-positives

O processo de verificação da qualidade não é perfeito e, por vezes, identifica incorretamente problemas que não são realmente problemas. Este estado é chamado de falso positivo.

Nesses casos, o código-fonte pode ser anotado com a anotação Java padrão @SuppressWarnings especificando a ID da regra como o atributo de anotação. Por exemplo, um falso positivo comum é que a regra do SonarQube para detectar senhas codificadas pode ser rígida quanto à forma como uma senha codificada é identificada.

O código a seguir é bastante comum em um projeto AEM, que tem código para se conectar a serviços externos.

@Property(label = "Service Password")
private static final String PROP_SERVICE_PASSWORD = "password";

O SonarQube gera uma vulnerabilidade de bloqueador. Porém, depois de revisar o código, é possível reconhecer que não se trata de uma vulnerabilidade e anotar o código com a ID de regra apropriada.

@SuppressWarnings("squid:S2068")
@Property(label = "Service Password")
private static final String PROP_SERVICE_PASSWORD = "password";

No entanto, se o código fosse este:

@Property(label = "Service Password", value = "mysecretpassword")
private static final String PROP_SERVICE_PASSWORD = "password";

Então, a solução correta seria remover a senha codificada.

NOTE
Embora seja recomendado fazer a anotação @SuppressWarnings a mais específica possível — como anotar apenas a instrução ou o bloco que causa o problema — também é possível anotar no nível da classe.
NOTE
Embora não haja uma etapa explícita de teste de segurança, há regras de qualidade do código relacionadas à segurança que são avaliadas durante a etapa de qualidade do código. Consulte a Visão geral de segurança para o AEM as a Cloud Service para saber mais sobre segurança no Cloud Service.

Otimização da verificação do pacote de conteúdo content-package-scanning-optimization

Como parte do processo de análise de qualidade, o Cloud Manager realiza a análise dos pacotes de conteúdo produzidos pela compilação Maven. O Cloud Manager oferece otimizações para acelerar esse processo, que é eficaz quando determinadas restrições de empacotamento são observadas. A otimização mais significativa tem como alvo projetos que produzem um único pacote "all", contendo vários pacotes de conteúdo da build, que são marcados como ignorados. Quando o Cloud Manager detecta esse cenário, em vez de descompactar o pacote “all”, os pacotes de conteúdo individuais são diretamente verificados e classificados com base nas dependências. Por exemplo, considere a saída de compilação a seguir.

  • all/myco-all-1.0.0-SNAPSHOT.zip (content-package)
  • ui.apps/myco-ui.apps-1.0.0-SNAPSHOT.zip (skipped-content-package)
  • ui.content/myco-ui.content-1.0.0-SNAPSHOT.zip (skipped-content-package)

Se os únicos itens dentro de myco-all-1.0.0-SNAPSHOT.zip são os dois pacotes de conteúdo ignorados, então os dois pacotes incorporados serão verificados no lugar do pacote de conteúdo “all”.

Para projetos que produzem dezenas de pacotes incorporados, essa otimização economiza mais de 10 minutos por execução de pipeline.

Um caso especial pode ocorrer quando o pacote de conteúdo “all” contiver uma combinação de pacotes de conteúdo ignorados e pacotes OSGi. Por exemplo, se myco-all-1.0.0-SNAPSHOT.zip continha os dois pacotes incorporados mencionados anteriormente, bem como um ou mais pacotes OSGi, então um novo pacote de conteúdo mínimo é construído apenas com os pacotes OSGi. Esse pacote é sempre nomeado cloudmanager-synthetic-jar-package e os pacotes contidos são colocados em /apps/cloudmanager-synthetic-installer/install.

NOTE
  • Essa otimização não afeta os pacotes implantados no AEM.
  • A correspondência entre pacotes de conteúdo incorporados e pacotes de conteúdo ignorados depende dos nomes de arquivo. Essa otimização não pode ocorrer se vários pacotes ignorados compartilharem o mesmo nome de arquivo ou se o nome do arquivo for alterado durante a incorporação.
recommendation-more-help
fbcff2a9-b6fe-4574-b04a-21e75df764ab