Uso do SpotBugs Plugin no SonarQube

O SpotBugs SonarQube Plugin usa os principais plugins do SpotBugs, como fb-contrib and Find Security Bugs. No entanto, se quiser usar outro plugin, você precisa criar seu próprio plugin SonarQube. Para obter os requisitos detalhados dos plugins do SonarQube, consulte as diretrizes oficiais do SonarQube.

Criação do projeto Maven

Siga as diretrizes oficiais do SonarQube. Recomenda-se o uso de submódulos para gerenciar o SpotBugs plugin e o SonarQube plugin em um projeto. Consulte esse módulo como exemplo.

Você também precisa configurar o sonar-packaging-maven-plugin para que seu plugin dependa do SpotBugs SonarQube Plugin. Por exemplo, se você estiver usando o SonarQube 6.7 LTS, seu plugin requer o SpotBugs SonarQube Plugin na versão 3.7. Sua configuração deve ser:

<configuration>
  <basePlugin>findbugs</basePlugin>
  <requirePlugins>findbugs:3.7</requirePlugins>
  ...
</configuration>

Geração do arquivo rules.xml

o SonarQube não entende os metadados de Bug Pattern fornecidos pelo SpotBugs. Dessa forma, é necessário converter findbugs.xml e messages.xml para o formato do sonarQube nomeado como rules.xml.

Se seu SpotBugs plugin não é complexo, você pode utilizar o SonarQube rule xml generator Maven Plugin para gerar o arquivo rules.xml. Siga as instruções descritas no README.

Atualização da classe RulesDefinition.java

Seu SonarQubeRulesDefinition.java deve carregar o arquivo rules.xml para o repositório do FindBugs.

Ao criar uma nova instância NewRepository, use FindbugsRulesDefinition.REPOSITORY_KEY como chave do repositório, e não a renomeia com o nome NewRepository#setName(String). Isso é necessário para satisfazer o requisito da SonarQube API. Por exemplo:

@Override
public void define(Context context) {
  NewRepository repository =
      context.createRepository(FindbugsRulesDefinition.REPOSITORY_KEY, Java.KEY);

  RulesDefinitionXmlLoader ruleLoader = new RulesDefinitionXmlLoader();
  ruleLoader.load(
      repository,
      getClass().getResourceAsStream(
          "/path/to/rules.xml"),
      "UTF-8");
  repository.done();
}

Atualização da classe Plugin.java

A classe Plugin.java deve ser uma implementação simples que apenas carrega a classe``RulesDefinition``. Por exemplo:

@Override
public void define(Context context) {
  context.addExtensions(Arrays.asList(SonarQubeRulesDefinition.class));
}

Deploy no SonarQube

O comando mvn package gera um arquivo .jar que funciona como um SonarQube plugin. Siga as diretrizes oficiais do SonarQube para implantação no SonarQube.

Observe que você precisa habilitar as regras manualmente no seu perfil do SonarQube ou as novas regras adicionadas não serão utilizadas na análise.