diff --git a/.github/workflows/broken-links.yml b/.github/workflows/broken-links.yml index fbe05e7..8aeed09 100644 --- a/.github/workflows/broken-links.yml +++ b/.github/workflows/broken-links.yml @@ -19,7 +19,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 diff --git a/CHANGELOG.md b/CHANGELOG.md index f0a35eb..e8ad6c3 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 c129254..61ce2c5 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 a570bdb..d0c48b5 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 e91c081..78d0e95 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 40842f2..91d242c 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 5a30e41..0085977 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 6048be5..0784f01 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 426866a..b97a087 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) 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 4d7e791..96a1b6d 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();