From 848aa5b353f291da413f5e5b2618cb397d2704a8 Mon Sep 17 00:00:00 2001 From: Ryan Ernst Date: Mon, 8 Sep 2025 14:06:50 -0700 Subject: [PATCH 1/6] Add initial transport version generation task This commit adds a new generateInitialTransportVersion task to gradle. This task will be called by release automation to ensure each new release version of Elasticsearch has a unique transport version id. --- .../AbstractTransportVersionFuncTest.groovy | 19 +++- ...rateInitialTransportVersionFuncTest.groovy | 86 +++++++++++++++++++ .../GenerateInitialTransportVersionTask.java | 81 +++++++++++++++++ .../TransportVersionResourcesPlugin.java | 14 ++- .../TransportVersionResourcesService.java | 10 +++ .../fixtures/AbstractGradleFuncTest.groovy | 31 +++---- 6 files changed, 217 insertions(+), 24 deletions(-) create mode 100644 build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/GenerateInitialTransportVersionFuncTest.groovy create mode 100644 build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/GenerateInitialTransportVersionTask.java diff --git a/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/AbstractTransportVersionFuncTest.groovy b/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/AbstractTransportVersionFuncTest.groovy index edfca7e6918b5..99237ab3a28ab 100644 --- a/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/AbstractTransportVersionFuncTest.groovy +++ b/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/AbstractTransportVersionFuncTest.groovy @@ -93,13 +93,24 @@ class AbstractTransportVersionFuncTest extends AbstractGradleFuncTest { assert file("myserver/src/main/resources/transport/definitions/referable/${name}.csv").exists() == false } + void assertUnreferableDefinition(String name, String content) { + File definitionFile = file("myserver/src/main/resources/transport/definitions/unreferable/${name}.csv") + assert definitionFile.exists() + assert definitionFile.text.strip() == content + } + void assertUpperBound(String name, String content) { assert file("myserver/src/main/resources/transport/upper_bounds/${name}.csv").text.strip() == content } + void assertNoChanges() { + String output = execute("git diff") + assert output.strip().isEmpty() : "Expected no local git changes, but found:${System.lineSeparator()}${output}" + } + def setup() { configurationCacheCompatible = false - internalBuild() + internalBuild([], "9.2.0", ["9.1": "9.1.1", "9.0": "9.0.2", "8.19": "8.19.7"]) settingsFile << """ include ':myserver' include ':myplugin' @@ -116,10 +127,12 @@ class AbstractTransportVersionFuncTest extends AbstractGradleFuncTest { """ referableTransportVersion("existing_91", "8012000") referableTransportVersion("existing_92", "8123000,8012001") - unreferableTransportVersion("initial_9_0_0", "8000000") + unreferableTransportVersion("initial_9.0.0", "8000000") + unreferableTransportVersion("initial_8.19.7", "7123001") transportVersionUpperBound("9.2", "existing_92", "8123000") transportVersionUpperBound("9.1", "existing_92", "8012001") - transportVersionUpperBound("9.0", "initial_9_0_0", "8000000") + transportVersionUpperBound("9.0", "initial_9.0.0", "8000000") + transportVersionUpperBound("8.19", "initial_8.19.7", "7123001") // a mock version of TransportVersion, just here so we can compile Dummy.java et al javaSource("myserver", "org.elasticsearch", "TransportVersion", "", """ public static TransportVersion fromName(String name) { diff --git a/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/GenerateInitialTransportVersionFuncTest.groovy b/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/GenerateInitialTransportVersionFuncTest.groovy new file mode 100644 index 0000000000000..4ada11fd194dd --- /dev/null +++ b/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/GenerateInitialTransportVersionFuncTest.groovy @@ -0,0 +1,86 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +package org.elasticsearch.gradle.internal.transport + +import org.gradle.testkit.runner.BuildResult +import org.gradle.testkit.runner.TaskOutcome + +class GenerateInitialTransportVersionFuncTest extends AbstractTransportVersionFuncTest { + def runGenerateAndValidateTask(String... additionalArgs) { + List args = new ArrayList<>() + args.add(":myserver:validateTransportVersionResources") + args.add(":myserver:generateInitialTransportVersion") + args.addAll(additionalArgs); + return gradleRunner(args.toArray()) + } + + def runGenerateTask(String... additionalArgs) { + List args = new ArrayList<>() + args.add(":myserver:generateInitialTransportVersion") + args.addAll(additionalArgs); + return gradleRunner(args.toArray()) + } + + void assertGenerateSuccess(BuildResult result) { + assert result.task(":myserver:generateInitialTransportVersion").outcome == TaskOutcome.SUCCESS + } + + void assertGenerateFailure(BuildResult result, String expectedOutput) { + assert result.task(":myserver:generateInitialTransportVersion").outcome == TaskOutcome.FAILED + assertOutputContains(result.output, expectedOutput) + } + + void assertValidateSuccess(BuildResult result) { + assert result.task(":myserver:validateTransportVersionResources").outcome == TaskOutcome.SUCCESS + } + + void assertGenerateAndValidateSuccess(BuildResult result) { + assertGenerateSuccess(result) + assertValidateSuccess(result) + } + + def "setup is valid"() { + when: + def result = runGenerateAndValidateTask("--release-version", "9.0.0").build() + + then: + assertGenerateAndValidateSuccess(result) + // should have been idempotent, nothing actually changed + assertNoChanges(); + } + + def "new minor creates a new upper bound"() { + when: + def result = runGenerateAndValidateTask("--release-version", "9.3.0").build() + + then: + assertGenerateAndValidateSuccess(result) + assertUnreferableDefinition("initial_9.3.0", "8124000") + assertUpperBound("9.3", "initial_9.3.0,8124000") + } + + def "patch updates existing upper bound"() { + when: + def result = runGenerateAndValidateTask("--release-version", "9.1.2").build() + + then: + assertGenerateAndValidateSuccess(result) + assertUnreferableDefinition("initial_9.1.2", "8012002") + assertUpperBound("9.1", "initial_9.1.2,8012002") + } + + def "cannot create upper bound file for patch"() { + when: + def result = runGenerateTask("--release-version", "9.3.7").buildAndFail() + + then: + assertGenerateFailure(result, "Upper bound file 9.3 does not exist for patch version 9.3.7") + } +} diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/GenerateInitialTransportVersionTask.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/GenerateInitialTransportVersionTask.java new file mode 100644 index 0000000000000..dbc2bab99a446 --- /dev/null +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/GenerateInitialTransportVersionTask.java @@ -0,0 +1,81 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +package org.elasticsearch.gradle.internal.transport; + +import org.elasticsearch.gradle.Version; +import org.elasticsearch.gradle.internal.BwcVersions; +import org.gradle.api.DefaultTask; +import org.gradle.api.provider.Property; +import org.gradle.api.services.ServiceReference; +import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.options.Option; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; + +public abstract class GenerateInitialTransportVersionTask extends DefaultTask { + + @ServiceReference("transportVersionResources") + abstract Property getResourceService(); + + @Input + @Option(option = "release-version", description = "The Elasticsearch release version this transport version will be associated with") + public abstract Property getReleaseVersion(); + + @Input + abstract Property getBwcVersions(); + + @TaskAction + public void run() throws IOException { + String releaseVersion = getReleaseVersion().get(); + String upperBoundName = getUpperBoundName(releaseVersion); + TransportVersionResourcesService resources = getResourceService().get(); + TransportVersionUpperBound upstreamUpperBound = resources.getUpperBoundFromUpstream(upperBoundName); + String initialDefinitionName = "initial_" + releaseVersion; + TransportVersionDefinition existingDefinition = resources.getUnreferableDefinitionFromUpstream(initialDefinitionName); + + if (existingDefinition != null) { + // this initial version has already been created upstream + return; + } + + TransportVersionId id; + if (upstreamUpperBound == null) { + if (releaseVersion.endsWith(".0") == false) { + throw new RuntimeException("Upper bound file " + upperBoundName + " does not exist for patch version " + releaseVersion); + } + // The upper bound doesn't exist yet, so initialize the id based on the previous upper bound. + // Here we assume the previous upper bound release version is unreleased, and the new + // upper bound is not yet in bwc versions (so it will not be found) + Version targetVersion = Version.fromString(releaseVersion); + List unreleasedVersions = getBwcVersions().get().getUnreleased(); + int ndx = Collections.binarySearch(unreleasedVersions, targetVersion); + Version previousVersion = unreleasedVersions.get(-ndx - 2); // element before the insertion point + String previousUpperBoundName = previousVersion.getMajor() + "." + previousVersion.getMinor(); + TransportVersionUpperBound previousUpperBound = resources.getUpperBoundFromUpstream(previousUpperBoundName); + id = TransportVersionId.fromInt(previousUpperBound.definitionId().complete() + 1000); + } else { + id = TransportVersionId.fromInt(upstreamUpperBound.definitionId().complete() + 1); + } + + var definition = new TransportVersionDefinition(initialDefinitionName, List.of(id)); + resources.writeUnreferableDefinition(definition); + var newUpperBound = new TransportVersionUpperBound(upperBoundName, initialDefinitionName, id); + resources.writeUpperBound(newUpperBound); + } + + private String getUpperBoundName(String releaseVersion) { + int firstDotIndex = releaseVersion.indexOf('.'); + int secondDotIndex = releaseVersion.indexOf('.', firstDotIndex + 1); + return releaseVersion.substring(0, secondDotIndex); + } +} diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesPlugin.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesPlugin.java index 1125483f4d471..9df86e1efb19e 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesPlugin.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesPlugin.java @@ -12,15 +12,19 @@ import org.elasticsearch.gradle.Version; import org.elasticsearch.gradle.VersionProperties; import org.elasticsearch.gradle.internal.ProjectSubscribeServicePlugin; +import org.elasticsearch.gradle.internal.info.BuildParameterExtension; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.file.Directory; import org.gradle.api.plugins.JavaPlugin; +import org.gradle.api.provider.Property; import org.gradle.api.tasks.Copy; import org.gradle.language.base.plugins.LifecycleBasePlugin; import java.util.Map; +import static org.elasticsearch.gradle.internal.util.ParamsUtils.loadBuildParams; + public class TransportVersionResourcesPlugin implements Plugin { public static final String TRANSPORT_REFERENCES_TOPIC = "transportReferences"; @@ -82,8 +86,16 @@ public void apply(Project project) { Version esVersion = VersionProperties.getElasticsearchVersion(); t.getCurrentUpperBoundName().convention(esVersion.getMajor() + "." + esVersion.getMinor()); }); - validateTask.configure(t -> t.mustRunAfter(generateDefinitionsTask)); + + var generateInitialTask = project.getTasks() + .register("generateInitialTransportVersion", GenerateInitialTransportVersionTask.class, t -> { + t.setGroup(taskGroup); + t.setDescription("(Re)generates an initial transport version for an Elasticsearch release version"); + Property buildParams = loadBuildParams(project); + t.getBwcVersions().set(buildParams.get().getBwcVersionsProvider()); + }); + validateTask.configure(t -> t.mustRunAfter(generateInitialTask)); } private static String getResourceRoot(Project project) { diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesService.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesService.java index 85590cb3cb196..7df2931c93717 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesService.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesService.java @@ -174,6 +174,16 @@ Path getUnreferableDefinitionRepositoryPath(TransportVersionDefinition definitio return rootDir.relativize(transportResourcesDir.resolve(getUnreferableDefinitionRelativePath(definition.name()))); } + void writeUnreferableDefinition(TransportVersionDefinition definition) throws IOException { + Path path = transportResourcesDir.resolve(getUnreferableDefinitionRelativePath(definition.name())); + logger.debug("Writing unreferable definition [" + definition + "] to [" + path + "]"); + Files.writeString( + path, + definition.ids().stream().map(Object::toString).collect(Collectors.joining(",")) + "\n", + StandardCharsets.UTF_8 + ); + } + /** Read all upper bound files and return them mapped by their release name */ Map getUpperBounds() throws IOException { Map upperBounds = new HashMap<>(); diff --git a/build-tools/src/testFixtures/groovy/org/elasticsearch/gradle/fixtures/AbstractGradleFuncTest.groovy b/build-tools/src/testFixtures/groovy/org/elasticsearch/gradle/fixtures/AbstractGradleFuncTest.groovy index df14753375c64..e7b71913e9bd4 100644 --- a/build-tools/src/testFixtures/groovy/org/elasticsearch/gradle/fixtures/AbstractGradleFuncTest.groovy +++ b/build-tools/src/testFixtures/groovy/org/elasticsearch/gradle/fixtures/AbstractGradleFuncTest.groovy @@ -172,13 +172,11 @@ abstract class AbstractGradleFuncTest extends Specification { File internalBuild( List extraPlugins = [], - String maintenance = "7.16.10", - String major4 = "8.1.3", - String major3 = "8.2.1", - String major2 = "8.3.0", - String major1 = "8.4.0", - String current = "9.0.0" + String currentVersion = "9.0.0", + Map backportVersionsByBranch = + ["8.x": "8.4.0", "8.3": "8.3.0", "8.2": "8.2.1", "8.1": "8.1.3", "7.16": "7.16.10"] ) { + Collection backportVersions = backportVersionsByBranch.values() buildFile << """plugins { id 'elasticsearch.global-build-info' ${extraPlugins.collect { p -> "id '$p'" }.join('\n')} @@ -189,29 +187,21 @@ abstract class AbstractGradleFuncTest extends Specification { import org.elasticsearch.gradle.internal.info.DevelopmentBranch import org.elasticsearch.gradle.Version - Version currentVersion = Version.fromString("${current}") + Version currentVersion = Version.fromString("${currentVersion}") def versionList = [ - Version.fromString("$maintenance"), - Version.fromString("$major4"), - Version.fromString("$major3"), - Version.fromString("$major2"), - Version.fromString("$major1"), - currentVersion + ${backportVersions.collect {"Version.fromString(\"${ it }\")," }.join(System.lineSeparator())} + currentVersion ] BwcVersions versions = new BwcVersions(currentVersion, versionList, [ - new DevelopmentBranch('main', Version.fromString("$current")), - new DevelopmentBranch('8.x', Version.fromString("$major1")), - new DevelopmentBranch('8.3', Version.fromString("$major2")), - new DevelopmentBranch('8.2', Version.fromString("$major3")), - new DevelopmentBranch('8.1', Version.fromString("$major4")), - new DevelopmentBranch('7.16', Version.fromString("$maintenance")), + new DevelopmentBranch('main', currentVersion), + ${backportVersionsByBranch.collect {"new DevelopmentBranch('${ it.key }', Version.fromString(\"${ it.value }\"))," }.join(System.lineSeparator())} ]) buildParams.setBwcVersions(project.provider { versions } ) """ } - void execute(String command, File workingDir = testProjectDir.root) { + String execute(String command, File workingDir = testProjectDir.root) { def proc = command.execute(Collections.emptyList(), workingDir) proc.waitFor() if (proc.exitValue()) { @@ -221,6 +211,7 @@ abstract class AbstractGradleFuncTest extends Specification { """ throw new RuntimeException(msg) } + return proc.inputStream.text } File dir(String path) { From 08a64f0ad47eb88c573b980416cb0878c7fee0f4 Mon Sep 17 00:00:00 2001 From: Ryan Ernst Date: Mon, 8 Sep 2025 21:41:03 -0700 Subject: [PATCH 2/6] update from feedback --- .../AbstractTransportVersionFuncTest.groovy | 1 + ...rateInitialTransportVersionFuncTest.groovy | 17 +++++--- .../GenerateInitialTransportVersionTask.java | 40 +++++++------------ .../TransportVersionResourcesPlugin.java | 15 +++++-- 4 files changed, 39 insertions(+), 34 deletions(-) diff --git a/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/AbstractTransportVersionFuncTest.groovy b/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/AbstractTransportVersionFuncTest.groovy index 99237ab3a28ab..6350d315187aa 100644 --- a/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/AbstractTransportVersionFuncTest.groovy +++ b/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/AbstractTransportVersionFuncTest.groovy @@ -115,6 +115,7 @@ class AbstractTransportVersionFuncTest extends AbstractGradleFuncTest { include ':myserver' include ':myplugin' """ + versionPropertiesFile.text = versionPropertiesFile.text.replace("9.1.0", "9.2.0") file("myserver/build.gradle") << """ apply plugin: 'java-library' diff --git a/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/GenerateInitialTransportVersionFuncTest.groovy b/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/GenerateInitialTransportVersionFuncTest.groovy index 4ada11fd194dd..30582d9f7c8d4 100644 --- a/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/GenerateInitialTransportVersionFuncTest.groovy +++ b/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/GenerateInitialTransportVersionFuncTest.groovy @@ -56,14 +56,21 @@ class GenerateInitialTransportVersionFuncTest extends AbstractTransportVersionFu assertNoChanges(); } - def "new minor creates a new upper bound"() { + def "new minor also creates next upper bound"() { + given: + // version properties will be updated by release automation before running initial version generation + versionPropertiesFile.text = versionPropertiesFile.text.replace("9.2.0", "9.3.0") + when: - def result = runGenerateAndValidateTask("--release-version", "9.3.0").build() + System.out.println("Running generation initial task") + def result = runGenerateAndValidateTask("--release-version", "9.2.0").build() + System.out.println("Done running generation task") then: assertGenerateAndValidateSuccess(result) - assertUnreferableDefinition("initial_9.3.0", "8124000") - assertUpperBound("9.3", "initial_9.3.0,8124000") + assertUnreferableDefinition("initial_9.2.0", "8124000") + assertUpperBound("9.2", "initial_9.2.0,8124000") + assertUpperBound("9.3", "initial_9.2.0,8124000") } def "patch updates existing upper bound"() { @@ -81,6 +88,6 @@ class GenerateInitialTransportVersionFuncTest extends AbstractTransportVersionFu def result = runGenerateTask("--release-version", "9.3.7").buildAndFail() then: - assertGenerateFailure(result, "Upper bound file 9.3 does not exist for patch version 9.3.7") + assertGenerateFailure(result, "Missing upper bound 9.3 for release version 9.3.7") } } diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/GenerateInitialTransportVersionTask.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/GenerateInitialTransportVersionTask.java index dbc2bab99a446..a10c3fabb7ba9 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/GenerateInitialTransportVersionTask.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/GenerateInitialTransportVersionTask.java @@ -10,7 +10,6 @@ package org.elasticsearch.gradle.internal.transport; import org.elasticsearch.gradle.Version; -import org.elasticsearch.gradle.internal.BwcVersions; import org.gradle.api.DefaultTask; import org.gradle.api.provider.Property; import org.gradle.api.services.ServiceReference; @@ -19,7 +18,6 @@ import org.gradle.api.tasks.options.Option; import java.io.IOException; -import java.util.Collections; import java.util.List; public abstract class GenerateInitialTransportVersionTask extends DefaultTask { @@ -32,11 +30,11 @@ public abstract class GenerateInitialTransportVersionTask extends DefaultTask { public abstract Property getReleaseVersion(); @Input - abstract Property getBwcVersions(); + abstract Property getCurrentVersion(); @TaskAction public void run() throws IOException { - String releaseVersion = getReleaseVersion().get(); + Version releaseVersion = Version.fromString(getReleaseVersion().get()); String upperBoundName = getUpperBoundName(releaseVersion); TransportVersionResourcesService resources = getResourceService().get(); TransportVersionUpperBound upstreamUpperBound = resources.getUpperBoundFromUpstream(upperBoundName); @@ -48,34 +46,26 @@ public void run() throws IOException { return; } - TransportVersionId id; if (upstreamUpperBound == null) { - if (releaseVersion.endsWith(".0") == false) { - throw new RuntimeException("Upper bound file " + upperBoundName + " does not exist for patch version " + releaseVersion); - } - // The upper bound doesn't exist yet, so initialize the id based on the previous upper bound. - // Here we assume the previous upper bound release version is unreleased, and the new - // upper bound is not yet in bwc versions (so it will not be found) - Version targetVersion = Version.fromString(releaseVersion); - List unreleasedVersions = getBwcVersions().get().getUnreleased(); - int ndx = Collections.binarySearch(unreleasedVersions, targetVersion); - Version previousVersion = unreleasedVersions.get(-ndx - 2); // element before the insertion point - String previousUpperBoundName = previousVersion.getMajor() + "." + previousVersion.getMinor(); - TransportVersionUpperBound previousUpperBound = resources.getUpperBoundFromUpstream(previousUpperBoundName); - id = TransportVersionId.fromInt(previousUpperBound.definitionId().complete() + 1000); - } else { - id = TransportVersionId.fromInt(upstreamUpperBound.definitionId().complete() + 1); + throw new RuntimeException("Missing upper bound " + upperBoundName + " for release version " + releaseVersion); } - + // minors increment by 1000 to create a unique base, patches increment by 1 as other patches do + int increment = releaseVersion.getRevision() == 0 ? 1000 : 1; + var id = TransportVersionId.fromInt(upstreamUpperBound.definitionId().complete() + increment); var definition = new TransportVersionDefinition(initialDefinitionName, List.of(id)); resources.writeUnreferableDefinition(definition); var newUpperBound = new TransportVersionUpperBound(upperBoundName, initialDefinitionName, id); resources.writeUpperBound(newUpperBound); + + if (releaseVersion.getRevision() == 0) { + Version currentVersion = getCurrentVersion().get(); + String currentUpperBoundName = getUpperBoundName(currentVersion); + var currentUpperBound = new TransportVersionUpperBound(currentUpperBoundName, initialDefinitionName, id); + resources.writeUpperBound(currentUpperBound); + } } - private String getUpperBoundName(String releaseVersion) { - int firstDotIndex = releaseVersion.indexOf('.'); - int secondDotIndex = releaseVersion.indexOf('.', firstDotIndex + 1); - return releaseVersion.substring(0, secondDotIndex); + private String getUpperBoundName(Version version) { + return version.getMajor() + "." + version.getMinor(); } } diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesPlugin.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesPlugin.java index 9df86e1efb19e..0c7e2b63b4623 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesPlugin.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesPlugin.java @@ -12,6 +12,7 @@ import org.elasticsearch.gradle.Version; import org.elasticsearch.gradle.VersionProperties; import org.elasticsearch.gradle.internal.ProjectSubscribeServicePlugin; +import org.elasticsearch.gradle.internal.conventions.VersionPropertiesPlugin; import org.elasticsearch.gradle.internal.info.BuildParameterExtension; import org.gradle.api.Plugin; import org.gradle.api.Project; @@ -22,6 +23,7 @@ import org.gradle.language.base.plugins.LifecycleBasePlugin; import java.util.Map; +import java.util.Properties; import static org.elasticsearch.gradle.internal.util.ParamsUtils.loadBuildParams; @@ -32,7 +34,12 @@ public class TransportVersionResourcesPlugin implements Plugin { @Override public void apply(Project project) { project.getPluginManager().apply(LifecycleBasePlugin.class); + project.getPluginManager().apply(VersionPropertiesPlugin.class); var psService = project.getPlugins().apply(ProjectSubscribeServicePlugin.class).getService(); + + Properties versions = (Properties) project.getExtensions().getByName(VersionPropertiesPlugin.VERSIONS_EXT); + Version currentVersion = Version.fromString(versions.getProperty("elasticsearch")); + var resourceRoot = getResourceRoot(project); String taskGroup = "Transport Versions"; @@ -83,8 +90,7 @@ public void apply(Project project) { t.setDescription("(Re)generates a transport version definition file"); t.getReferencesFiles().setFrom(tvReferencesConfig); t.getIncrement().convention(1000); - Version esVersion = VersionProperties.getElasticsearchVersion(); - t.getCurrentUpperBoundName().convention(esVersion.getMajor() + "." + esVersion.getMinor()); + t.getCurrentUpperBoundName().convention(currentVersion.getMajor() + "." + currentVersion.getMinor()); }); validateTask.configure(t -> t.mustRunAfter(generateDefinitionsTask)); @@ -92,8 +98,9 @@ public void apply(Project project) { .register("generateInitialTransportVersion", GenerateInitialTransportVersionTask.class, t -> { t.setGroup(taskGroup); t.setDescription("(Re)generates an initial transport version for an Elasticsearch release version"); - Property buildParams = loadBuildParams(project); - t.getBwcVersions().set(buildParams.get().getBwcVersionsProvider()); + + System.out.println("Setting current version: " + currentVersion); + t.getCurrentVersion().set(currentVersion); }); validateTask.configure(t -> t.mustRunAfter(generateInitialTask)); } From 623e5a22d49999bac58d1cbde82ff4aacecf032e Mon Sep 17 00:00:00 2001 From: elasticsearchmachine Date: Tue, 9 Sep 2025 04:50:22 +0000 Subject: [PATCH 3/6] [CI] Auto commit changes from spotless --- .../internal/transport/TransportVersionResourcesPlugin.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesPlugin.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesPlugin.java index 0c7e2b63b4623..4b52c3ad3dd50 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesPlugin.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesPlugin.java @@ -10,23 +10,18 @@ package org.elasticsearch.gradle.internal.transport; import org.elasticsearch.gradle.Version; -import org.elasticsearch.gradle.VersionProperties; import org.elasticsearch.gradle.internal.ProjectSubscribeServicePlugin; import org.elasticsearch.gradle.internal.conventions.VersionPropertiesPlugin; -import org.elasticsearch.gradle.internal.info.BuildParameterExtension; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.file.Directory; import org.gradle.api.plugins.JavaPlugin; -import org.gradle.api.provider.Property; import org.gradle.api.tasks.Copy; import org.gradle.language.base.plugins.LifecycleBasePlugin; import java.util.Map; import java.util.Properties; -import static org.elasticsearch.gradle.internal.util.ParamsUtils.loadBuildParams; - public class TransportVersionResourcesPlugin implements Plugin { public static final String TRANSPORT_REFERENCES_TOPIC = "transportReferences"; From 45d54780d5d05a4e92d7b075f669810d7abe8ad1 Mon Sep 17 00:00:00 2001 From: Ryan Ernst Date: Tue, 9 Sep 2025 11:23:29 -0700 Subject: [PATCH 4/6] fix test --- .../transport/TransportVersionGenerationFuncTest.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/TransportVersionGenerationFuncTest.groovy b/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/TransportVersionGenerationFuncTest.groovy index 49f849a9996d3..21a8b6a95e105 100644 --- a/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/TransportVersionGenerationFuncTest.groovy +++ b/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/TransportVersionGenerationFuncTest.groovy @@ -412,7 +412,7 @@ class TransportVersionGenerationFuncTest extends AbstractTransportVersionFuncTes def result = runGenerateTask("--backport-branches=9.1,8.13,7.17,6.0").buildAndFail() then: - assertGenerateFailure(result, "Missing upper bounds files for branches [6.0, 7.17, 8.13], known branches are [9.0, 9.1, 9.2]") + assertGenerateFailure(result, "Missing upper bounds files for branches [6.0, 7.17, 8.13], known branches are [8.19, 9.0, 9.1, 9.2]") } def "name can be found from committed definition"() { From 4118497995fd57bd0ba5ef848a71154609a1225b Mon Sep 17 00:00:00 2001 From: Ryan Ernst Date: Tue, 9 Sep 2025 11:26:54 -0700 Subject: [PATCH 5/6] cleanup --- .../AbstractTransportVersionFuncTest.groovy | 2 +- .../fixtures/AbstractGradleFuncTest.groovy | 28 +++++++++++++------ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/AbstractTransportVersionFuncTest.groovy b/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/AbstractTransportVersionFuncTest.groovy index 6350d315187aa..f672d3fdf060e 100644 --- a/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/AbstractTransportVersionFuncTest.groovy +++ b/build-tools-internal/src/integTest/groovy/org/elasticsearch/gradle/internal/transport/AbstractTransportVersionFuncTest.groovy @@ -110,7 +110,7 @@ class AbstractTransportVersionFuncTest extends AbstractGradleFuncTest { def setup() { configurationCacheCompatible = false - internalBuild([], "9.2.0", ["9.1": "9.1.1", "9.0": "9.0.2", "8.19": "8.19.7"]) + internalBuild() settingsFile << """ include ':myserver' include ':myplugin' diff --git a/build-tools/src/testFixtures/groovy/org/elasticsearch/gradle/fixtures/AbstractGradleFuncTest.groovy b/build-tools/src/testFixtures/groovy/org/elasticsearch/gradle/fixtures/AbstractGradleFuncTest.groovy index e7b71913e9bd4..553d5ea7d8d40 100644 --- a/build-tools/src/testFixtures/groovy/org/elasticsearch/gradle/fixtures/AbstractGradleFuncTest.groovy +++ b/build-tools/src/testFixtures/groovy/org/elasticsearch/gradle/fixtures/AbstractGradleFuncTest.groovy @@ -172,11 +172,13 @@ abstract class AbstractGradleFuncTest extends Specification { File internalBuild( List extraPlugins = [], - String currentVersion = "9.0.0", - Map backportVersionsByBranch = - ["8.x": "8.4.0", "8.3": "8.3.0", "8.2": "8.2.1", "8.1": "8.1.3", "7.16": "7.16.10"] + String maintenance = "7.16.10", + String major4 = "8.1.3", + String major3 = "8.2.1", + String major2 = "8.3.0", + String major1 = "8.4.0", + String current = "9.0.0" ) { - Collection backportVersions = backportVersionsByBranch.values() buildFile << """plugins { id 'elasticsearch.global-build-info' ${extraPlugins.collect { p -> "id '$p'" }.join('\n')} @@ -187,15 +189,23 @@ abstract class AbstractGradleFuncTest extends Specification { import org.elasticsearch.gradle.internal.info.DevelopmentBranch import org.elasticsearch.gradle.Version - Version currentVersion = Version.fromString("${currentVersion}") + Version currentVersion = Version.fromString("${current}") def versionList = [ - ${backportVersions.collect {"Version.fromString(\"${ it }\")," }.join(System.lineSeparator())} - currentVersion + Version.fromString("$maintenance"), + Version.fromString("$major4"), + Version.fromString("$major3"), + Version.fromString("$major2"), + Version.fromString("$major1"), + currentVersion ] BwcVersions versions = new BwcVersions(currentVersion, versionList, [ - new DevelopmentBranch('main', currentVersion), - ${backportVersionsByBranch.collect {"new DevelopmentBranch('${ it.key }', Version.fromString(\"${ it.value }\"))," }.join(System.lineSeparator())} + new DevelopmentBranch('main', Version.fromString("$current")), + new DevelopmentBranch('8.x', Version.fromString("$major1")), + new DevelopmentBranch('8.3', Version.fromString("$major2")), + new DevelopmentBranch('8.2', Version.fromString("$major3")), + new DevelopmentBranch('8.1', Version.fromString("$major4")), + new DevelopmentBranch('7.16', Version.fromString("$maintenance")), ]) buildParams.setBwcVersions(project.provider { versions } ) """ From 5937b16e8117981f5f5798af8a294bd73a96c778 Mon Sep 17 00:00:00 2001 From: Ryan Ernst Date: Tue, 9 Sep 2025 12:52:36 -0700 Subject: [PATCH 6/6] remove printout --- .../internal/transport/TransportVersionResourcesPlugin.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesPlugin.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesPlugin.java index 4b52c3ad3dd50..bca2dbaca2f66 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesPlugin.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/transport/TransportVersionResourcesPlugin.java @@ -93,8 +93,6 @@ public void apply(Project project) { .register("generateInitialTransportVersion", GenerateInitialTransportVersionTask.class, t -> { t.setGroup(taskGroup); t.setDescription("(Re)generates an initial transport version for an Elasticsearch release version"); - - System.out.println("Setting current version: " + currentVersion); t.getCurrentVersion().set(currentVersion); }); validateTask.configure(t -> t.mustRunAfter(generateInitialTask));