From bc0d82617f51e9f2cc007ba5799b8932c991c001 Mon Sep 17 00:00:00 2001 From: XDEV Renovate Bot Date: Fri, 19 Jun 2026 05:54:58 +0000 Subject: [PATCH 1/4] Update actions/checkout action to v7 --- .github/workflows/broken-links.yml | 2 +- .github/workflows/report-gha-workflow-security-problems.yml | 2 +- .github/workflows/sync-labels.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/broken-links.yml b/.github/workflows/broken-links.yml index ce623e98..a6c3ed5c 100644 --- a/.github/workflows/broken-links.yml +++ b/.github/workflows/broken-links.yml @@ -12,7 +12,7 @@ jobs: link-checker: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - run: mv .github/.lycheeignore .lycheeignore diff --git a/.github/workflows/report-gha-workflow-security-problems.yml b/.github/workflows/report-gha-workflow-security-problems.yml index b17aa539..78470285 100644 --- a/.github/workflows/report-gha-workflow-security-problems.yml +++ b/.github/workflows/report-gha-workflow-security-problems.yml @@ -17,7 +17,7 @@ jobs: # Only run this in our repos (Prevent notification spam by forks) if: ${{ github.repository_owner == 'xdev-software' }} steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - name: Check id: check diff --git a/.github/workflows/sync-labels.yml b/.github/workflows/sync-labels.yml index c43365ef..00e40162 100644 --- a/.github/workflows/sync-labels.yml +++ b/.github/workflows/sync-labels.yml @@ -15,7 +15,7 @@ jobs: labels: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 with: sparse-checkout: .github/labels.yml From 2b7ba73da03eb10065fd8da502fe97d5740e61e1 Mon Sep 17 00:00:00 2001 From: AB Date: Wed, 8 Jul 2026 14:17:50 +0200 Subject: [PATCH 2/4] Add missing return --- .../buildxnative/NativeAdvancedImageFromDockerfileTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/testcontainers-advanced-imagebuilder/src/test/java/software/xdev/testcontainers/imagebuilder/buildxnative/NativeAdvancedImageFromDockerfileTest.java b/testcontainers-advanced-imagebuilder/src/test/java/software/xdev/testcontainers/imagebuilder/buildxnative/NativeAdvancedImageFromDockerfileTest.java index 4d7e791d..96a1b6d1 100644 --- a/testcontainers-advanced-imagebuilder/src/test/java/software/xdev/testcontainers/imagebuilder/buildxnative/NativeAdvancedImageFromDockerfileTest.java +++ b/testcontainers-advanced-imagebuilder/src/test/java/software/xdev/testcontainers/imagebuilder/buildxnative/NativeAdvancedImageFromDockerfileTest.java @@ -49,6 +49,7 @@ void checkGitHubCaching() if(System.getenv("GITHUB_ACTIONS") == null) { Assumptions.abort("Not running on GitHub Actions"); + return; } this.checkIfDockerIsPresentOrAbort(); From b31eb4fef83348cce283031ae4fe9262eff9a02d Mon Sep 17 00:00:00 2001 From: XDEV Renovate Bot Date: Fri, 10 Jul 2026 07:38:32 +0000 Subject: [PATCH 3/4] Update lycheeverse/lychee-action digest to e747777 --- .github/workflows/broken-links.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/broken-links.yml b/.github/workflows/broken-links.yml index ce623e98..afdffd67 100644 --- a/.github/workflows/broken-links.yml +++ b/.github/workflows/broken-links.yml @@ -18,7 +18,7 @@ jobs: - name: Link Checker id: lychee - uses: lycheeverse/lychee-action@8646ba30535128ac92d33dfc9133794bfdd9b411 # v2 + uses: lycheeverse/lychee-action@e7477775783ea5526144ba13e8db5eec57747ce8 # v2 with: args: "--verbose --no-progress './**/*.md'" fail: false # Don't fail on broken links, create an issue instead From d7610fe87c0f73f64975855e36e2266b60714780 Mon Sep 17 00:00:00 2001 From: AB Date: Fri, 10 Jul 2026 11:38:48 +0200 Subject: [PATCH 4/4] Add `copyForExactRebuild` --- CHANGELOG.md | 3 ++ pom.xml | 2 +- .../pom.xml | 4 +- .../pom.xml | 2 +- testcontainers-advanced-imagebuilder/pom.xml | 2 +- .../AbstractImageFromDockerfile.java | 40 ++++++++++++++++++ .../AdvancedImageFromDockerFile.java | 41 ++++++++----------- .../NativeAdvancedImageFromDockerfile.java | 23 +++++++++++ 8 files changed, 89 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f0a35eb6..e8ad6c36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +# 4.1.0 +* New method `copyForExactRebuild` + # 4.0.0 * Add `NativeAdvancedImageFromDockerfile` * Builds the image using a new `docker build` process diff --git a/pom.xml b/pom.xml index c129254a..61ce2c5d 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ software.xdev testcontainers-advanced-imagebuilder-root - 4.0.1-SNAPSHOT + 4.1.0-SNAPSHOT pom diff --git a/testcontainers-advanced-imagebuilder-demo/pom.xml b/testcontainers-advanced-imagebuilder-demo/pom.xml index a570bdb3..d0c48b5e 100644 --- a/testcontainers-advanced-imagebuilder-demo/pom.xml +++ b/testcontainers-advanced-imagebuilder-demo/pom.xml @@ -7,11 +7,11 @@ software.xdev testcontainers-advanced-imagebuilder-root - 4.0.1-SNAPSHOT + 4.1.0-SNAPSHOT testcontainers-advanced-imagebuilder-demo - 4.0.1-SNAPSHOT + 4.1.0-SNAPSHOT jar diff --git a/testcontainers-advanced-imagebuilder-dummy-app/pom.xml b/testcontainers-advanced-imagebuilder-dummy-app/pom.xml index e91c0817..78d0e959 100644 --- a/testcontainers-advanced-imagebuilder-dummy-app/pom.xml +++ b/testcontainers-advanced-imagebuilder-dummy-app/pom.xml @@ -6,7 +6,7 @@ software.xdev testcontainers-advanced-imagebuilder-dummy-app - 4.0.1-SNAPSHOT + 4.1.0-SNAPSHOT jar diff --git a/testcontainers-advanced-imagebuilder/pom.xml b/testcontainers-advanced-imagebuilder/pom.xml index 40842f26..91d242cf 100644 --- a/testcontainers-advanced-imagebuilder/pom.xml +++ b/testcontainers-advanced-imagebuilder/pom.xml @@ -6,7 +6,7 @@ software.xdev testcontainers-advanced-imagebuilder - 4.0.1-SNAPSHOT + 4.1.0-SNAPSHOT jar testcontainers-advanced-imagebuilder diff --git a/testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/AbstractImageFromDockerfile.java b/testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/AbstractImageFromDockerfile.java index 5a30e41b..00859776 100644 --- a/testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/AbstractImageFromDockerfile.java +++ b/testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/AbstractImageFromDockerfile.java @@ -263,6 +263,41 @@ protected Logger log() @Override protected abstract String resolve(); + /** + * Creates a copy of the image-builder that will build the exact same image. + *

+ * NOTE: Requires {@link #createTransferFilesCache} to be set to true and an initial build, so that + * {@link #transferFileCache} is seeded. + *

+ */ + public abstract S copyForExactRebuild(final String dockerImageName); + + protected S copyForExactRebuild(final BiFunction createNewFunc, final String dockerImageName) + { + if(!this.createTransferFilesCache) + { + throw new IllegalStateException( + "createTransferFilesCache must be true to execute this operation"); + } + if(this.transferFileCache == null) + { + throw new IllegalStateException("No transferFileCache. Did you build this image?"); + } + + final S image = createNewFunc.apply(dockerImageName, this.deleteOnExit) + .withBuildArgs(this.buildArgs) + .withLoggerForBuild(this.loggerForBuild) + .withCreateTransferFilesCache(false) + .withTransferFileCache(this.transferFileCache) + .withDisablePull(true); + + this.optDockerFilePath.ifPresent(image::withDockerFilePath); + this.optBaseDir.ifPresent(image::withBaseDir); + this.optTarget.ifPresent(image::withTarget); + + return image; + } + // region with public S withLoggerForBuild(final Logger loggerForBuild) @@ -485,6 +520,11 @@ public S withUseWinNTFSJunctionFixIfApplicable( // endregion + public String getDockerImageName() + { + return this.dockerImageName; + } + @SuppressWarnings("unchecked") protected S self() { diff --git a/testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/AdvancedImageFromDockerFile.java b/testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/AdvancedImageFromDockerFile.java index 6048be53..0784f01e 100644 --- a/testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/AdvancedImageFromDockerFile.java +++ b/testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/AdvancedImageFromDockerFile.java @@ -29,6 +29,7 @@ import java.util.Map.Entry; import java.util.Optional; import java.util.Set; +import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.zip.GZIPOutputStream; @@ -259,6 +260,22 @@ protected void prepareImagePull( state.setExternalDependencyImageNames(externalDependencyImageNames); } + @Override + public AdvancedImageFromDockerFile copyForExactRebuild(final String dockerImageName) + { + return this.copyForExactRebuild(AdvancedImageFromDockerFile::new, dockerImageName); + } + + @Override + protected AdvancedImageFromDockerFile copyForExactRebuild( + final BiFunction createNewFunc, + final String dockerImageName) + { + return super.copyForExactRebuild(createNewFunc, dockerImageName) + .withExplicitTransferables(this.explicitTransferables) + .withBuildImageCmdModifiers(this.buildImageCmdModifiers); + } + /** * @see #copyForIntermediateTag(String, String) */ @@ -278,29 +295,7 @@ public AdvancedImageFromDockerFile copyForIntermediateTag(final String target) public AdvancedImageFromDockerFile copyForIntermediateTag( final String dockerImageName, final String target) { - if(!this.createTransferFilesCache) - { - throw new IllegalStateException( - "createTransferFilesCache must be true to execute this operation"); - } - if(this.transferFileCache == null) - { - throw new IllegalStateException("No transferFileCache. Did you build this image?"); - } - - return new AdvancedImageFromDockerFile(dockerImageName, this.deleteOnExit) - // Copy defaults - .withExplicitTransferables(this.explicitTransferables) - .withBuildArgs(this.buildArgs) - .withLoggerForBuild(this.loggerForBuild) - .withDockerFilePath(this.optDockerFilePath.orElse(null)) - .withBaseDir(this.optBaseDir.orElse(null)) - .withBuildImageCmdModifiers(this.buildImageCmdModifiers) - // Special - .withCreateTransferFilesCache(false) - .withTransferFileCache(this.transferFileCache) - .withTarget(target) - .withDisablePull(true); + return this.copyForExactRebuild(dockerImageName).withTarget(target); } public void cleanCreatedTransferFilesCache() diff --git a/testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/buildxnative/NativeAdvancedImageFromDockerfile.java b/testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/buildxnative/NativeAdvancedImageFromDockerfile.java index 426866a8..b97a0872 100644 --- a/testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/buildxnative/NativeAdvancedImageFromDockerfile.java +++ b/testcontainers-advanced-imagebuilder/src/main/java/software/xdev/testcontainers/imagebuilder/buildxnative/NativeAdvancedImageFromDockerfile.java @@ -29,6 +29,7 @@ import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; +import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.stream.Stream; @@ -280,6 +281,28 @@ protected void logStream(final InputStream src, final Consumer logFunc) }, this.executorService()); } + @Override + public NativeAdvancedImageFromDockerfile copyForExactRebuild(final String dockerImageName) + { + return this.copyForExactRebuild(NativeAdvancedImageFromDockerfile::new, dockerImageName); + } + + @Override + protected NativeAdvancedImageFromDockerfile copyForExactRebuild( + final BiFunction createNewFunc, + final String dockerImageName) + { + final NativeAdvancedImageFromDockerfile image = super.copyForExactRebuild(createNewFunc, dockerImageName) + .withAdditionalArgs(this.additionalArgs) + .withLoad(this.load) + .withTimeout(this.timeout); + + this.optCacheFrom.ifPresent(image::withCacheFrom); + this.optCacheTo.ifPresent(image::withCacheTo); + + return image; + } + // region with public NativeAdvancedImageFromDockerfile withBaseCommand(final List baseCommand)