From 5753f71e5185e4627f31fac5afef66dfce2cbc09 Mon Sep 17 00:00:00 2001 From: Andrzej Jordanow Date: Thu, 24 Jul 2025 16:24:55 +0200 Subject: [PATCH] Use edge discovery for caching --- .../DevelocityConventionsPlugin.java | 37 +++++++++---------- .../DevelocityConventions.java | 28 ++++++++++++++ ...ocityConventionsPluginIntegrationTest.java | 12 +++++- .../DevelocityConfigurationForTest.java | 21 ++++++++++- 4 files changed, 76 insertions(+), 22 deletions(-) diff --git a/src/main/java/io/github/gradle/conventions/DevelocityConventionsPlugin.java b/src/main/java/io/github/gradle/conventions/DevelocityConventionsPlugin.java index 7c0264c..4775243 100644 --- a/src/main/java/io/github/gradle/conventions/DevelocityConventionsPlugin.java +++ b/src/main/java/io/github/gradle/conventions/DevelocityConventionsPlugin.java @@ -56,6 +56,7 @@ public void apply(Settings settings) { if (settings.getGradle().getStartParameter().isBuildCacheEnabled()) { DevelocityConfiguration dv = settings.getExtensions().getByType(DevelocityConfiguration.class); settings.buildCache(new BuildCacheConfigureAction(conventions, dv)); + configureEdge(settings, conventions); } if (!settings.getGradle().getStartParameter().isNoBuildScan() && !containsPropertiesTask(settings)) { configureBuildScan(settings, conventions); @@ -70,6 +71,11 @@ private boolean containsPropertiesTask(Settings settings) { || settings.getGradle().getStartParameter().getTaskNames().stream().anyMatch(it -> it.endsWith(":properties")); } + private void configureEdge(Settings settings, DevelocityConventions conventions) { + DevelocityConfiguration dv = settings.getExtensions().getByType(DevelocityConfiguration.class); + dv.getEdgeDiscovery().set(conventions.getEdgeDiscovery()); + } + private void configureBuildScan(Settings settings, DevelocityConventions conventions) { DevelocityConfiguration dv = settings.getExtensions().getByType(DevelocityConfiguration.class); @@ -117,11 +123,8 @@ private static class BuildCacheConfigureAction implements Action localBuildCache.setEnabled(!disableLocalCache)); } private String determineRemoteCacheUrl() { - return conventions.environmentVariableProvider(GRADLE_CACHE_REMOTE_SERVER_ENV_NAME) - .orElse(conventions.systemPropertyProvider(GRADLE_CACHE_REMOTE_SERVER_PROPERTY_NAME)) - .orElse(conventions.systemPropertyProvider(GRADLE_CACHE_NODE_PROPERTY_NAME) - .map(cacheNode -> { - switch (cacheNode) { - case "eu": - return EU_CACHE_NODE; - case "us": - return US_CACHE_NODE; - case "au": - return AU_CACHE_NODE; - default: - throw new IllegalArgumentException("Unrecognized cacheNode: " + cacheNode); - } - })).orElse(EU_CACHE_NODE).get(); + return conventions.getRemoteCacheUrl() + .getOrElse(getRemoteCacheUrlFromNodeName()); + } + + private String getRemoteCacheUrlFromNodeName() { + return conventions.getRemoteCacheNodeName() + .map(cacheNode -> switch (cacheNode) { + case "eu" -> EU_CACHE_NODE; + case "us" -> US_CACHE_NODE; + case "au" -> AU_CACHE_NODE; + default -> throw new IllegalArgumentException("Unrecognized cacheNode: " + cacheNode); + }).getOrNull(); } private boolean notNullOrEmpty(String value) { diff --git a/src/main/java/io/github/gradle/conventions/customvalueprovider/DevelocityConventions.java b/src/main/java/io/github/gradle/conventions/customvalueprovider/DevelocityConventions.java index 561db13..109930a 100644 --- a/src/main/java/io/github/gradle/conventions/customvalueprovider/DevelocityConventions.java +++ b/src/main/java/io/github/gradle/conventions/customvalueprovider/DevelocityConventions.java @@ -35,8 +35,13 @@ public class DevelocityConventions { private static final String AGREE_PUBLIC_BUILD_SCAN_TERM_OF_SERVICE = "agreePublicBuildScanTermOfService"; private static final String DEVELOCITY_SERVER_URL = "develocity.server.url"; + private static final String DEVELOCITY_EDGE_DISCOVERY = "develocity.edge.discovery"; private static final String CI_ENV_NAME = "CI"; + private static final String GRADLE_CACHE_REMOTE_SERVER_ENV_NAME = "GRADLE_CACHE_REMOTE_SERVER"; + private static final String GRADLE_CACHE_REMOTE_SERVER_PROPERTY_NAME = "gradle.cache.remote.server"; + private static final String GRADLE_CACHE_NODE_PROPERTY_NAME = "cacheNode"; + private static final Pattern HTTPS_URL_PATTERN = Pattern.compile("https://github\\.com/([\\w-]+)/([\\w-]+)\\.git"); private static final Pattern SSH_URL_PATTERN = Pattern.compile("git@github\\.com:([\\w-]+)/([\\w-]+)\\.git"); private static final Pattern SHA_PATTERN = Pattern.compile("[0-9a-fA-F]+"); @@ -44,13 +49,32 @@ public class DevelocityConventions { private final ProviderFactory providerFactory; private final String develocityServerUrl; private final boolean isCiServer; + private final boolean edgeDiscovery; public DevelocityConventions(ProviderFactory providerFactory) { this.providerFactory = providerFactory; + this.edgeDiscovery = determineEdgeDiscovery(); this.develocityServerUrl = determineDevelocityServerUrl(); this.isCiServer = !getEnvVariable(CI_ENV_NAME, "").isEmpty(); } + private boolean determineEdgeDiscovery() { + return Boolean.parseBoolean(getSystemProperty(DEVELOCITY_EDGE_DISCOVERY, "true")); + } + + public Provider getRemoteCacheUrl() { + return environmentVariableProvider(GRADLE_CACHE_REMOTE_SERVER_ENV_NAME) + .orElse(systemPropertyProvider(GRADLE_CACHE_REMOTE_SERVER_PROPERTY_NAME)); + } + + public Provider getRemoteCacheNodeName() { + return systemPropertyProvider(GRADLE_CACHE_NODE_PROPERTY_NAME); + } + + public boolean isRemoteCacheSpecified() { + return getRemoteCacheUrl().orElse(getRemoteCacheNodeName()).isPresent(); + } + private String determineDevelocityServerUrl() { String dvServerUrl = System.getProperty(DEVELOCITY_SERVER_URL); if (dvServerUrl != null) { @@ -78,6 +102,10 @@ public Optional customValueSearchUrl(Map search) { return Optional.of(String.format("%s/scans?%s", develocityServerUrl, query)); } + public boolean getEdgeDiscovery() { + return edgeDiscovery; + } + public String getDevelocityServerUrl() { return develocityServerUrl; } diff --git a/src/test/java/io/github/gradle/conventions/DevelocityConventionsPluginIntegrationTest.java b/src/test/java/io/github/gradle/conventions/DevelocityConventionsPluginIntegrationTest.java index 70f5526..ac6268c 100644 --- a/src/test/java/io/github/gradle/conventions/DevelocityConventionsPluginIntegrationTest.java +++ b/src/test/java/io/github/gradle/conventions/DevelocityConventionsPluginIntegrationTest.java @@ -16,13 +16,23 @@ public class DevelocityConventionsPluginIntegrationTest extends AbstractDevelocityPluginIntegrationTest { private static final String EU_CACHE_NODE = "https://eu-build-cache.gradle.org"; - private static final String US_CACHE_NODE = "https://us-build-cache.gradle.org"; private static final String PUBLIC_DEVELOCITY_SERVER = "https://ge.gradle.org"; @Test public void configureBuildCacheOnlyWhenBuildCacheEnabled() throws URISyntaxException { succeeds("help", "--build-cache"); + assertTrue(getConfiguredDevelocity().getEdgeDiscoveryValue()); + assertNull(getConfiguredRemoteCache().getUrl()); + assertFalse(getConfiguredRemoteCache().isPush()); + assertTrue(getConfiguredLocalCache().isEnabled()); + } + + @Test + public void configureBuildCacheOnlyWhenBuildCacheEnabledAndCacheNodeIsSet() throws URISyntaxException { + succeeds("help", "--build-cache", "-DcacheNode=eu"); + + assertTrue(getConfiguredDevelocity().getEdgeDiscoveryValue()); assertEquals(new URI(EU_CACHE_NODE), getConfiguredRemoteCache().getUrl()); assertFalse(getConfiguredRemoteCache().isPush()); assertTrue(getConfiguredLocalCache().isEnabled()); diff --git a/src/test/java/io/github/gradle/fixtures/DevelocityConfigurationForTest.java b/src/test/java/io/github/gradle/fixtures/DevelocityConfigurationForTest.java index db71034..1e44958 100644 --- a/src/test/java/io/github/gradle/fixtures/DevelocityConfigurationForTest.java +++ b/src/test/java/io/github/gradle/fixtures/DevelocityConfigurationForTest.java @@ -23,12 +23,16 @@ public DevelocityConfigurationForTest() { public DevelocityConfigurationForTest(ObjectFactory objectFactory) { this.server = objectFactory == null ? null : objectFactory.property(String.class); + this.edgeDiscovery = objectFactory == null ? null : objectFactory.property(Boolean.class); this.buildScanConfiguration = new BuildScanConfigurationForTest(objectFactory); } + private BuildScanConfigurationForTest buildScanConfiguration; private Property server; private String serverValue; + private Property edgeDiscovery; + private boolean edgeDiscoveryValue; @Override public BuildScanConfigurationForTest getBuildScan() { @@ -65,15 +69,28 @@ public Property getServer() { } @Override - @JsonIgnore + @JsonSerialize(using = PropertySerializer.class) public Property getEdgeDiscovery() { - throw new UnsupportedOperationException(); + return edgeDiscovery; + } + + public void setEdgeDiscovery(boolean value) { + this.edgeDiscoveryValue = value; + } + + @JsonIgnore + public boolean getEdgeDiscoveryValue() { + if (edgeDiscovery != null) { + return edgeDiscovery.getOrElse(false); + } + return edgeDiscoveryValue; } public void setServer(String server) { this.serverValue = server; } + @JsonIgnore public String getServerValue() { if (server != null) { return server.getOrNull();