Skip to content

Commit b794da5

Browse files
Seppli11sonartech
authored andcommitted
SONARPY-3443 Migrate qa tasks (#578)
GitOrigin-RevId: 8d4458f351f65e8ef16a5a850c29d5fdee4fcbda
1 parent b5f43fb commit b794da5

6 files changed

Lines changed: 93 additions & 50 deletions

File tree

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
name: 'Setup Orchestrator Cache'
2+
description: 'Sets up orchestrator cache with dynamic key based on SQ version, and current month'
3+
4+
inputs:
5+
sq-version:
6+
description: 'SonarQube version to use in cache key'
7+
required: true
8+
9+
runs:
10+
using: 'composite'
11+
steps:
12+
- name: Calculate orchestrator cache key
13+
id: set-paths
14+
shell: bash
15+
run: |
16+
# Get current month for cache rotation
17+
CURRENT_MONTH=$(date +"%B")
18+
19+
CACHE_KEY="orchestrator-${{ github.workflow }}-${{ inputs.sq-version }}-${CURRENT_MONTH}"
20+
echo "cache-key=${CACHE_KEY}" >> $GITHUB_OUTPUT
21+
22+
- name: Setup orchestrator cache
23+
uses: SonarSource/ci-github-actions/cache@v1
24+
with:
25+
path: "~/.sonar/orchestrator/"
26+
key: "${{ steps.set-paths.outputs.cache-key }}"

its/commons/src/test/java/com/sonar/python/it/ConcurrentOrchestratorExtension.java

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,49 +22,69 @@
2222
import com.sonar.orchestrator.build.SonarScannerInstaller;
2323
import com.sonar.orchestrator.config.Configuration;
2424
import com.sonar.orchestrator.container.SonarDistribution;
25+
import com.sonar.orchestrator.locator.Locators;
2526
import com.sonar.orchestrator.server.StartupLogWatcher;
2627
import com.sonar.orchestrator.util.System2;
2728
import com.sonar.orchestrator.version.Version;
2829
import java.util.concurrent.CountDownLatch;
2930
import java.util.concurrent.atomic.AtomicInteger;
31+
import java.util.concurrent.locks.Lock;
32+
import java.util.concurrent.locks.ReentrantLock;
3033
import org.jetbrains.annotations.Nullable;
3134
import org.junit.jupiter.api.extension.BeforeAllCallback;
3235
import org.junit.jupiter.api.extension.ExtensionContext;
3336

3437
public class ConcurrentOrchestratorExtension extends Orchestrator implements BeforeAllCallback {
35-
private static final AtomicInteger REQUESTED_ORCHESTRATORS_KEY = new AtomicInteger();
36-
private static final CountDownLatch IS_ORCHESTRATOR_READY = new CountDownLatch(1);
38+
private static final Lock DOWNLOAD_LOCK = new ReentrantLock();
39+
40+
private final AtomicInteger requestOrchestratorKey = new AtomicInteger();
41+
private final CountDownLatch isOrchestratorReady = new CountDownLatch(1);
3742

3843
ConcurrentOrchestratorExtension(Configuration config, SonarDistribution distribution, @Nullable StartupLogWatcher startupLogWatcher) {
3944
super(config, distribution, startupLogWatcher);
4045
}
4146

4247
@Override
4348
public void beforeAll(ExtensionContext context) throws InterruptedException {
44-
if (REQUESTED_ORCHESTRATORS_KEY.getAndIncrement() == 0) {
49+
if (requestOrchestratorKey.getAndIncrement() == 0) {
4550
start();
4651

47-
new SonarScannerInstaller(getConfiguration().locators()).install(Version.create(SonarScanner.DEFAULT_SCANNER_VERSION), getConfiguration().fileSystem().workspace());
48-
IS_ORCHESTRATOR_READY.countDown();
49-
52+
prepareOrchestrator();
5053
} else {
5154
waitUntilReady();
5255
}
5356
}
5457

58+
private void prepareOrchestrator() {
59+
DOWNLOAD_LOCK.lock();
60+
try {
61+
installSonarScanner();
62+
isOrchestratorReady.countDown();
63+
} finally {
64+
DOWNLOAD_LOCK.unlock();
65+
}
66+
}
67+
68+
private void installSonarScanner() {
69+
Locators locators = getConfiguration().locators();
70+
Version version = Version.create(SonarScanner.DEFAULT_SCANNER_VERSION);
71+
new SonarScannerInstaller(locators).install(version, getConfiguration().fileSystem().workspace());
72+
}
73+
5574

5675
public SonarScanner createSonarScanner() {
5776
return SonarScanner.create()
5877
.setProperty("sonar.scanner.skipJreProvisioning", "true");
5978
}
6079

80+
public void waitUntilReady() throws InterruptedException {
81+
isOrchestratorReady.await();
82+
}
83+
6184
public static ConcurrentOrchestratorExtensionBuilder builderEnv() {
6285
return new ConcurrentOrchestratorExtensionBuilder(Configuration.createEnv());
6386
}
6487

65-
public static void waitUntilReady() throws InterruptedException {
66-
IS_ORCHESTRATOR_READY.await();
67-
}
6888

6989
public static class ConcurrentOrchestratorExtensionBuilder extends OrchestratorBuilder<ConcurrentOrchestratorExtensionBuilder, ConcurrentOrchestratorExtension> {
7090
ConcurrentOrchestratorExtensionBuilder(Configuration initialConfig) {

its/commons/src/test/java/com/sonar/python/it/PluginLocator.java

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -22,39 +22,37 @@
2222

2323
public class PluginLocator {
2424

25-
public static final String SQ_PLUGIN_TARGET_PROPERTY = "sonar.targetPlugin";
26-
public static final String DEFAULT_PLUGIN_TARGET = "OPEN_SOURCE";
27-
28-
record Plugin(String localLocation, String localWildcard) {
25+
record LocalPlugin(String localLocation, String localWildcard) {
2926
}
3027

3128
public enum Plugins {
32-
PYTHON_OSS("../../../sonar-python-plugin/target", "sonar-python-plugin-*.jar"),
33-
PYTHON_ENTERPRISE("../../sonar-python-enterprise-plugin/target",
34-
"sonar-python-enterprise-plugin-*.jar");
35-
36-
private final Plugin plugin;
37-
38-
Plugins(String localLocation, String localWildcard) {
39-
this.plugin = new Plugin(localLocation, localWildcard);
29+
PYTHON(
30+
new LocalPlugin("../../../sonar-python-plugin/target", "sonar-python-plugin-*.jar"),
31+
new LocalPlugin("../../sonar-python-enterprise-plugin/target", "sonar-python-enterprise-plugin-*.jar")),
32+
PYTHON_CUSTOM_RULES(
33+
new LocalPlugin("../python-custom-rules-plugin/target", "python-custom-rules-plugin-*.jar"),
34+
new LocalPlugin("../../../its/plugin/python-custom-rules-plugin/target", "python-custom-rules-plugin-*.jar")),
35+
PYTHON_CUSTOM_RULES_EXAMPLE(
36+
new LocalPlugin("../../docs/python-custom-rules-example/target", "python-custom-rules-example-*.jar"),
37+
new LocalPlugin("../../../docs/python-custom-rules-example/target", "python-custom-rules-example-*.jar"));
38+
39+
private final LocalPlugin ossPlugin;
40+
private final LocalPlugin enterprisePlugin;
41+
42+
Plugins(LocalPlugin ossPlugin, LocalPlugin enterprisePlugin) {
43+
this.ossPlugin = ossPlugin;
44+
this.enterprisePlugin = enterprisePlugin;
4045
}
4146

42-
public Location get() {
43-
return FileLocation.byWildcardMavenFilename(new File(plugin.localLocation), plugin.localWildcard);
44-
}
45-
}
46-
47-
public static Plugins pythonPlugin() {
48-
var targetPlugin = System.getProperty(SQ_PLUGIN_TARGET_PROPERTY, DEFAULT_PLUGIN_TARGET);
49-
if (DEFAULT_PLUGIN_TARGET.equals(targetPlugin)) {
50-
return Plugins.PYTHON_OSS;
51-
} else {
52-
return Plugins.PYTHON_ENTERPRISE;
47+
public Location get(boolean useEnterprise) {
48+
LocalPlugin plugin = useEnterprise ? enterprisePlugin : ossPlugin;
49+
return FileLocation.byWildcardMavenFilename(new File(plugin.localLocation()).getAbsoluteFile(), plugin.localWildcard());
5350
}
5451
}
5552

56-
public static Location pythonPluginLocation() {
57-
return pythonPlugin().get();
53+
public static boolean isEnterpriseTest() {
54+
var currentWorkingDirectory = new File(System.getProperty("user.dir"));
55+
return currentWorkingDirectory.getParentFile().getName().equals("its-enterprise");
5856
}
5957

6058
private PluginLocator() {

its/commons/src/test/java/com/sonar/python/it/TestsUtils.java

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,9 @@
1616
*/
1717
package com.sonar.python.it;
1818

19-
import com.sonar.orchestrator.config.Configuration;
2019
import com.sonar.orchestrator.container.Edition;
2120
import com.sonar.orchestrator.locator.FileLocation;
22-
import com.sonar.orchestrator.locator.Location;
23-
import com.sonar.orchestrator.locator.Locators;
24-
import java.io.File;
21+
import com.sonar.python.it.PluginLocator.Plugins;
2522
import java.util.ArrayList;
2623
import java.util.List;
2724
import java.util.Map;
@@ -45,40 +42,40 @@ public final class TestsUtils {
4542
private static final String DEFAULT_SQ_VERSION = "LATEST_RELEASE";
4643

4744
public static final ConcurrentOrchestratorExtension dynamicOrchestrator = makeDynamicOrchestrator();
48-
public static final Locators ORCHESTRATOR_LOCATORS = Configuration.createEnv().locators();
4945

5046
private static ConcurrentOrchestratorExtension makeDynamicOrchestrator() {
51-
var currentWorkingDirectory = new File(System.getProperty("user.dir"));
52-
if (currentWorkingDirectory.getParentFile().getName().equals("its-enterprise")) {
53-
return orchestratorBuilder(Edition.ENTERPRISE_LW, PluginLocator.Plugins.PYTHON_ENTERPRISE.get()).build();
47+
if (PluginLocator.isEnterpriseTest()) {
48+
return orchestratorBuilder(Edition.ENTERPRISE_LW).build();
5449
} else {
55-
return orchestratorBuilder(Edition.COMMUNITY, PluginLocator.Plugins.PYTHON_OSS.get()).build();
50+
return orchestratorBuilder(Edition.COMMUNITY).build();
5651
}
5752
}
5853

59-
public static ConcurrentOrchestratorExtension.ConcurrentOrchestratorExtensionBuilder orchestratorBuilder(Edition edition, Location pluginLocation) {
54+
private static ConcurrentOrchestratorExtension.ConcurrentOrchestratorExtensionBuilder orchestratorBuilder(Edition edition) {
55+
boolean isEnterprise = edition != Edition.COMMUNITY;
56+
6057
var builder = ConcurrentOrchestratorExtension.builderEnv()
6158
.useDefaultAdminCredentialsForBuilds(true)
6259
.setSonarVersion(System.getProperty(SQ_VERSION_PROPERTY, DEFAULT_SQ_VERSION))
6360
// Disable telemetry waiting for ORCH-497
6461
.setServerProperty("sonar.telemetry.enable", "false")
6562

6663
// Custom rules plugin
67-
.addPlugin(FileLocation.byWildcardMavenFilename(new File("../python-custom-rules-plugin/target"), "python-custom-rules-plugin-*.jar"))
68-
.addPlugin(FileLocation.byWildcardMavenFilename(new File("../../../docs/python-custom-rules-example/target"), "python-custom-rules-example-*.jar"))
64+
.addPlugin(Plugins.PYTHON_CUSTOM_RULES.get(isEnterprise))
65+
.addPlugin(Plugins.PYTHON_CUSTOM_RULES_EXAMPLE.get(isEnterprise))
6966
.restoreProfileAtStartup(FileLocation.of("profiles/profile-python-custom-rules-example.xml"))
7067
.restoreProfileAtStartup(FileLocation.of("profiles/profile-python-custom-rules.xml"))
7168
.restoreProfileAtStartup(FileLocation.of("profiles/profile-python-test-rules.xml"))
7269
.restoreProfileAtStartup(FileLocation.of("profiles/no_rule.xml"))
7370
.restoreProfileAtStartup(FileLocation.of("profiles/pylint.xml"))
7471
.restoreProfileAtStartup(FileLocation.of("profiles/nosonar.xml"));
7572

76-
if (!edition.equals(Edition.COMMUNITY)) {
73+
if (isEnterprise) {
7774
builder.setEdition(edition)
7875
.activateLicense();
7976
}
8077

81-
builder.addPlugin(pluginLocation);
78+
builder.addPlugin(Plugins.PYTHON.get(isEnterprise));
8279

8380
return builder;
8481
}

its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/SonarLintIPythonTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ public void log(String formattedMessage, Level level, @Nullable String stacktrac
8282
}
8383
};
8484
SonarLintLogger.setTarget(logOutput);
85-
var pluginJarLocation = Set.of(TestsUtils.dynamicOrchestrator.getConfiguration().locators().locate(PluginLocator.pythonPluginLocation()).toPath());
85+
var pluginJarLocation = Set
86+
.of(TestsUtils.dynamicOrchestrator.getConfiguration().locators().locate(PluginLocator.Plugins.PYTHON.get(PluginLocator.isEnterpriseTest())).toPath());
8687
var enabledLanguages = Set.of(SonarLanguage.IPYTHON);
8788
var pluginConfiguration = new PluginsLoader.Configuration(pluginJarLocation, enabledLanguages, false, Optional.empty());
8889
var pluginLoader = new PluginsLoader().load(pluginConfiguration, Set.of());

its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/SonarLintTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@ public void log(String formattedMessage, Level level, @Nullable String stacktrac
8484
}
8585
};
8686
SonarLintLogger.setTarget(logOutput);
87-
var pluginJarLocation = Set.of(TestsUtils.dynamicOrchestrator.getConfiguration().locators().locate(PluginLocator.pythonPluginLocation()).toPath());
87+
var pluginJarLocation = Set
88+
.of(TestsUtils.dynamicOrchestrator.getConfiguration().locators().locate(PluginLocator.Plugins.PYTHON.get(PluginLocator.isEnterpriseTest())).toPath());
8889
var enabledLanguages = Set.of(SonarLanguage.PYTHON);
8990
var pluginConfiguration = new PluginsLoader.Configuration(pluginJarLocation, enabledLanguages, false, Optional.empty());
9091
var pluginLoader = new PluginsLoader().load(pluginConfiguration, Set.of());

0 commit comments

Comments
 (0)