From 7839d6e3c8fd4045efca1b4cb76db0709189965f Mon Sep 17 00:00:00 2001 From: Matteo Mara Date: Mon, 18 Dec 2023 17:25:34 +0100 Subject: [PATCH] SONAR-21197 add a property to enable the download of the required plugins only --- .../java/org/sonar/core/config/ScannerProperties.java | 9 +++++++++ .../scanner/bootstrap/ScannerPluginRepository.java | 11 ++++++----- .../bootstrap/ScannerPluginRepositoryTest.java | 6 +++--- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/sonar-core/src/main/java/org/sonar/core/config/ScannerProperties.java b/sonar-core/src/main/java/org/sonar/core/config/ScannerProperties.java index b0d619f5ce1..729bd82740f 100644 --- a/sonar-core/src/main/java/org/sonar/core/config/ScannerProperties.java +++ b/sonar-core/src/main/java/org/sonar/core/config/ScannerProperties.java @@ -40,6 +40,7 @@ public class ScannerProperties { public static final String FILE_SIZE_LIMIT = "sonar.filesize.limit"; public static final String LINKS_SOURCES_DEV = "sonar.links.scm_dev"; public static final String DISABLE_PROJECT_AND_ORG_AUTODETECTION = "sonar.keys_autodetection.disabled"; + public static final String PLUGIN_LOADING_OPTIMIZATION_KEY = "sonar.plugins.downloadOnlyRequired"; private ScannerProperties() { // only static stuff @@ -91,6 +92,14 @@ public class ScannerProperties { .description( "Allows discarding files from analysis exceeding certain sizes.") .hidden() + .build(), + PropertyDefinition.builder(PLUGIN_LOADING_OPTIMIZATION_KEY) + .name("Enable scanner plugin loading optimization") + .description("When enabled, scanners will only download plugins required for detected languages.") + .category(CoreProperties.CATEGORY_GENERAL) + .subCategory("Performance") + .type(BOOLEAN) + .defaultValue("true") .build()); } } diff --git a/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/ScannerPluginRepository.java b/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/ScannerPluginRepository.java index 6b875da7620..fb2834604f6 100644 --- a/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/ScannerPluginRepository.java +++ b/sonar-scanner-engine/src/main/java/org/sonar/scanner/bootstrap/ScannerPluginRepository.java @@ -40,6 +40,7 @@ import org.sonar.scanner.mediumtest.LocalPlugin; import static java.util.stream.Collectors.toMap; import static org.sonar.api.utils.Preconditions.checkState; +import static org.sonar.core.config.ScannerProperties.PLUGIN_LOADING_OPTIMIZATION_KEY; /** * Orchestrates the installation and loading of plugins @@ -56,7 +57,7 @@ public class ScannerPluginRepository implements PluginRepository, Startable { private Map pluginInstancesByKeys; private Map pluginsByKeys; private Map keysByClassLoader; - private boolean shouldLoadAllPluginsOnStart; + private boolean shouldLoadOnlyRequiredPluginsOnStart; public ScannerPluginRepository(PluginInstaller installer, PluginJarExploder pluginJarExploder, PluginClassLoader loader, Configuration properties) { this.installer = installer; @@ -67,9 +68,9 @@ public class ScannerPluginRepository implements PluginRepository, Startable { @Override public void start() { - shouldLoadAllPluginsOnStart = properties.getBoolean("sonar.plugins.loadAll").orElse(false); - if (shouldLoadAllPluginsOnStart) { - LOG.warn("sonar.plugins.loadAll is true, so ALL available plugins will be downloaded"); + shouldLoadOnlyRequiredPluginsOnStart = properties.getBoolean(PLUGIN_LOADING_OPTIMIZATION_KEY).orElse(true); + if (!shouldLoadOnlyRequiredPluginsOnStart) { + LOG.warn("{} is false, so ALL available plugins will be downloaded", PLUGIN_LOADING_OPTIMIZATION_KEY); pluginsByKeys = new HashMap<>(installer.installAllPlugins()); } else { pluginsByKeys = new HashMap<>(installer.installRequiredPlugins()); @@ -96,7 +97,7 @@ public class ScannerPluginRepository implements PluginRepository, Startable { } public Collection installPluginsForLanguages(Set languageKeys) { - if (shouldLoadAllPluginsOnStart) { + if (!shouldLoadOnlyRequiredPluginsOnStart) { return Collections.emptySet(); } diff --git a/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/ScannerPluginRepositoryTest.java b/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/ScannerPluginRepositoryTest.java index 2fa2343f2e1..0c3f7c14a30 100644 --- a/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/ScannerPluginRepositoryTest.java +++ b/sonar-scanner-engine/src/test/java/org/sonar/scanner/bootstrap/ScannerPluginRepositoryTest.java @@ -47,6 +47,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static org.sonar.core.config.ScannerProperties.PLUGIN_LOADING_OPTIMIZATION_KEY; public class ScannerPluginRepositoryTest { @@ -90,9 +91,8 @@ public class ScannerPluginRepositoryTest { } @Test - public void should_install_all_plugins_when_loadall_flag_is_set() { - when(properties.getBoolean("sonar.plugins.loadAll")).thenReturn(Optional.of(true)); - + public void should_install_all_plugins_when_downloadOnlyRequired_flag_is_false() { + when(properties.getBoolean(PLUGIN_LOADING_OPTIMIZATION_KEY)).thenReturn(Optional.of(false)); underTest.start(); verify(installer).installAllPlugins(); -- 2.39.5