manifests = classLoader.getResources("META-INF/MANIFEST.MF");
-
- while(manifests.hasMoreElements())
- {
- final URL manifestURL = manifests.nextElement();
- try(final InputStream is = manifestURL.openStream())
- {
- final Manifest manifest = new Manifest();
- manifest.read(is);
-
- final String seleniumVersion = getSeleniumVersionFromManifest(manifest);
- if(seleniumVersion != null)
- {
- seleniumVersions.add(seleniumVersion);
- LOG.info("Selenium API version {} detected on classpath", seleniumVersion);
- }
- }
- }
- }
- catch(final Exception e)
- {
- LOG.debug("Failed to determine Selenium-Version from selenium-api JAR Manifest", e);
- }
-
- if(seleniumVersions.isEmpty())
- {
- LOG.warn(
- "Failed to determine Selenium version from classpath - will use default version of {}",
- DEFAULT_SELENIUM_VERSION
- );
- return DEFAULT_SELENIUM_VERSION;
- }
-
- final String foundVersion = seleniumVersions.iterator().next();
- if(seleniumVersions.size() > 1)
- {
- LOG.warn(
- "Multiple versions of Selenium API found on classpath - will select {}, but this may not be reliable",
- foundVersion
- );
- }
-
- return foundVersion;
+ return SeleniumVersionDetector.determineClasspathSeleniumVersion();
}
- /**
- * Read Manifest to get Selenium Version.
- *
- * @param manifest manifest
- * @return Selenium Version detected
- */
public static String getSeleniumVersionFromManifest(final Manifest manifest)
{
- String seleniumVersion = null;
- final Attributes buildInfo = manifest.getAttributes("Build-Info");
- if(buildInfo != null)
- {
- seleniumVersion = buildInfo.getValue("Selenium-Version");
- }
-
- // Compatibility Selenium > 3.X
- if(seleniumVersion == null)
- {
- final Attributes seleniumInfo = manifest.getAttributes("Selenium");
- if(seleniumInfo != null)
- {
- seleniumVersion = seleniumInfo.getValue("Selenium-Version");
- }
- }
- return seleniumVersion;
+ return SeleniumVersionDetector.getSeleniumVersionFromManifest(manifest);
+ }
+
+ private SeleniumUtils()
+ {
}
}
diff --git a/testcontainers-selenium/src/main/java/software/xdev/testcontainers/selenium/containers/browser/SeleniumVersionDetector.java b/testcontainers-selenium/src/main/java/software/xdev/testcontainers/selenium/containers/browser/SeleniumVersionDetector.java
new file mode 100644
index 0000000..ff3e5f6
--- /dev/null
+++ b/testcontainers-selenium/src/main/java/software/xdev/testcontainers/selenium/containers/browser/SeleniumVersionDetector.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright © 2024 XDEV Software (https://xdev.software)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package software.xdev.testcontainers.selenium.containers.browser;
+
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.jar.Attributes;
+import java.util.jar.Manifest;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * Version detection methods for Selenium.
+ *
+ * Forked from Testcontainers SeleniumUtils and enhanced with caching.
+ *
+ */
+public final class SeleniumVersionDetector
+{
+ private static final Logger LOG = LoggerFactory.getLogger(SeleniumVersionDetector.class);
+
+ // as of 2026-08
+ public static final String DEFAULT_SELENIUM_VERSION = "4.47.0";
+ private static String cachedVersion;
+
+ /**
+ * Based on the JARs detected on the classpath, determine which version of selenium-api is available.
+ *
+ * @return the detected version of Selenium API, or DEFAULT_SELENIUM_VERSION if it could not be determined
+ */
+ public static String getClasspathSeleniumVersion()
+ {
+ if(cachedVersion != null)
+ {
+ return cachedVersion;
+ }
+ cachedVersion = determineClasspathSeleniumVersion();
+ return cachedVersion;
+ }
+
+ public static synchronized String determineClasspathSeleniumVersion()
+ {
+ if(cachedVersion != null)
+ {
+ return cachedVersion;
+ }
+
+ final Set seleniumVersions = new HashSet<>();
+ try
+ {
+ final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ final Enumeration manifests = classLoader.getResources("META-INF/MANIFEST.MF");
+
+ while(manifests.hasMoreElements())
+ {
+ final URL manifestURL = manifests.nextElement();
+ try(final InputStream is = manifestURL.openStream())
+ {
+ final Manifest manifest = new Manifest();
+ manifest.read(is);
+
+ final String seleniumVersion = getSeleniumVersionFromManifest(manifest);
+ if(seleniumVersion != null)
+ {
+ seleniumVersions.add(seleniumVersion);
+ LOG.info("Selenium API version {} detected on classpath", seleniumVersion);
+ }
+ }
+ }
+ }
+ catch(final Exception e)
+ {
+ LOG.debug("Failed to determine Selenium-Version from selenium-api JAR Manifest", e);
+ }
+
+ if(seleniumVersions.isEmpty())
+ {
+ LOG.warn(
+ "Failed to determine Selenium version from classpath - will use default version of {}",
+ DEFAULT_SELENIUM_VERSION
+ );
+ return DEFAULT_SELENIUM_VERSION;
+ }
+
+ final String foundVersion = seleniumVersions.iterator().next();
+ if(seleniumVersions.size() > 1)
+ {
+ LOG.warn(
+ "Multiple versions of Selenium API found on classpath - will select {}, but this may not be reliable",
+ foundVersion
+ );
+ }
+
+ return foundVersion;
+ }
+
+ /**
+ * Read Manifest to get Selenium Version.
+ *
+ * @param manifest manifest
+ * @return Selenium Version detected
+ */
+ public static String getSeleniumVersionFromManifest(final Manifest manifest)
+ {
+ String seleniumVersion = null;
+ final Attributes buildInfo = manifest.getAttributes("Build-Info");
+ if(buildInfo != null)
+ {
+ seleniumVersion = buildInfo.getValue("Selenium-Version");
+ }
+
+ // Compatibility Selenium > 3.X
+ if(seleniumVersion == null)
+ {
+ final Attributes seleniumInfo = manifest.getAttributes("Selenium");
+ if(seleniumInfo != null)
+ {
+ seleniumVersion = seleniumInfo.getValue("Selenium-Version");
+ }
+ }
+ return seleniumVersion;
+ }
+
+ private SeleniumVersionDetector()
+ {
+ }
+}
From 91891fb4a556370c3168c9d9a8885fd2fbe3febd Mon Sep 17 00:00:00 2001
From: AB
Date: Tue, 11 Aug 2026 14:04:42 +0200
Subject: [PATCH 20/26] Update README.md
---
README.md | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index a9f135b..f50622f 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,9 @@ A re-implementation of [Testcontainer Selenium/WebDriver](https://java.testconta
* No VNC Server started in the browser container (unless explicitly stated) → Saves memory
* Uses [Selenium's implementation](https://github.com/SeleniumHQ/docker-selenium/tree/trunk/Video) and isn't [based](https://github.com/testcontainers/vnc-recorder) on [some python code from 2010](https://pypi.org/project/vnc2flv/#history)
* Way more customization options for e.g. ``framerate``, ``codec``, ``preset`` ...
- * Uses ``mkv`` as default recording format (wider support in comparison to ``flv``)
+ * Uses `mkv` as default recording format
+ * wider support in comparison to `flv`
+ * `mkv` allows incomplete recordings without file corruption
* [Renders while saving the video](https://github.com/SeleniumHQ/docker-selenium/blob/4c572afd1173b5bd49fa2def3b54ea552fccee85/Video/video.sh#L126) (not when finished which takes additional time)
* Stops the recorder before saving the file so that there is no way that [it runs forever](https://github.com/testcontainers/testcontainers-java/discussions/6229).
* Automatically tries to select a alternative Selenium version for the docker image if it [doesn't exist](https://github.com/SeleniumHQ/docker-selenium/issues/1979).
From 520bb73cffaab77c2b5d52e11f5d4d4d5bca6e65 Mon Sep 17 00:00:00 2001
From: AB
Date: Tue, 11 Aug 2026 14:11:38 +0200
Subject: [PATCH 21/26] Fix order of WaitStrategies
---
.../selenium/containers/browser/BrowserWebDriverContainer.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/testcontainers-selenium/src/main/java/software/xdev/testcontainers/selenium/containers/browser/BrowserWebDriverContainer.java b/testcontainers-selenium/src/main/java/software/xdev/testcontainers/selenium/containers/browser/BrowserWebDriverContainer.java
index ab87da7..f41dd41 100644
--- a/testcontainers-selenium/src/main/java/software/xdev/testcontainers/selenium/containers/browser/BrowserWebDriverContainer.java
+++ b/testcontainers-selenium/src/main/java/software/xdev/testcontainers/selenium/containers/browser/BrowserWebDriverContainer.java
@@ -133,9 +133,9 @@ public BrowserWebDriverContainer(final DockerImageName dockerImageName)
protected WaitStrategy getDefaultWaitStrategy()
{
return new WaitAllStrategy()
+ .withStrategy(new HostPortWaitStrategy())
.withStrategy(new LogMessageWaitStrategy()
.withRegEx(LOG_MSG_WAIT_STRATEGY_REGEX))
- .withStrategy(new HostPortWaitStrategy())
.withStartupTimeout(Duration.of(60, ChronoUnit.SECONDS));
}
From 8bf4de797ef76d18d9904042a982065df7ad4e6b Mon Sep 17 00:00:00 2001
From: AB
Date: Tue, 11 Aug 2026 14:42:48 +0200
Subject: [PATCH 22/26] Extract image name extraction logic
---
CHANGELOG.md | 1 +
.../browser/BrowserWebDriverContainer.java | 19 ++------
.../GenericContainerImageNameAccessor.java | 46 +++++++++++++++++++
...GenericContainerImageNameAccessorTest.java | 37 +++++++++++++++
4 files changed, 87 insertions(+), 16 deletions(-)
create mode 100644 testcontainers-selenium/src/main/java/software/xdev/testcontainers/selenium/containers/browser/GenericContainerImageNameAccessor.java
create mode 100644 testcontainers-selenium/src/test/java/software/xdev/testcontainers/selenium/containers/browser/GenericContainerImageNameAccessorTest.java
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7075ff5..8fc4ef9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,6 @@
# 2.1.0
* Rename `SeleniumUtils` to `SeleniumVersionDetector`
+* Extract image name extraction logic
* Update default Selenium version to `4.47.0`
* Updated dependencies
diff --git a/testcontainers-selenium/src/main/java/software/xdev/testcontainers/selenium/containers/browser/BrowserWebDriverContainer.java b/testcontainers-selenium/src/main/java/software/xdev/testcontainers/selenium/containers/browser/BrowserWebDriverContainer.java
index f41dd41..1a4c515 100644
--- a/testcontainers-selenium/src/main/java/software/xdev/testcontainers/selenium/containers/browser/BrowserWebDriverContainer.java
+++ b/testcontainers-selenium/src/main/java/software/xdev/testcontainers/selenium/containers/browser/BrowserWebDriverContainer.java
@@ -16,8 +16,6 @@
package software.xdev.testcontainers.selenium.containers.browser;
import java.io.IOException;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -27,12 +25,11 @@
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.function.Supplier;
@@ -82,8 +79,7 @@ public class BrowserWebDriverContainer WORKING_BROWSER_IMAGES_TRANSLATION =
- Collections.synchronizedMap(new HashMap<>());
+ protected static final Map WORKING_BROWSER_IMAGES_TRANSLATION = new ConcurrentHashMap<>();
public static final int SELENIUM_PORT = 4444;
public static final int VNC_PORT = 5900;
@@ -341,7 +337,6 @@ protected void configureVNC()
}
// region Validate image
- // If testcontainers could implement the same method better or made stuff protected we wouldn't need reflection
@SuppressWarnings("java:S3011")
protected void validateImage()
{
@@ -355,16 +350,8 @@ protected void validateImage()
// In this case try to look for alternative images
try
{
- final Field fImage = GenericContainer.class.getDeclaredField("image");
- fImage.setAccessible(true);
- final RemoteDockerImage remoteDockerImage = (RemoteDockerImage)fImage.get(this);
-
- final Method mGetImageName = RemoteDockerImage.class.getDeclaredMethod("getImageName");
- mGetImageName.setAccessible(true);
- final DockerImageName currentImage = (DockerImageName)mGetImageName.invoke(remoteDockerImage);
-
this.setDockerImageName(WORKING_BROWSER_IMAGES_TRANSLATION.computeIfAbsent(
- currentImage,
+ GenericContainerImageNameAccessor.getImageName(this),
this::validateImageOrPickAlternative));
}
catch(final Exception ex)
diff --git a/testcontainers-selenium/src/main/java/software/xdev/testcontainers/selenium/containers/browser/GenericContainerImageNameAccessor.java b/testcontainers-selenium/src/main/java/software/xdev/testcontainers/selenium/containers/browser/GenericContainerImageNameAccessor.java
new file mode 100644
index 0000000..bdf47c9
--- /dev/null
+++ b/testcontainers-selenium/src/main/java/software/xdev/testcontainers/selenium/containers/browser/GenericContainerImageNameAccessor.java
@@ -0,0 +1,46 @@
+package software.xdev.testcontainers.selenium.containers.browser;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.Objects;
+
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.images.RemoteDockerImage;
+import org.testcontainers.utility.DockerImageName;
+
+
+/**
+ * Extracts the {@link DockerImageName} from {@link GenericContainer} without pulling it.
+ *
+ * Uses reflection because there is no official way to access it.
+ *
+ */
+public final class GenericContainerImageNameAccessor
+{
+ // Cache to improve performance
+ private static boolean initialized;
+ private static Field fImage;
+ private static Method mGetImageName;
+
+ public static DockerImageName getImageName(final GenericContainer> container) throws Exception
+ {
+ if(!initialized)
+ {
+ fImage = GenericContainer.class.getDeclaredField("image");
+ fImage.setAccessible(true);
+
+ mGetImageName = RemoteDockerImage.class.getDeclaredMethod("getImageName");
+ mGetImageName.setAccessible(true);
+
+ initialized = true;
+ }
+
+ final RemoteDockerImage remoteDockerImage = (RemoteDockerImage)fImage.get(container);
+
+ return (DockerImageName)Objects.requireNonNull(mGetImageName.invoke(remoteDockerImage));
+ }
+
+ private GenericContainerImageNameAccessor()
+ {
+ }
+}
diff --git a/testcontainers-selenium/src/test/java/software/xdev/testcontainers/selenium/containers/browser/GenericContainerImageNameAccessorTest.java b/testcontainers-selenium/src/test/java/software/xdev/testcontainers/selenium/containers/browser/GenericContainerImageNameAccessorTest.java
new file mode 100644
index 0000000..eaaeb8a
--- /dev/null
+++ b/testcontainers-selenium/src/test/java/software/xdev/testcontainers/selenium/containers/browser/GenericContainerImageNameAccessorTest.java
@@ -0,0 +1,37 @@
+package software.xdev.testcontainers.selenium.containers.browser;
+
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.concurrent.CompletableFuture;
+import java.util.stream.Stream;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.utility.DockerImageName;
+
+
+class GenericContainerImageNameAccessorTest
+{
+ static final String IMAGE = "alpine:3";
+ static final DockerImageName DOCKER_IMAGE_NAME = DockerImageName.parse(IMAGE);
+
+ @ParameterizedTest
+ @MethodSource
+ void reflectionStillWorks(final GenericContainer> container)
+ {
+ assertEquals(
+ DOCKER_IMAGE_NAME,
+ assertDoesNotThrow(() -> GenericContainerImageNameAccessor.getImageName(container)));
+ }
+
+ static Stream reflectionStillWorks()
+ {
+ return Stream.of(
+ new GenericContainer<>(IMAGE),
+ new GenericContainer<>(CompletableFuture.completedFuture(IMAGE)))
+ .map(Arguments::of);
+ }
+}
From 4e8120c2d3ca2e3a8e8ea9a6d660076c55477c9a Mon Sep 17 00:00:00 2001
From: AB
Date: Tue, 11 Aug 2026 14:45:15 +0200
Subject: [PATCH 23/26] AMH
---
.../GenericContainerImageNameAccessor.java | 15 +++++++++++++++
.../GenericContainerImageNameAccessorTest.java | 15 +++++++++++++++
2 files changed, 30 insertions(+)
diff --git a/testcontainers-selenium/src/main/java/software/xdev/testcontainers/selenium/containers/browser/GenericContainerImageNameAccessor.java b/testcontainers-selenium/src/main/java/software/xdev/testcontainers/selenium/containers/browser/GenericContainerImageNameAccessor.java
index bdf47c9..08b7086 100644
--- a/testcontainers-selenium/src/main/java/software/xdev/testcontainers/selenium/containers/browser/GenericContainerImageNameAccessor.java
+++ b/testcontainers-selenium/src/main/java/software/xdev/testcontainers/selenium/containers/browser/GenericContainerImageNameAccessor.java
@@ -1,3 +1,18 @@
+/*
+ * Copyright © 2024 XDEV Software (https://xdev.software)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
package software.xdev.testcontainers.selenium.containers.browser;
import java.lang.reflect.Field;
diff --git a/testcontainers-selenium/src/test/java/software/xdev/testcontainers/selenium/containers/browser/GenericContainerImageNameAccessorTest.java b/testcontainers-selenium/src/test/java/software/xdev/testcontainers/selenium/containers/browser/GenericContainerImageNameAccessorTest.java
index eaaeb8a..e7075fe 100644
--- a/testcontainers-selenium/src/test/java/software/xdev/testcontainers/selenium/containers/browser/GenericContainerImageNameAccessorTest.java
+++ b/testcontainers-selenium/src/test/java/software/xdev/testcontainers/selenium/containers/browser/GenericContainerImageNameAccessorTest.java
@@ -1,3 +1,18 @@
+/*
+ * Copyright © 2024 XDEV Software (https://xdev.software)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
package software.xdev.testcontainers.selenium.containers.browser;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
From 6ada825ba68ad8c8c918fea5749f67b50f3159cc Mon Sep 17 00:00:00 2001
From: AB
Date: Tue, 11 Aug 2026 14:47:25 +0200
Subject: [PATCH 24/26] No longer a god :(
---
.../selenium/containers/browser/BrowserWebDriverContainer.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/testcontainers-selenium/src/main/java/software/xdev/testcontainers/selenium/containers/browser/BrowserWebDriverContainer.java b/testcontainers-selenium/src/main/java/software/xdev/testcontainers/selenium/containers/browser/BrowserWebDriverContainer.java
index 1a4c515..d6c961a 100644
--- a/testcontainers-selenium/src/main/java/software/xdev/testcontainers/selenium/containers/browser/BrowserWebDriverContainer.java
+++ b/testcontainers-selenium/src/main/java/software/xdev/testcontainers/selenium/containers/browser/BrowserWebDriverContainer.java
@@ -63,7 +63,7 @@
/**
* A chrome/firefox/custom container based on SeleniumHQ's standalone container sets.
*/
-@SuppressWarnings({"java:S119", "java:S2160", "PMD.GodClass"})
+@SuppressWarnings({"java:S119", "java:S2160"})
public class BrowserWebDriverContainer>
extends GenericContainer
implements TestLifecycleAware
From a162508149196560c9da1041fca2ea7e5c31b64a Mon Sep 17 00:00:00 2001
From: AB
Date: Tue, 11 Aug 2026 14:58:19 +0200
Subject: [PATCH 25/26] Disable docker checks for each run because we know that
it always works
---
.github/workflows/check-build.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/check-build.yml b/.github/workflows/check-build.yml
index f7bd723..d62278e 100644
--- a/.github/workflows/check-build.yml
+++ b/.github/workflows/check-build.yml
@@ -48,7 +48,7 @@ jobs:
${{ runner.os }}-mvn-build-
- name: Build with Maven
- run: ./mvnw -B clean package -P run-integration-tests
+ run: ./mvnw -B clean package -P run-integration-tests -D checks.disable=true
- name: Check for uncommited changes
run: |
From 53543b89fb8a2ceefa6585135d0770d5d99ef084 Mon Sep 17 00:00:00 2001
From: AB
Date: Tue, 11 Aug 2026 15:09:23 +0200
Subject: [PATCH 26/26] Cache docker images to not always pull them on build
---
.github/workflows/check-build.yml | 44 ++++++++++++++++++++++---------
1 file changed, 31 insertions(+), 13 deletions(-)
diff --git a/.github/workflows/check-build.yml b/.github/workflows/check-build.yml
index d62278e..c4f0b8d 100644
--- a/.github/workflows/check-build.yml
+++ b/.github/workflows/check-build.yml
@@ -33,19 +33,31 @@ jobs:
steps:
- uses: actions/checkout@v7
- - name: Set up JDK
- uses: actions/setup-java@v5
- with:
- distribution: ${{ matrix.distribution }}
- java-version: ${{ matrix.java }}
-
- - name: Cache Maven
- uses: actions/cache@v6
- with:
- path: ~/.m2/repository
- key: ${{ runner.os }}-mvn-build-${{ hashFiles('**/pom.xml') }}
- restore-keys: |
- ${{ runner.os }}-mvn-build-
+ - parallel:
+ - name: Set up JDK
+ uses: actions/setup-java@v5
+ with:
+ distribution: ${{ matrix.distribution }}
+ java-version: ${{ matrix.java }}
+
+ - name: Cache Maven
+ uses: actions/cache@v6
+ with:
+ path: ~/.m2/repository
+ key: ${{ runner.os }}-mvn-build-${{ hashFiles('**/pom.xml') }}
+ restore-keys: |
+ ${{ runner.os }}-mvn-build-
+
+ - name: Docker Image Cache Restore
+ id: docker-image-cache-restore
+ uses: xdev-software/tci/.github/actions/docker-image-cache/restore@f686d444930db567aae0cbc8076694f8c886f479 # v4.1.0
+ with:
+ # This cache could always change however because docker images can be changed remotely if the version is not fixated
+ # As a compromise it utilizes the hash of the pom files because when the dependencies stay the same
+ # the images should also be roughly the same
+ key: ${{ runner.os }}-check-build-docker-images-${{ hashFiles('**/pom.xml') }}
+ restore-keys: |
+ ${{ runner.os }}-check-build-docker-images-
- name: Build with Maven
run: ./mvnw -B clean package -P run-integration-tests -D checks.disable=true
@@ -68,6 +80,12 @@ jobs:
exit 1
fi
+ - name: Docker Image Cache Save
+ uses: xdev-software/tci/.github/actions/docker-image-cache/save@f686d444930db567aae0cbc8076694f8c886f479 # v4.1.0
+ with:
+ key: ${{ steps.docker-image-cache-restore.outputs.key }}
+ cache-hit: ${{ steps.docker-image-cache-restore.outputs.cache-hit }}
+
checkstyle:
runs-on: ubuntu-latest
if: ${{ github.event_name != 'pull_request' || !startsWith(github.head_ref, 'renovate/') }}