본문 바로가기

Programing/테스트

[sonarqube] 'sonar.jacoco.reportPath' is deprecated 메시지 없애기

sonarqube 태스크를 돌리면 아래와 같은 경고가 나온다.

Property 'sonar.jacoco.reportPath' is deprecated (JaCoCo binary format). 'sonar.coverage.jacoco.xmlReportPaths' should be used instead (JaCoCo XML format).
Property 'sonar.jacoco.reportPaths' is deprecated (JaCoCo binary format). 'sonar.coverage.jacoco.xmlReportPaths' should be used instead (JaCoCo XML format).

메시지만 나오면 그러려니 하는데 Sonarqube 페이지에서도 경고가 표시된다.

사용하는 데 큰 문제가 없지만, 이런 경고들이 쌓이다보면 진짜 필요한 메시지도 묻혀버리는 경험이 있어 이런 것을 냄새로 여긴다.

warning 메시지의 주체는?

예전에는 jacoco가 바이너리 파일을 만들어서 분석을 하게 했는데, 이제 xml 형식을 선호하는 것 같다.

sonarqube도 Version 7.9.2 (build 30863) 부터는 Jenkins를 통해서 분석할 때 아래와 같은 작업을 build.gradle에 넣어주고

jacocoTestReport {
    reports {
        xml.enabled true
    }
}

해당 task 실행을 해주는 구문을 jenkins 파일에 넣어주어야 커버리지가 제대로 표시되는 현상이 있었다.

analysisRepoPipeline {
    analysisJava sonar: sonar,
            script: 'bash gradlew clean test jacocoTestReport sonarqube'
}

sonar-java 프로젝트에서 DroppedPropertiesSensor 라는 클래스의 execute 메서드가 해당 프로퍼티가 있을 때 경고를 띄워준다.

public class DroppedPropertiesSensor implements Sensor {
  private static final String REPORT_PATHS_PROPERTY = "sonar.jacoco.reportPaths";
  private static final String REPORT_PATH_PROPERTY = "sonar.jacoco.reportPath";
  private static final String IT_REPORT_PATH_PROPERTY = "sonar.jacoco.itReportPath";
  private static final String REPORT_MISSING_FORCE_ZERO = "sonar.jacoco.reportMissing.force.zero";
  // ..
  @Override
  public void execute(SensorContext context) {
    REMOVED_PROPERTIES.forEach(prop -> {
      if (context.config().hasKey(prop)) {
        String msg = "Property '" + prop + "' is no longer supported. Use JaCoCo's xml report and sonar-jacoco plugin.";
        analysisWarnings.addUnique(msg);
        LOG.warn(msg);
      }
    });
  }

그렇다면 누가 프로퍼티를 넣어주고 있었나?

범인은 Sonarqube Scanner이다.

SonarPropertyComputer의 configureJaCoCoCoverageReport 메서드에 보면 아래와 같이 코드가 되어있다.

public class SonarPropertyComputer {
  // ..
  private static void configureJaCoCoCoverageReport(final Test testTask, final boolean addForGroovy, Project project, final Map<String, Object> properties) {
    project.getTasks().withType(JacocoReport.class, jacocoReportTask -> {
      SingleFileReport xmlReport = jacocoReportTask.getReports().getXml();
      if (xmlReport.isEnabled() && xmlReport.getDestination().exists()) {
        appendProp(properties, "sonar.coverage.jacoco.xmlReportPaths", xmlReport.getDestination());
      } else {
        LOGGER.info("JaCoCo report task detected, but XML report is not enabled or it was not produced. " +
          "Coverage for this task will not be reported.");
      }
    });
    // for backward compatibility we are also setting properties used by SonarJava's JaCoCo sensor
    project.getPlugins().withType(JacocoPlugin.class, jacocoPlugin -> {
      JacocoTaskExtension jacocoTaskExtension = testTask.getExtensions().getByType(JacocoTaskExtension.class);
      File destinationFile = jacocoTaskExtension.getDestinationFile();
      if (destinationFile.exists()) {
        properties.put("sonar.jacoco.reportPath", destinationFile);
        appendProp(properties, "sonar.jacoco.reportPaths", destinationFile);
        if (addForGroovy) {
          properties.put("sonar.groovy.jacoco.reportPath", destinationFile);
        }
      }
    });
  }

 

하위 호환성을 위해 넣어준다고 주석에 적혀있다.

for backward compatibility we are also setting properties used by SonarJava's JaCoCo sensor

결국 SonarScanner가 해당 프로퍼티를 넣어주는 것을 막아야 경고가 안 나온다는 것이다.

해결책은?

1. 수동적 방법: Sonarqube Scanner가 해당 프로퍼티를 넣어주는 것이 없어지면 자연스래 해결된다. 이것은 시간도 많이 걸리고 언제 될지 알 수 없다.

2. 적극적 방법: 해당 프로퍼티를 지워주면 경고가 나오지 않을 것이다. (아래 예)

sonarqube {
    properties {
        // deprecated된 프로퍼티는 경고가 나오기에 제거하였다.
        property "sonar.jacoco.reportPath", null
        property "sonar.jacoco.reportPaths", null
    }
}

2번 방법을 적용했고

아래와 같이 나오는 경고 창이

아래와 같이 없어졌다.

커버리지는 아래와 같이 바닥을 치고 올라왔다.