From 9bf1cbe423065e4074109aff210a63a65809e479 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9da=20Housni=20Alaoui?= Date: Tue, 4 Jun 2024 15:12:06 +0200 Subject: [PATCH] Support analysis property `sonar.ws.timeout` --- ...tallationAdditionalAnalysisProperties.java | 56 +++++++++++++++++++ .../PullRequestAnalysisTask.java | 18 ++++-- ...ationAdditionalAnalysisPropertiesTest.java | 48 ++++++++++++++++ .../jenkins/SonarqubeConfiguration.java | 3 +- 4 files changed, 120 insertions(+), 5 deletions(-) create mode 100644 src/main/java/org/jenkinsci/plugins/sonargerrit/sonar/SonarInstallationAdditionalAnalysisProperties.java create mode 100644 src/test/java/org/jenkinsci/plugins/sonargerrit/sonar/SonarInstallationAdditionalAnalysisPropertiesTest.java diff --git a/src/main/java/org/jenkinsci/plugins/sonargerrit/sonar/SonarInstallationAdditionalAnalysisProperties.java b/src/main/java/org/jenkinsci/plugins/sonargerrit/sonar/SonarInstallationAdditionalAnalysisProperties.java new file mode 100644 index 00000000..22c9eb46 --- /dev/null +++ b/src/main/java/org/jenkinsci/plugins/sonargerrit/sonar/SonarInstallationAdditionalAnalysisProperties.java @@ -0,0 +1,56 @@ +package org.jenkinsci.plugins.sonargerrit.sonar; + +import hudson.plugins.sonar.SonarInstallation; +import java.time.Duration; +import java.time.temporal.TemporalUnit; +import java.util.Collections; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.apache.commons.lang3.StringUtils; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; + +/** @author Réda Housni Alaoui */ +@Restricted(NoExternalUse.class) +public class SonarInstallationAdditionalAnalysisProperties { + + private final Map properties; + + private SonarInstallationAdditionalAnalysisProperties(SonarInstallation sonarInstallation) { + String additionalAnalysisProperties = sonarInstallation.getAdditionalAnalysisProperties(); + if (additionalAnalysisProperties == null) { + properties = Collections.emptyMap(); + return; + } + + properties = + Stream.of(StringUtils.split(additionalAnalysisProperties)) + .map(property -> StringUtils.split(property, "=")) + .filter(keyValue -> keyValue.length == 2) + .collect( + Collectors.toMap( + keyValue -> keyValue[0], + keyValue -> keyValue[1], + (firstValue, secondValue) -> secondValue)); + } + + public static SonarInstallationAdditionalAnalysisProperties parse( + SonarInstallation sonarInstallation) { + return new SonarInstallationAdditionalAnalysisProperties(sonarInstallation); + } + + public Optional getDuration(String key, TemporalUnit temporalUnit) { + return Optional.ofNullable(properties.get(key)) + .map( + stringValue -> { + try { + return Long.parseLong(stringValue); + } catch (NumberFormatException e) { + return null; + } + }) + .map(longValue -> Duration.of(longValue, temporalUnit)); + } +} diff --git a/src/main/java/org/jenkinsci/plugins/sonargerrit/sonar/pull_request_analysis/PullRequestAnalysisTask.java b/src/main/java/org/jenkinsci/plugins/sonargerrit/sonar/pull_request_analysis/PullRequestAnalysisTask.java index 86c342fc..b8f1d3b5 100644 --- a/src/main/java/org/jenkinsci/plugins/sonargerrit/sonar/pull_request_analysis/PullRequestAnalysisTask.java +++ b/src/main/java/org/jenkinsci/plugins/sonargerrit/sonar/pull_request_analysis/PullRequestAnalysisTask.java @@ -8,6 +8,7 @@ import hudson.plugins.sonar.action.SonarAnalysisAction; import hudson.plugins.sonar.utils.SonarUtils; import java.time.Duration; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -27,6 +28,7 @@ import org.jenkinsci.plugins.sonargerrit.TaskListenerLogger; import org.jenkinsci.plugins.sonargerrit.sonar.Components; import org.jenkinsci.plugins.sonargerrit.sonar.Issue; +import org.jenkinsci.plugins.sonargerrit.sonar.SonarInstallationAdditionalAnalysisProperties; /** @author Réda Housni Alaoui */ class PullRequestAnalysisTask { @@ -95,10 +97,18 @@ private static Optional tryCreate( SonarUtils.getAuthenticationToken( run, sonarInstallation, sonarInstallation.getCredentialsId()); - WsClient sonarClient = - WsClientFactories.getDefault() - .newClient( - HttpConnector.newBuilder().url(serverUrl).token(authenticationToken).build()); + HttpConnector.Builder httpConnectorBuilder = + HttpConnector.newBuilder().url(serverUrl).token(authenticationToken); + + httpConnectorBuilder = + SonarInstallationAdditionalAnalysisProperties.parse(sonarInstallation) + .getDuration("sonar.ws.timeout", ChronoUnit.SECONDS) + .map(Duration::toMillis) + .map(Long::intValue) + .map(httpConnectorBuilder::readTimeoutMilliseconds) + .orElse(httpConnectorBuilder); + + WsClient sonarClient = WsClientFactories.getDefault().newClient(httpConnectorBuilder.build()); Ce.Task ceTask = sonarClient.ce().task(new TaskRequest().setId(ceTaskId)).getTask(); String componentKey = ceTask.getComponentKey(); diff --git a/src/test/java/org/jenkinsci/plugins/sonargerrit/sonar/SonarInstallationAdditionalAnalysisPropertiesTest.java b/src/test/java/org/jenkinsci/plugins/sonargerrit/sonar/SonarInstallationAdditionalAnalysisPropertiesTest.java new file mode 100644 index 00000000..a69a0b3a --- /dev/null +++ b/src/test/java/org/jenkinsci/plugins/sonargerrit/sonar/SonarInstallationAdditionalAnalysisPropertiesTest.java @@ -0,0 +1,48 @@ +package org.jenkinsci.plugins.sonargerrit.sonar; + +import static org.assertj.core.api.Assertions.assertThat; + +import hudson.plugins.sonar.SonarInstallation; +import java.time.Duration; +import java.time.temporal.ChronoUnit; +import java.util.UUID; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +/** @author Réda Housni Alaoui */ +class SonarInstallationAdditionalAnalysisPropertiesTest { + + @Test + @DisplayName("Get duration") + void test1() { + assertThat( + SonarInstallationAdditionalAnalysisProperties.parse( + createSonarInstallation( + "foo=bar sonar.ws.timeout=6 bar=foo sonar.ws.timeout=600")) + .getDuration("sonar.ws.timeout", ChronoUnit.SECONDS)) + .contains(Duration.of(600, ChronoUnit.SECONDS)); + } + + @Test + @DisplayName("Get empty duration") + void test2() { + assertThat( + SonarInstallationAdditionalAnalysisProperties.parse( + createSonarInstallation("sonar.ws.timeout= =foo")) + .getDuration("sonar.ws.timeout", ChronoUnit.SECONDS)) + .isEmpty(); + } + + private SonarInstallation createSonarInstallation(String additionalAnalysisProperties) { + return new SonarInstallation( + UUID.randomUUID().toString(), + UUID.randomUUID().toString(), + null, + null, + null, + null, + null, + additionalAnalysisProperties, + null); + } +} diff --git a/src/test/java/org/jenkinsci/plugins/sonargerrit/test_infrastructure/jenkins/SonarqubeConfiguration.java b/src/test/java/org/jenkinsci/plugins/sonargerrit/test_infrastructure/jenkins/SonarqubeConfiguration.java index 64dd17d7..3d051307 100644 --- a/src/test/java/org/jenkinsci/plugins/sonargerrit/test_infrastructure/jenkins/SonarqubeConfiguration.java +++ b/src/test/java/org/jenkinsci/plugins/sonargerrit/test_infrastructure/jenkins/SonarqubeConfiguration.java @@ -45,7 +45,8 @@ public String addInstallation(String url, String token) throws IOException { String name = UUID.randomUUID().toString(); SonarInstallation sonarInstallation = - new SonarInstallation(name, url, credentialsId, null, null, null, null, null, null); + new SonarInstallation( + name, url, credentialsId, null, null, null, null, "sonar.ws.timeout=600", null); globalConfiguration.setInstallations( ArrayUtils.add(globalConfiguration.getInstallations(), sonarInstallation));