diff --git a/.github/BuildMatrix.java b/.github/BuildMatrix.java index 9268703569b..d90ec4bd37e 100755 --- a/.github/BuildMatrix.java +++ b/.github/BuildMatrix.java @@ -34,6 +34,9 @@ public static void main(String... args) throws Exception { .map(Semver::parse) .filter(it -> it.getPreRelease().isEmpty() || it.getPreRelease().get(0).equals("")) .filter(it -> it.isGreaterThanOrEqualTo("7.0.0")) + // these releases refuse to start on Linux 6.19 and newer, which the runners use + // (https://jira.mongodb.org/browse/SERVER-121912). Later patch releases are picked up automatically. + .filter(it -> !it.isEqualTo("8.0.34") && !it.isEqualTo("8.3.13")) .map(it -> format("'%s'", it)) .collect(Collectors.toList()); System.out.println(result); diff --git a/core/src/test/java/dev/morphia/test/MongoExtension.java b/core/src/test/java/dev/morphia/test/MongoExtension.java index 25e26c175f3..15737b0fc28 100644 --- a/core/src/test/java/dev/morphia/test/MongoExtension.java +++ b/core/src/test/java/dev/morphia/test/MongoExtension.java @@ -10,7 +10,6 @@ import org.junit.jupiter.api.extension.AfterAllCallback; import org.junit.jupiter.api.extension.BeforeAllCallback; import org.junit.jupiter.api.extension.ExtensionContext; -import org.semver4j.Semver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testcontainers.containers.MongoDBContainer; @@ -25,21 +24,43 @@ public class MongoExtension implements BeforeAllCallback, AfterAllCallback { private static MongoDBContainer container; private static MongoClient mongoClient; + /** + * The server version to test against when {@code -Dmongodb} isn't given. A version without a patch number uses that + * release line's latest image. Not 8.0 or 8.3: 8.0.34 and 8.3.13 refuse to start on Linux 6.19 and newer + * (SERVER-121912). + */ + static final String DEFAULT_MONGODB = "8.2"; + + /** + * @return the server version to test against, from {@code -Dmongodb}: a version such as {@code 8.2.12} or + * {@code 8.2}, or {@code local} + */ + static String mongodbVersion() { + return System.getProperty("mongodb", DEFAULT_MONGODB); + } + + /** + * @param version a server version such as {@code 8.2.12}, or {@code 8.2} for that line's latest release + * @return the image for exactly that version + */ + static DockerImageName imageName(String version) { + return DockerImageName.parse("mongo:" + version) + .asCompatibleSubstituteFor("mongo"); + } + @Override public void beforeAll(ExtensionContext context) { synchronized (LOCK) { if (mongoClient != null) { return; } - String mongodb = System.getProperty("mongodb", "8.0.0"); + String mongodb = mongodbVersion(); String connectionString; if ("local".equals(mongodb)) { LOG.info("'local' mongodb property specified. Using local server."); connectionString = "mongodb://localhost:27017/"; } else { - int version = Semver.parse(mongodb).getMajor(); - DockerImageName imageName = DockerImageName.parse("mongo:" + version) - .asCompatibleSubstituteFor("mongo"); + DockerImageName imageName = imageName(mongodb); LOG.info("Running tests using " + imageName); container = new MongoDBContainer(imageName); container.start(); diff --git a/core/src/test/java/dev/morphia/test/TestBase.java b/core/src/test/java/dev/morphia/test/TestBase.java index b714014f85d..99330c12952 100644 --- a/core/src/test/java/dev/morphia/test/TestBase.java +++ b/core/src/test/java/dev/morphia/test/TestBase.java @@ -60,7 +60,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testcontainers.containers.MongoDBContainer; -import org.testcontainers.utility.DockerImageName; import static com.mongodb.MongoClientSettings.builder; import static dev.morphia.internal.MorphiaInternals.proxyClassesPresent; @@ -267,17 +266,14 @@ protected void withSharding(Runnable body) { var savedDatastore = datastore; var savedDatabase = database; try { - String mongodb = System.getProperty("mongodb", "8.0.0"); + String mongodb = MongoExtension.mongodbVersion(); if ("local".equals(mongodb)) { morphiaConfig = MorphiaConfig.load(); datastore = null; database = null; body.run(); } else { - int version = Semver.parse(mongodb).getMajor(); - DockerImageName imageName = DockerImageName.parse("mongo:" + version) - .asCompatibleSubstituteFor("mongo"); - MongoDBContainer shardedContainer = new MongoDBContainer(imageName).withSharding(); + MongoDBContainer shardedContainer = new MongoDBContainer(MongoExtension.imageName(mongodb)).withSharding(); shardedContainer.start(); try (MongoClient shardedClient = MongoClients.create(builder() .uuidRepresentation(UuidRepresentation.STANDARD)