diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 4d1c7e327..fbc73fcb5 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -16,3 +16,53 @@ updates:
allow:
- dependency-name: "actions/*"
- dependency-name: "redhat-actions/*"
+
+ - package-ecosystem: "gradle"
+ directory: "/"
+ schedule:
+ interval: "weekly"
+ day: "tuesday"
+ open-pull-requests-limit: 20
+ groups:
+ hibernate-validator:
+ patterns:
+ - "org.hibernate.validator*"
+ - "org.glassfish.expressly*"
+ hibernate:
+ patterns:
+ - "org.hibernate*"
+ vertx:
+ patterns:
+ - "io.vertx*"
+ mutiny:
+ patterns:
+ - "io.smallrye.reactive*"
+ # Testcontainers plus the JDBC driver we need for testing
+ testcontainers:
+ patterns:
+ - "org.testcontainers*"
+ - "com.ibm.db2*"
+ - "com.microsoft.sqlserver*"
+ - "org.postgresql*"
+ - "con.ongres.scram*"
+ - "com.fasterxml.jackson.core*"
+ - "com.mysql*"
+ - "org.mariadb.jdbc*"
+
+ ignore:
+ # For Hibernate Validator, we will need to update major version manually as needed (but we only use it in tests)
+ - dependency-name: "org.glassfish.expressly*"
+ update-types: ["version-update-:semver-major"]
+ # Only patches for Hibernate ORM and Vert.x
+ - dependency-name: "org.hibernate*"
+ update-types: ["version-update:semver-major", "version-update:semver-minor"]
+ - dependency-name: "io.vertx*"
+ update-types: ["version-update:semver-major", "version-update:semver-minor"]
+
+ # Dockerfiles in tooling/docker/, and database services we use for examples (MySQL and PostgreSQL)
+ - package-ecosystem: "docker"
+ directory: "/tooling/docker"
+ schedule:
+ interval: "weekly"
+ allow:
+ - dependency-type: "all"
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index af832654c..e81eae258 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -49,8 +49,7 @@ jobs:
services:
# Label used to access the service container
mysql:
- # Docker Hub image
- image: mysql:9.2.0
+ image: container-registry.oracle.com/mysql/community-server:9.3.0
env:
MYSQL_ROOT_PASSWORD: hreact
MYSQL_DATABASE: hreact
diff --git a/build.gradle b/build.gradle
index 532d932ef..d6a172b6f 100644
--- a/build.gradle
+++ b/build.gradle
@@ -5,7 +5,6 @@ plugins {
id 'maven-publish'
alias(libs.plugins.com.diffplug.spotless)
alias(libs.plugins.org.asciidoctor.jvm.convert) apply false
- alias(libs.plugins.io.github.gradle.nexus.publish.plugin)
}
group = "org.hibernate.reactive"
@@ -52,6 +51,12 @@ subprojects {
options.encoding = 'UTF-8'
}
+ // Configure test tasks for all subprojects
+ tasks.withType( Test ).configureEach {
+ // Set the project root for finding Docker files - available to all modules
+ systemProperty 'hibernate.reactive.project.root', rootProject.projectDir.absolutePath
+ }
+
if ( !gradle.ext.javaToolchainEnabled ) {
sourceCompatibility = JavaVersion.toVersion( gradle.ext.baselineJavaVersion )
targetCompatibility = JavaVersion.toVersion( gradle.ext.baselineJavaVersion )
diff --git a/ci/snapshot-publish.Jenkinsfile b/ci/snapshot-publish.Jenkinsfile
index e50eb4cac..7fb8f9444 100644
--- a/ci/snapshot-publish.Jenkinsfile
+++ b/ci/snapshot-publish.Jenkinsfile
@@ -40,7 +40,6 @@ pipeline {
steps {
script {
withCredentials([
- // https://github.com/gradle-nexus/publish-plugin#publishing-to-maven-central-via-sonatype-ossrh
// TODO: Once we switch to maven-central publishing (from nexus2) we need to update credentialsId:
// https://docs.gradle.org/current/samples/sample_publishing_credentials.html#:~:text=via%20environment%20variables
usernamePassword(credentialsId: 'central.sonatype.com', passwordVariable: 'ORG_GRADLE_PROJECT_snapshotsPassword', usernameVariable: 'ORG_GRADLE_PROJECT_snapshotsUsername'),
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 816a2efb5..9967083b5 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,24 +1,25 @@
[versions]
assertjVersion = "3.27.3"
-hibernateOrmVersion = "7.0.2.Final"
-hibernateOrmGradlePluginVersion = "7.0.2.Final"
-jacksonDatabindVersion = "2.15.2"
+hibernateOrmVersion = "7.0.6.Final"
+hibernateOrmGradlePluginVersion = "7.0.6.Final"
+jacksonDatabindVersion = "2.19.1"
jbossLoggingAnnotationVersion = "3.0.4.Final"
jbossLoggingVersion = "3.6.1.Final"
-junitVersion = "5.11.3"
-log4jVersion = "2.20.0"
-testcontainersVersion = "1.21.0"
+junitVersion = "5.13.3"
+junitPlatformVersion = "1.13.3"
+log4jVersion = "2.25.1"
+testcontainersVersion = "1.21.3"
vertxSqlClientVersion = "4.5.16"
vertxWebVersion= "4.5.16"
vertxWebClientVersion = "4.5.16"
[libraries]
com-fasterxml-jackson-core-jackson-databind = { group = "com.fasterxml.jackson.core", name = "jackson-databind", version.ref = "jacksonDatabindVersion" }
-com-ibm-db2-jcc = { group = "com.ibm.db2", name = "jcc", version = "12.1.0.0" }
-com-microsoft-sqlserver-mssql-jdbc = { group = "com.microsoft.sqlserver", name = "mssql-jdbc", version = "12.10.0.jre11" }
+com-ibm-db2-jcc = { group = "com.ibm.db2", name = "jcc", version = "12.1.2.0" }
+com-microsoft-sqlserver-mssql-jdbc = { group = "com.microsoft.sqlserver", name = "mssql-jdbc", version = "13.1.0.jre11-preview" }
com-mysql-mysql-connector-j = { group = "com.mysql", name = "mysql-connector-j", version = "9.3.0" }
com-ongres-scram-client = { group = "com.ongres.scram", name = "client", version = "2.1" }
-io-smallrye-reactive-mutiny = { group = "io.smallrye.reactive", name = "mutiny", version = "2.9.0" }
+io-smallrye-reactive-mutiny = { group = "io.smallrye.reactive", name = "mutiny", version = "2.9.3" }
io-vertx-vertx-db2-client = { group = "io.vertx", name = "vertx-db2-client", version.ref = "vertxSqlClientVersion" }
io-vertx-vertx-junit5 = { group = "io.vertx", name = "vertx-junit5", version.ref = "vertxSqlClientVersion" }
io-vertx-vertx-micrometer-metrics = { group = "io.vertx", name = "vertx-micrometer-metrics", version.ref = "vertxSqlClientVersion" }
@@ -42,8 +43,9 @@ org-jboss-logging-jboss-logging-annotations = { group = "org.jboss.logging", nam
org-jboss-logging-jboss-logging-processor = { group = "org.jboss.logging", name = "jboss-logging-processor", version.ref = "jbossLoggingAnnotationVersion" }
org-junit-jupiter-junit-jupiter-api = { group = "org.junit.jupiter", name = "junit-jupiter-api", version.ref = "junitVersion" }
org-junit-jupiter-junit-jupiter-engine = { group = "org.junit.jupiter", name = "junit-jupiter-engine", version.ref = "junitVersion" }
-org-mariadb-jdbc-mariadb-java-client = { group = "org.mariadb.jdbc", name = "mariadb-java-client", version = "3.5.3" }
-org-postgresql-postgresql = { group = "org.postgresql", name = "postgresql", version = "42.7.5" }
+org-junit-platform-junit-platform-launcher = { group = "org.junit.platform", name = "junit-platform-launcher", version = "junitPlatformVersion" }
+org-mariadb-jdbc-mariadb-java-client = { group = "org.mariadb.jdbc", name = "mariadb-java-client", version = "3.5.4" }
+org-postgresql-postgresql = { group = "org.postgresql", name = "postgresql", version = "42.7.7" }
org-testcontainers-cockroachdb = { group = "org.testcontainers", name = "cockroachdb", version.ref = "testcontainersVersion" }
org-testcontainers-db2 = { group = "org.testcontainers", name = "db2", version.ref = "testcontainersVersion" }
org-testcontainers-mariadb = { group = "org.testcontainers", name = "mariadb", version.ref = "testcontainersVersion" }
@@ -53,7 +55,6 @@ org-testcontainers-oracle-xe = { group = "org.testcontainers", name = "oracle-xe
org-testcontainers-postgresql = { group = "org.testcontainers", name = "postgresql", version.ref = "testcontainersVersion" }
[plugins]
-com-diffplug-spotless = { id = "com.diffplug.spotless", version = "6.25.0" }
-io-github-gradle-nexus-publish-plugin = { id = "io.github.gradle-nexus.publish-plugin", version = "1.3.0" }
-org-asciidoctor-jvm-convert = { id = "org.asciidoctor.jvm.convert", version = "4.0.2" }
+com-diffplug-spotless = { id = "com.diffplug.spotless", version = "7.1.0" }
+org-asciidoctor-jvm-convert = { id = "org.asciidoctor.jvm.convert", version = "4.0.4" }
org-hibernate-orm = { id = "org.hibernate.orm", version.ref = "hibernateOrmGradlePluginVersion" }
diff --git a/gradle/version.properties b/gradle/version.properties
index 88292cf88..8145f2a96 100644
--- a/gradle/version.properties
+++ b/gradle/version.properties
@@ -1 +1 @@
-projectVersion=3.0.4.Final
\ No newline at end of file
+projectVersion=3.0.5.Final
\ No newline at end of file
diff --git a/hibernate-reactive-core/build.gradle b/hibernate-reactive-core/build.gradle
index 04f35e985..1a6ad9efe 100644
--- a/hibernate-reactive-core/build.gradle
+++ b/hibernate-reactive-core/build.gradle
@@ -44,6 +44,7 @@ dependencies {
// JUnit Jupiter
testImplementation(libs.org.junit.jupiter.junit.jupiter.api)
testRuntimeOnly(libs.org.junit.jupiter.junit.jupiter.engine)
+ testRuntimeOnly(libs.org.junit.platform.junit.platform.launcher)
// JDBC driver to test with ORM and PostgreSQL
testRuntimeOnly(libs.org.postgresql.postgresql)
diff --git a/hibernate-reactive-core/src/test/java/org/hibernate/reactive/MutinySessionTest.java b/hibernate-reactive-core/src/test/java/org/hibernate/reactive/MutinySessionTest.java
index bf46f835a..31bcf2380 100644
--- a/hibernate-reactive-core/src/test/java/org/hibernate/reactive/MutinySessionTest.java
+++ b/hibernate-reactive-core/src/test/java/org/hibernate/reactive/MutinySessionTest.java
@@ -27,7 +27,13 @@
import jakarta.persistence.metamodel.EntityType;
import static java.util.concurrent.TimeUnit.MINUTES;
-import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
@Timeout(value = 10, timeUnit = MINUTES)
diff --git a/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/CockroachDBDatabase.java b/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/CockroachDBDatabase.java
index e1a0928d1..172ace2bc 100644
--- a/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/CockroachDBDatabase.java
+++ b/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/CockroachDBDatabase.java
@@ -12,7 +12,7 @@
import org.testcontainers.containers.CockroachContainer;
import org.testcontainers.containers.Container;
-import static org.hibernate.reactive.containers.DockerImage.imageName;
+import static org.hibernate.reactive.containers.DockerImage.fromDockerfile;
class CockroachDBDatabase extends PostgreSQLDatabase {
@@ -25,7 +25,7 @@ class CockroachDBDatabase extends PostgreSQLDatabase {
* TIP: To reuse the same containers across multiple runs, set `testcontainers.reuse.enable=true` in a file located
* at `$HOME/.testcontainers.properties` (create the file if it does not exist).
*/
- public static final CockroachContainer cockroachDb = new CockroachContainer( imageName( "cockroachdb/cockroach", "v24.3.13" ) )
+ public static final CockroachContainer cockroachDb = new CockroachContainer( fromDockerfile( "cockroachdb" ) )
// Username, password and database are not supported by test container at the moment
// Testcontainers will use a database named 'postgres' and the 'root' user
.withReuse( true );
diff --git a/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/DB2Database.java b/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/DB2Database.java
index dfeeaf15c..c2b60e3d6 100644
--- a/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/DB2Database.java
+++ b/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/DB2Database.java
@@ -28,7 +28,7 @@
import org.testcontainers.containers.Db2Container;
-import static org.hibernate.reactive.containers.DockerImage.imageName;
+import static org.hibernate.reactive.containers.DockerImage.fromDockerfile;
class DB2Database implements TestableDatabase {
@@ -87,7 +87,7 @@ class DB2Database implements TestableDatabase {
* TIP: To reuse the same containers across multiple runs, set `testcontainers.reuse.enable=true` in a file located
* at `$HOME/.testcontainers.properties` (create the file if it does not exist).
*/
- static final Db2Container db2 = new Db2Container( imageName( "icr.io", "db2_community/db2", "12.1.0.0" ) )
+ static final Db2Container db2 = new Db2Container( fromDockerfile( "db2" ) )
.withUsername( DatabaseConfiguration.USERNAME )
.withPassword( DatabaseConfiguration.PASSWORD )
.withDatabaseName( DatabaseConfiguration.DB_NAME )
diff --git a/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/DockerImage.java b/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/DockerImage.java
index 1b2f3f6a7..e8f40f34d 100644
--- a/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/DockerImage.java
+++ b/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/DockerImage.java
@@ -5,10 +5,17 @@
*/
package org.hibernate.reactive.containers;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
+
import org.testcontainers.utility.DockerImageName;
+
/**
- * A utility class with methods to generate {@link DockerImageName} for testcontainers.
+ * A utility class with methods to generate a {@link DockerImageName} for Testcontainers.
*
* Testcontainers might not work if the image required is available in multiple different registries (for example when
* using podman instead of docker).
@@ -17,10 +24,28 @@
*/
public final class DockerImage {
- public static final String DEFAULT_REGISTRY = "docker.io";
+ /**
+ * The absolute path of the project root that we have set in Gradle.
+ */
+ private static final String PROJECT_ROOT = System.getProperty( "hibernate.reactive.project.root" );
+
+ /**
+ * The path to the directory containing all the Dockerfile files
+ */
+ private static final Path DOCKERFILE_DIR_PATH = Path.of( PROJECT_ROOT ).resolve( "tooling" ).resolve( "docker" );
- public static DockerImageName imageName(String image, String version) {
- return imageName( DEFAULT_REGISTRY, image, version );
+ /**
+ * Extract the image name and version from the first FROM instruction in the Dockerfile.
+ * Note that everything else is ignored.
+ */
+ public static DockerImageName fromDockerfile(String databaseName) {
+ try {
+ final ImageInformation imageInformation = readFromInstruction( databaseName.toLowerCase() );
+ return imageName( imageInformation.getRegistry(), imageInformation.getImage(), imageInformation.getVersion() );
+ }
+ catch (IOException e) {
+ throw new RuntimeException( e );
+ }
}
public static DockerImageName imageName(String registry, String image, String version) {
@@ -28,4 +53,74 @@ public static DockerImageName imageName(String registry, String image, String ve
.parse( registry + "/" + image + ":" + version )
.asCompatibleSubstituteFor( image );
}
+
+ private static class ImageInformation {
+ private final String registry;
+ private final String image;
+ private final String version;
+
+ public ImageInformation(String fullImageInfo) {
+ // FullImageInfo pattern: /:
+ // For example: "docker.io/cockroachdb/cockroach:v24.3.13" becomes registry = "docker.io", image = "cockroachdb/cockroach", version = "v24.3.13"
+ final int registryEndPos = fullImageInfo.indexOf( '/' );
+ final int imageEndPos = fullImageInfo.lastIndexOf( ':' );
+ this.registry = fullImageInfo.substring( 0, registryEndPos );
+ this.image = fullImageInfo.substring( registryEndPos + 1, imageEndPos );
+ this.version = fullImageInfo.substring( imageEndPos + 1 );
+ }
+
+ public String getRegistry() {
+ return registry;
+ }
+
+ public String getImage() {
+ return image;
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ @Override
+ public String toString() {
+ return registry + "/" + image + ":" + version;
+ }
+ }
+
+ private static Path dockerFilePath(String database) {
+ // Get project root from system property set by Gradle, with fallback
+ return DOCKERFILE_DIR_PATH.resolve( database.toLowerCase() + ".Dockerfile" );
+ }
+
+ private static ImageInformation readFromInstruction(String database) throws IOException {
+ return readFromInstruction( dockerFilePath( database ) );
+ }
+
+ /**
+ * Read a Dockerfile and extract the first FROM instruction.
+ *
+ * @param dockerfilePath path to the Dockerfile
+ * @return the first FROM instruction found, or empty if none found
+ * @throws IOException if the file cannot be read
+ */
+ private static ImageInformation readFromInstruction(Path dockerfilePath) throws IOException {
+ if ( !Files.exists( dockerfilePath ) ) {
+ throw new FileNotFoundException( "Dockerfile not found: " + dockerfilePath );
+ }
+
+ List lines = Files.readAllLines( dockerfilePath );
+ for ( String line : lines ) {
+ // Skip comments and empty lines
+ String trimmedLine = line.trim();
+ if ( trimmedLine.isEmpty() || trimmedLine.startsWith( "#" ) ) {
+ continue;
+ }
+
+ if ( trimmedLine.startsWith( "FROM " ) ) {
+ return new ImageInformation( trimmedLine.substring( "FROM ".length() ) );
+ }
+ }
+
+ throw new IOException( " Missing FROM instruction in " + dockerfilePath );
+ }
}
diff --git a/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/MSSQLServerDatabase.java b/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/MSSQLServerDatabase.java
index aeb1b8fb0..eaab2e8fb 100644
--- a/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/MSSQLServerDatabase.java
+++ b/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/MSSQLServerDatabase.java
@@ -28,7 +28,7 @@
import org.testcontainers.containers.MSSQLServerContainer;
-import static org.hibernate.reactive.containers.DockerImage.imageName;
+import static org.hibernate.reactive.containers.DockerImage.fromDockerfile;
/**
* The JDBC driver syntax is:
@@ -96,7 +96,7 @@ class MSSQLServerDatabase implements TestableDatabase {
* TIP: To reuse the same containers across multiple runs, set `testcontainers.reuse.enable=true` in a file located
* at `$HOME/.testcontainers.properties` (create the file if it does not exist).
*/
- public static final MSSQLServerContainer> mssqlserver = new MSSQLServerContainer<>( imageName( "mcr.microsoft.com", "mssql/server", "2022-latest" ) )
+ public static final MSSQLServerContainer> mssqlserver = new MSSQLServerContainer<>( fromDockerfile( "sqlserver" ) )
.acceptLicense()
.withPassword( PASSWORD )
.withReuse( true );
diff --git a/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/MariaDatabase.java b/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/MariaDatabase.java
index 16a5f97ff..14d60c264 100644
--- a/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/MariaDatabase.java
+++ b/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/MariaDatabase.java
@@ -13,7 +13,7 @@
import org.testcontainers.containers.MariaDBContainer;
-import static org.hibernate.reactive.containers.DockerImage.imageName;
+import static org.hibernate.reactive.containers.DockerImage.fromDockerfile;
class MariaDatabase extends MySQLDatabase {
@@ -36,7 +36,7 @@ class MariaDatabase extends MySQLDatabase {
* TIP: To reuse the same containers across multiple runs, set `testcontainers.reuse.enable=true` in a file located
* at `$HOME/.testcontainers.properties` (create the file if it does not exist).
*/
- public static final MariaDBContainer> maria = new MariaDBContainer<>( imageName( "mariadb", "11.7.2" ) )
+ public static final MariaDBContainer> maria = new MariaDBContainer<>( fromDockerfile( "maria" ) )
.withUsername( DatabaseConfiguration.USERNAME )
.withPassword( DatabaseConfiguration.PASSWORD )
.withDatabaseName( DatabaseConfiguration.DB_NAME )
diff --git a/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/MySQLDatabase.java b/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/MySQLDatabase.java
index e0aa9ef3a..5b5ad5d2c 100644
--- a/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/MySQLDatabase.java
+++ b/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/MySQLDatabase.java
@@ -5,7 +5,7 @@
*/
package org.hibernate.reactive.containers;
-import static org.hibernate.reactive.containers.DockerImage.imageName;
+import static org.hibernate.reactive.containers.DockerImage.fromDockerfile;
import java.io.Serializable;
import java.math.BigDecimal;
@@ -87,7 +87,7 @@ class MySQLDatabase implements TestableDatabase {
* TIP: To reuse the same containers across multiple runs, set `testcontainers.reuse.enable=true` in a file located
* at `$HOME/.testcontainers.properties` (create the file if it does not exist).
*/
- public static final MySQLContainer> mysql = new MySQLContainer<>( imageName( "mysql", "9.2.0") )
+ public static final MySQLContainer> mysql = new MySQLContainer<>( fromDockerfile( "mysql" ).asCompatibleSubstituteFor( "mysql" ) )
.withUsername( DatabaseConfiguration.USERNAME )
.withPassword( DatabaseConfiguration.PASSWORD )
.withDatabaseName( DatabaseConfiguration.DB_NAME )
diff --git a/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/OracleDatabase.java b/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/OracleDatabase.java
index d57f9103a..bbde95e6c 100644
--- a/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/OracleDatabase.java
+++ b/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/OracleDatabase.java
@@ -29,7 +29,7 @@
import org.testcontainers.containers.OracleContainer;
-import static org.hibernate.reactive.containers.DockerImage.imageName;
+import static org.hibernate.reactive.containers.DockerImage.fromDockerfile;
/**
* Connection string for Oracle thin should be something like:
@@ -88,9 +88,7 @@ class OracleDatabase implements TestableDatabase {
}
}
- public static final OracleContainer oracle = new OracleContainer(
- imageName( "gvenzl/oracle-free", "23-slim-faststart" )
- .asCompatibleSubstituteFor( "gvenzl/oracle-xe" ) )
+ public static final OracleContainer oracle = new OracleContainer( fromDockerfile( "oracle" ).asCompatibleSubstituteFor( "gvenzl/oracle-xe" ) )
.withUsername( DatabaseConfiguration.USERNAME )
.withPassword( DatabaseConfiguration.PASSWORD )
.withDatabaseName( DatabaseConfiguration.DB_NAME )
diff --git a/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/PostgreSQLDatabase.java b/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/PostgreSQLDatabase.java
index 56ef4f878..f6a974ba2 100644
--- a/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/PostgreSQLDatabase.java
+++ b/hibernate-reactive-core/src/test/java/org/hibernate/reactive/containers/PostgreSQLDatabase.java
@@ -5,8 +5,6 @@
*/
package org.hibernate.reactive.containers;
-import static org.hibernate.reactive.containers.DockerImage.imageName;
-
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
@@ -30,9 +28,11 @@
import org.testcontainers.containers.PostgreSQLContainer;
+import static org.hibernate.reactive.containers.DockerImage.fromDockerfile;
+
class PostgreSQLDatabase implements TestableDatabase {
- public static PostgreSQLDatabase INSTANCE = new PostgreSQLDatabase();
+ public static final PostgreSQLDatabase INSTANCE = new PostgreSQLDatabase();
private static Map, String> expectedDBTypeForClass = new HashMap<>();
@@ -87,7 +87,7 @@ class PostgreSQLDatabase implements TestableDatabase {
* TIP: To reuse the same containers across multiple runs, set `testcontainers.reuse.enable=true` in a file located
* at `$HOME/.testcontainers.properties` (create the file if it does not exist).
*/
- public static final PostgreSQLContainer> postgresql = new PostgreSQLContainer<>( imageName( "postgres", "17.5" ) )
+ public static final PostgreSQLContainer> postgresql = new PostgreSQLContainer<>( fromDockerfile( "postgresql" ) )
.withUsername( DatabaseConfiguration.USERNAME )
.withPassword( DatabaseConfiguration.PASSWORD )
.withDatabaseName( DatabaseConfiguration.DB_NAME )
diff --git a/integration-tests/bytecode-enhancements-it/src/test/java/org/hibernate/reactive/it/BaseReactiveIT.java b/integration-tests/bytecode-enhancements-it/src/test/java/org/hibernate/reactive/it/BaseReactiveIT.java
index 2388cb421..8f6081a8a 100644
--- a/integration-tests/bytecode-enhancements-it/src/test/java/org/hibernate/reactive/it/BaseReactiveIT.java
+++ b/integration-tests/bytecode-enhancements-it/src/test/java/org/hibernate/reactive/it/BaseReactiveIT.java
@@ -52,9 +52,7 @@ public abstract class BaseReactiveIT {
// These properties are in DatabaseConfiguration in core
public static final boolean USE_DOCKER = Boolean.getBoolean( "docker" );
- public static final DockerImageName IMAGE_NAME = DockerImageName
- .parse( "docker.io/postgres:17.5" )
- .asCompatibleSubstituteFor( "postgres" );
+ public static final DockerImageName IMAGE_NAME = DockerImage.fromDockerfile( "postgresql" );
public static final String USERNAME = "hreact";
public static final String PASSWORD = "hreact";
diff --git a/integration-tests/bytecode-enhancements-it/src/test/java/org/hibernate/reactive/it/DockerImage.java b/integration-tests/bytecode-enhancements-it/src/test/java/org/hibernate/reactive/it/DockerImage.java
new file mode 100644
index 000000000..b5621249d
--- /dev/null
+++ b/integration-tests/bytecode-enhancements-it/src/test/java/org/hibernate/reactive/it/DockerImage.java
@@ -0,0 +1,125 @@
+/* Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * Copyright: Red Hat Inc. and Hibernate Authors
+ */
+package org.hibernate.reactive.it;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
+
+import org.testcontainers.utility.DockerImageName;
+
+/**
+ * A utility class with methods to generate a {@link DockerImageName} for Testcontainers.
+ *
+ * Testcontainers might not work if the image required is available in multiple different registries (for example when
+ * using podman instead of docker).
+ * These methods make sure to pick a registry as default.
+ *
+ */
+public final class DockerImage {
+
+ /**
+ * The absolute path of the project root that we have set in Gradle.
+ */
+ private static final String PROJECT_ROOT = System.getProperty( "hibernate.reactive.project.root" );
+
+ /**
+ * The path to the directory containing all the Dockerfile files
+ */
+ private static final Path DOCKERFILE_DIR_PATH = Path.of( PROJECT_ROOT ).resolve( "tooling" ).resolve( "docker" );
+
+ /**
+ * Extract the image name and version from the first FROM instruction in the Dockerfile.
+ * Note that everything else is ignored.
+ */
+ public static DockerImageName fromDockerfile(String databaseName) {
+ try {
+ final ImageInformation imageInformation = readFromInstruction( databaseName.toLowerCase() );
+ return imageName( imageInformation.getRegistry(), imageInformation.getImage(), imageInformation.getVersion() );
+ }
+ catch (IOException e) {
+ throw new RuntimeException( e );
+ }
+ }
+
+ public static DockerImageName imageName(String registry, String image, String version) {
+ return DockerImageName
+ .parse( registry + "/" + image + ":" + version )
+ .asCompatibleSubstituteFor( image );
+ }
+
+ private static class ImageInformation {
+ private final String registry;
+ private final String image;
+ private final String version;
+
+ public ImageInformation(String fullImageInfo) {
+ // FullImageInfo pattern: /:
+ // For example: "docker.io/cockroachdb/cockroach:v24.3.13" becomes registry = "docker.io", image = "cockroachdb/cockroach", version = "v24.3.13"
+ final int registryEndPos = fullImageInfo.indexOf( '/' );
+ final int imageEndPos = fullImageInfo.lastIndexOf( ':' );
+ this.registry = fullImageInfo.substring( 0, registryEndPos );
+ this.image = fullImageInfo.substring( registryEndPos + 1, imageEndPos );
+ this.version = fullImageInfo.substring( imageEndPos + 1 );
+ }
+
+ public String getRegistry() {
+ return registry;
+ }
+
+ public String getImage() {
+ return image;
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ @Override
+ public String toString() {
+ return registry + "/" + image + ":" + version;
+ }
+ }
+
+ private static Path dockerFilePath(String database) {
+ // Get project root from system property set by Gradle, with fallback
+ return DOCKERFILE_DIR_PATH.resolve( database.toLowerCase() + ".Dockerfile" );
+ }
+
+ private static ImageInformation readFromInstruction(String database) throws IOException {
+ return readFromInstruction( dockerFilePath( database ) );
+ }
+
+ /**
+ * Read a Dockerfile and extract the first FROM instruction.
+ *
+ * @param dockerfilePath path to the Dockerfile
+ * @return the first FROM instruction found, or empty if none found
+ * @throws IOException if the file cannot be read
+ */
+ private static ImageInformation readFromInstruction(Path dockerfilePath) throws IOException {
+ if ( !Files.exists( dockerfilePath ) ) {
+ throw new FileNotFoundException( "Dockerfile not found: " + dockerfilePath );
+ }
+
+ List lines = Files.readAllLines( dockerfilePath );
+ for ( String line : lines ) {
+ // Skip comments and empty lines
+ String trimmedLine = line.trim();
+ if ( trimmedLine.isEmpty() || trimmedLine.startsWith( "#" ) ) {
+ continue;
+ }
+
+ if ( trimmedLine.startsWith( "FROM " ) ) {
+ return new ImageInformation( trimmedLine.substring( "FROM ".length() ) );
+ }
+ }
+
+ throw new IOException( " Missing FROM instruction in " + dockerfilePath );
+ }
+}
diff --git a/integration-tests/hibernate-validator-postgres-it/src/test/java/org/hibernate/reactive/it/quarkus/qe/database/BaseReactiveIT.java b/integration-tests/hibernate-validator-postgres-it/src/test/java/org/hibernate/reactive/it/quarkus/qe/database/BaseReactiveIT.java
index 7debdbb2c..fcefdaa84 100644
--- a/integration-tests/hibernate-validator-postgres-it/src/test/java/org/hibernate/reactive/it/quarkus/qe/database/BaseReactiveIT.java
+++ b/integration-tests/hibernate-validator-postgres-it/src/test/java/org/hibernate/reactive/it/quarkus/qe/database/BaseReactiveIT.java
@@ -52,9 +52,7 @@ public abstract class BaseReactiveIT {
// These properties are in DatabaseConfiguration in core
public static final boolean USE_DOCKER = Boolean.getBoolean( "docker" );
- public static final DockerImageName IMAGE_NAME = DockerImageName
- .parse( "docker.io/postgres:17.5" )
- .asCompatibleSubstituteFor( "postgres" );
+ public static final DockerImageName IMAGE_NAME = DockerImage.fromDockerfile( "postgresql" );
public static final String USERNAME = "hreact";
public static final String PASSWORD = "hreact";
diff --git a/integration-tests/hibernate-validator-postgres-it/src/test/java/org/hibernate/reactive/it/quarkus/qe/database/DockerImage.java b/integration-tests/hibernate-validator-postgres-it/src/test/java/org/hibernate/reactive/it/quarkus/qe/database/DockerImage.java
new file mode 100644
index 000000000..7770da76c
--- /dev/null
+++ b/integration-tests/hibernate-validator-postgres-it/src/test/java/org/hibernate/reactive/it/quarkus/qe/database/DockerImage.java
@@ -0,0 +1,125 @@
+/* Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * Copyright: Red Hat Inc. and Hibernate Authors
+ */
+package org.hibernate.reactive.it.quarkus.qe.database;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
+
+import org.testcontainers.utility.DockerImageName;
+
+/**
+ * A utility class with methods to generate a {@link DockerImageName} for Testcontainers.
+ *
+ * Testcontainers might not work if the image required is available in multiple different registries (for example when
+ * using podman instead of docker).
+ * These methods make sure to pick a registry as default.
+ *
+ */
+public final class DockerImage {
+
+ /**
+ * The absolute path of the project root that we have set in Gradle.
+ */
+ private static final String PROJECT_ROOT = System.getProperty( "hibernate.reactive.project.root" );
+
+ /**
+ * The path to the directory containing all the Dockerfile files
+ */
+ private static final Path DOCKERFILE_DIR_PATH = Path.of( PROJECT_ROOT ).resolve( "tooling" ).resolve( "docker" );
+
+ /**
+ * Extract the image name and version from the first FROM instruction in the Dockerfile.
+ * Note that everything else is ignored.
+ */
+ public static DockerImageName fromDockerfile(String databaseName) {
+ try {
+ final ImageInformation imageInformation = readFromInstruction( databaseName.toLowerCase() );
+ return imageName( imageInformation.getRegistry(), imageInformation.getImage(), imageInformation.getVersion() );
+ }
+ catch (IOException e) {
+ throw new RuntimeException( e );
+ }
+ }
+
+ public static DockerImageName imageName(String registry, String image, String version) {
+ return DockerImageName
+ .parse( registry + "/" + image + ":" + version )
+ .asCompatibleSubstituteFor( image );
+ }
+
+ private static class ImageInformation {
+ private final String registry;
+ private final String image;
+ private final String version;
+
+ public ImageInformation(String fullImageInfo) {
+ // FullImageInfo pattern: /:
+ // For example: "docker.io/cockroachdb/cockroach:v24.3.13" becomes registry = "docker.io", image = "cockroachdb/cockroach", version = "v24.3.13"
+ final int registryEndPos = fullImageInfo.indexOf( '/' );
+ final int imageEndPos = fullImageInfo.lastIndexOf( ':' );
+ this.registry = fullImageInfo.substring( 0, registryEndPos );
+ this.image = fullImageInfo.substring( registryEndPos + 1, imageEndPos );
+ this.version = fullImageInfo.substring( imageEndPos + 1 );
+ }
+
+ public String getRegistry() {
+ return registry;
+ }
+
+ public String getImage() {
+ return image;
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ @Override
+ public String toString() {
+ return registry + "/" + image + ":" + version;
+ }
+ }
+
+ private static Path dockerFilePath(String database) {
+ // Get project root from system property set by Gradle, with fallback
+ return DOCKERFILE_DIR_PATH.resolve( database.toLowerCase() + ".Dockerfile" );
+ }
+
+ private static ImageInformation readFromInstruction(String database) throws IOException {
+ return readFromInstruction( dockerFilePath( database ) );
+ }
+
+ /**
+ * Read a Dockerfile and extract the first FROM instruction.
+ *
+ * @param dockerfilePath path to the Dockerfile
+ * @return the first FROM instruction found, or empty if none found
+ * @throws IOException if the file cannot be read
+ */
+ private static ImageInformation readFromInstruction(Path dockerfilePath) throws IOException {
+ if ( !Files.exists( dockerfilePath ) ) {
+ throw new FileNotFoundException( "Dockerfile not found: " + dockerfilePath );
+ }
+
+ List lines = Files.readAllLines( dockerfilePath );
+ for ( String line : lines ) {
+ // Skip comments and empty lines
+ String trimmedLine = line.trim();
+ if ( trimmedLine.isEmpty() || trimmedLine.startsWith( "#" ) ) {
+ continue;
+ }
+
+ if ( trimmedLine.startsWith( "FROM " ) ) {
+ return new ImageInformation( trimmedLine.substring( "FROM ".length() ) );
+ }
+ }
+
+ throw new IOException( " Missing FROM instruction in " + dockerfilePath );
+ }
+}
diff --git a/integration-tests/verticle-postgres-it/src/main/java/org/hibernate/reactive/it/verticle/DockerImage.java b/integration-tests/verticle-postgres-it/src/main/java/org/hibernate/reactive/it/verticle/DockerImage.java
new file mode 100644
index 000000000..10026d020
--- /dev/null
+++ b/integration-tests/verticle-postgres-it/src/main/java/org/hibernate/reactive/it/verticle/DockerImage.java
@@ -0,0 +1,125 @@
+/* Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * Copyright: Red Hat Inc. and Hibernate Authors
+ */
+package org.hibernate.reactive.it.verticle;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
+
+import org.testcontainers.utility.DockerImageName;
+
+/**
+ * A utility class with methods to generate a {@link DockerImageName} for Testcontainers.
+ *
+ * Testcontainers might not work if the image required is available in multiple different registries (for example when
+ * using podman instead of docker).
+ * These methods make sure to pick a registry as default.
+ *
+ */
+public final class DockerImage {
+
+ /**
+ * The absolute path of the project root that we have set in Gradle.
+ */
+ private static final String PROJECT_ROOT = System.getProperty( "hibernate.reactive.project.root" );
+
+ /**
+ * The path to the directory containing all the Dockerfile files
+ */
+ private static final Path DOCKERFILE_DIR_PATH = Path.of( PROJECT_ROOT ).resolve( "tooling" ).resolve( "docker" );
+
+ /**
+ * Extract the image name and version from the first FROM instruction in the Dockerfile.
+ * Note that everything else is ignored.
+ */
+ public static DockerImageName fromDockerfile(String databaseName) {
+ try {
+ final ImageInformation imageInformation = readFromInstruction( databaseName.toLowerCase() );
+ return imageName( imageInformation.getRegistry(), imageInformation.getImage(), imageInformation.getVersion() );
+ }
+ catch (IOException e) {
+ throw new RuntimeException( e );
+ }
+ }
+
+ public static DockerImageName imageName(String registry, String image, String version) {
+ return DockerImageName
+ .parse( registry + "/" + image + ":" + version )
+ .asCompatibleSubstituteFor( image );
+ }
+
+ private static class ImageInformation {
+ private final String registry;
+ private final String image;
+ private final String version;
+
+ public ImageInformation(String fullImageInfo) {
+ // FullImageInfo pattern: /:
+ // For example: "docker.io/cockroachdb/cockroach:v24.3.13" becomes registry = "docker.io", image = "cockroachdb/cockroach", version = "v24.3.13"
+ final int registryEndPos = fullImageInfo.indexOf( '/' );
+ final int imageEndPos = fullImageInfo.lastIndexOf( ':' );
+ this.registry = fullImageInfo.substring( 0, registryEndPos );
+ this.image = fullImageInfo.substring( registryEndPos + 1, imageEndPos );
+ this.version = fullImageInfo.substring( imageEndPos + 1 );
+ }
+
+ public String getRegistry() {
+ return registry;
+ }
+
+ public String getImage() {
+ return image;
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ @Override
+ public String toString() {
+ return registry + "/" + image + ":" + version;
+ }
+ }
+
+ private static Path dockerFilePath(String database) {
+ // Get project root from system property set by Gradle, with fallback
+ return DOCKERFILE_DIR_PATH.resolve( database.toLowerCase() + ".Dockerfile" );
+ }
+
+ private static ImageInformation readFromInstruction(String database) throws IOException {
+ return readFromInstruction( dockerFilePath( database ) );
+ }
+
+ /**
+ * Read a Dockerfile and extract the first FROM instruction.
+ *
+ * @param dockerfilePath path to the Dockerfile
+ * @return the first FROM instruction found, or empty if none found
+ * @throws IOException if the file cannot be read
+ */
+ private static ImageInformation readFromInstruction(Path dockerfilePath) throws IOException {
+ if ( !Files.exists( dockerfilePath ) ) {
+ throw new FileNotFoundException( "Dockerfile not found: " + dockerfilePath );
+ }
+
+ List lines = Files.readAllLines( dockerfilePath );
+ for ( String line : lines ) {
+ // Skip comments and empty lines
+ String trimmedLine = line.trim();
+ if ( trimmedLine.isEmpty() || trimmedLine.startsWith( "#" ) ) {
+ continue;
+ }
+
+ if ( trimmedLine.startsWith( "FROM " ) ) {
+ return new ImageInformation( trimmedLine.substring( "FROM ".length() ) );
+ }
+ }
+
+ throw new IOException( " Missing FROM instruction in " + dockerfilePath );
+ }
+}
diff --git a/integration-tests/verticle-postgres-it/src/main/java/org/hibernate/reactive/it/verticle/VertxServer.java b/integration-tests/verticle-postgres-it/src/main/java/org/hibernate/reactive/it/verticle/VertxServer.java
index 990fef754..f11254c6d 100644
--- a/integration-tests/verticle-postgres-it/src/main/java/org/hibernate/reactive/it/verticle/VertxServer.java
+++ b/integration-tests/verticle-postgres-it/src/main/java/org/hibernate/reactive/it/verticle/VertxServer.java
@@ -21,6 +21,7 @@
import io.vertx.core.Vertx;
import io.vertx.core.VertxOptions;
import org.testcontainers.containers.PostgreSQLContainer;
+import org.testcontainers.utility.DockerImageName;
import static java.lang.invoke.MethodHandles.lookup;
import static org.hibernate.reactive.logging.impl.LoggerFactory.make;
@@ -36,7 +37,8 @@ public class VertxServer {
// These properties are in DatabaseConfiguration in core
public static final boolean USE_DOCKER = Boolean.getBoolean( "docker" );
- public static final String IMAGE_NAME = "postgres:17.5";
+ public static final DockerImageName IMAGE_NAME = DockerImage.fromDockerfile( "postgresql" );
+
public static final String USERNAME = "hreact";
public static final String PASSWORD = "hreact";
public static final String DB_NAME = "hreact";
diff --git a/tooling/docker/README.md b/tooling/docker/README.md
new file mode 100644
index 000000000..4de2451e0
--- /dev/null
+++ b/tooling/docker/README.md
@@ -0,0 +1,6 @@
+Our test suite will only read the first FROM instruction from each Dockerfile to extract the base image and the version
+of the container to run. It will ignore everything else.
+
+The reason we have these files is that we want to automate the upgrade of the containers using dependabot.
+
+See the class `DockerImage`.
diff --git a/tooling/docker/cockroachdb.Dockerfile b/tooling/docker/cockroachdb.Dockerfile
new file mode 100644
index 000000000..5f92dd720
--- /dev/null
+++ b/tooling/docker/cockroachdb.Dockerfile
@@ -0,0 +1,3 @@
+# CockroachDB
+# See https://hub.docker.com/r/cockroachdb/cockroach
+FROM docker.io/cockroachdb/cockroach:v25.2.2
diff --git a/tooling/docker/db2.Dockerfile b/tooling/docker/db2.Dockerfile
new file mode 100644
index 000000000..b70ff8a80
--- /dev/null
+++ b/tooling/docker/db2.Dockerfile
@@ -0,0 +1,3 @@
+# IBM DB2
+# See https://hub.docker.com/r/ibmcom/db2
+FROM icr.io/db2_community/db2:12.1.2.0
diff --git a/tooling/docker/maria.Dockerfile b/tooling/docker/maria.Dockerfile
new file mode 100644
index 000000000..fc954df6e
--- /dev/null
+++ b/tooling/docker/maria.Dockerfile
@@ -0,0 +1,3 @@
+# MariaDB
+# See https://hub.docker.com/_/mariadb
+FROM docker.io/mariadb:11.8.2
diff --git a/tooling/docker/mysql.Dockerfile b/tooling/docker/mysql.Dockerfile
new file mode 100644
index 000000000..69b12ca62
--- /dev/null
+++ b/tooling/docker/mysql.Dockerfile
@@ -0,0 +1,3 @@
+# MySQL
+# See https://hub.docker.com/_/mysql
+FROM container-registry.oracle.com/mysql/community-server:9.3.0
diff --git a/tooling/docker/oracle.Dockerfile b/tooling/docker/oracle.Dockerfile
new file mode 100644
index 000000000..7dfc6447d
--- /dev/null
+++ b/tooling/docker/oracle.Dockerfile
@@ -0,0 +1,3 @@
+# Oracle Database Free
+# See https://hub.docker.com/r/gvenzl/oracle-free
+FROM docker.io/gvenzl/oracle-free:23-slim-faststart
diff --git a/tooling/docker/postgresql.Dockerfile b/tooling/docker/postgresql.Dockerfile
new file mode 100644
index 000000000..fb36f48e8
--- /dev/null
+++ b/tooling/docker/postgresql.Dockerfile
@@ -0,0 +1,3 @@
+# PostgreSQL
+# See https://hub.docker.com/_/postgres
+FROM docker.io/postgres:17.5
diff --git a/tooling/docker/sqlserver.Dockerfile b/tooling/docker/sqlserver.Dockerfile
new file mode 100644
index 000000000..94fae1429
--- /dev/null
+++ b/tooling/docker/sqlserver.Dockerfile
@@ -0,0 +1,3 @@
+# Microsoft SQL Server
+# See https://hub.docker.com/_/microsoft-mssql-server
+FROM mcr.microsoft.com/mssql/server:2025-latest
diff --git a/tooling/jbang/CockroachDBReactiveTest.java.qute b/tooling/jbang/CockroachDBReactiveTest.java.qute
index 337916470..54996e38d 100755
--- a/tooling/jbang/CockroachDBReactiveTest.java.qute
+++ b/tooling/jbang/CockroachDBReactiveTest.java.qute
@@ -10,7 +10,7 @@
//DEPS org.hibernate.reactive:hibernate-reactive-core:$\{hibernate-reactive.version:3.0.0.Final}
//DEPS org.assertj:assertj-core:3.27.3
//DEPS junit:junit:4.13.2
-//DEPS org.testcontainers:cockroachdb:1.21.0
+//DEPS org.testcontainers:cockroachdb:1.21.3
//DEPS org.slf4j:slf4j-simple:2.0.7
//// Testcontainer needs the JDBC drivers to start the container
diff --git a/tooling/jbang/Db2ReactiveTest.java.qute b/tooling/jbang/Db2ReactiveTest.java.qute
index cff1b8101..ed3c993d1 100755
--- a/tooling/jbang/Db2ReactiveTest.java.qute
+++ b/tooling/jbang/Db2ReactiveTest.java.qute
@@ -10,7 +10,7 @@
//DEPS org.hibernate.reactive:hibernate-reactive-core:$\{hibernate-reactive.version:3.0.0.Final}
//DEPS org.assertj:assertj-core:3.27.3
//DEPS junit:junit:4.13.2
-//DEPS org.testcontainers:db2:1.21.0
+//DEPS org.testcontainers:db2:1.21.3
//DEPS org.slf4j:slf4j-simple:2.0.7
import jakarta.persistence.Entity;
diff --git a/tooling/jbang/MariaDBReactiveTest.java.qute b/tooling/jbang/MariaDBReactiveTest.java.qute
index 3a9698fa1..611f142c0 100755
--- a/tooling/jbang/MariaDBReactiveTest.java.qute
+++ b/tooling/jbang/MariaDBReactiveTest.java.qute
@@ -10,7 +10,7 @@
//DEPS org.hibernate.reactive:hibernate-reactive-core:$\{hibernate-reactive.version:3.0.0.Final}
//DEPS org.assertj:assertj-core:3.27.3
//DEPS junit:junit:4.13.2
-//DEPS org.testcontainers:mariadb:1.21.0
+//DEPS org.testcontainers:mariadb:1.21.3
//DEPS org.slf4j:slf4j-simple:2.0.7
//// Testcontainer needs the JDBC drivers to start the container
diff --git a/tooling/jbang/MySQLReactiveTest.java.qute b/tooling/jbang/MySQLReactiveTest.java.qute
index 1e6debefc..c258612ae 100755
--- a/tooling/jbang/MySQLReactiveTest.java.qute
+++ b/tooling/jbang/MySQLReactiveTest.java.qute
@@ -10,7 +10,7 @@
//DEPS org.hibernate.reactive:hibernate-reactive-core:$\{hibernate-reactive.version:3.0.0.Final}
//DEPS org.assertj:assertj-core:3.27.3
//DEPS junit:junit:4.13.2
-//DEPS org.testcontainers:mysql:1.21.0
+//DEPS org.testcontainers:mysql:1.21.3
//DEPS org.slf4j:slf4j-simple:2.0.7
//// Testcontainer needs the JDBC drivers to start the container
@@ -72,7 +72,7 @@ public class {baseName} {
}
@ClassRule
- public final static MySQLContainer> database = new MySQLContainer<>( imageName( "docker.io", "mysql", "9.2.0" ) );
+ public final static MySQLContainer> database = new MySQLContainer<>( imageName( "container-registry.oracle.com", "mysql/community-server", "9.3.0" ).asCompatibleSubstituteFor( "mysql" ) );
private Mutiny.SessionFactory sessionFactory;
diff --git a/tooling/jbang/PostgreSQLReactiveTest.java.qute b/tooling/jbang/PostgreSQLReactiveTest.java.qute
index ec4ecee00..1e6e094d5 100755
--- a/tooling/jbang/PostgreSQLReactiveTest.java.qute
+++ b/tooling/jbang/PostgreSQLReactiveTest.java.qute
@@ -10,7 +10,7 @@
//DEPS org.hibernate.reactive:hibernate-reactive-core:$\{hibernate-reactive.version:3.0.0.Final}
//DEPS org.assertj:assertj-core:3.27.3
//DEPS junit:junit:4.13.2
-//DEPS org.testcontainers:postgresql:1.21.0
+//DEPS org.testcontainers:postgresql:1.21.3
//DEPS org.slf4j:slf4j-simple:2.0.7
//DESCRIPTION Allow authentication to PostgreSQL using SCRAM:
//DEPS com.ongres.scram:client:2.1
diff --git a/tooling/jbang/ReactiveTest.java b/tooling/jbang/ReactiveTest.java
index c0db48f2b..ed6011433 100755
--- a/tooling/jbang/ReactiveTest.java
+++ b/tooling/jbang/ReactiveTest.java
@@ -13,11 +13,11 @@
//DEPS org.hibernate.reactive:hibernate-reactive-core:${hibernate-reactive.version:3.0.0.Final}
//DEPS org.assertj:assertj-core:3.27.3
//DEPS junit:junit:4.13.2
-//DEPS org.testcontainers:postgresql:1.21.0
-//DEPS org.testcontainers:mysql:1.21.0
-//DEPS org.testcontainers:db2:1.21.0
-//DEPS org.testcontainers:mariadb:1.21.0
-//DEPS org.testcontainers:cockroachdb:1.21.0
+//DEPS org.testcontainers:postgresql:1.21.3
+//DEPS org.testcontainers:mysql:1.21.3
+//DEPS org.testcontainers:db2:1.21.3
+//DEPS org.testcontainers:mariadb:1.21.3
+//DEPS org.testcontainers:cockroachdb:1.21.3
//
//// Testcontainer needs the JDBC drivers to start the containers
//// Hibernate Reactive doesn't use them
@@ -229,7 +229,7 @@ public String toString() {
*/
enum Database {
POSTGRESQL( () -> new PostgreSQLContainer( "postgres:17.5" ) ),
- MYSQL( () -> new MySQLContainer( "mysql:9.2.0" ) ),
+ MYSQL( () -> new MySQLContainer( "container-registry.oracle.com/mysql/community-server:9.3.0" ) ),
DB2( () -> new Db2Container( "docker.io/icr.io/db2_community/db2:12.1.0.0" ).acceptLicense() ),
MARIADB( () -> new MariaDBContainer( "mariadb:11.7.2" ) ),
COCKROACHDB( () -> new CockroachContainer( "cockroachdb/cockroach:v24.3.13" ) );