Commit b281af0b authored by Scott Frederick's avatar Scott Frederick

Remove adding of existing layers to EphemeralBuilder

Layers were being added to the EphemeralBuilder each time one was
created, but those layers already existed in the base builder image.

Closes gh-19832
parent cf25623d
...@@ -21,19 +21,18 @@ import java.time.Clock; ...@@ -21,19 +21,18 @@ import java.time.Clock;
import java.time.Instant; import java.time.Instant;
import java.util.Map; import java.util.Map;
import org.springframework.boot.buildpack.platform.build.BuilderMetadata.Stack.RunImage;
import org.springframework.boot.buildpack.platform.docker.type.Image; import org.springframework.boot.buildpack.platform.docker.type.Image;
import org.springframework.boot.buildpack.platform.docker.type.ImageArchive; import org.springframework.boot.buildpack.platform.docker.type.ImageArchive;
import org.springframework.boot.buildpack.platform.docker.type.ImageReference; import org.springframework.boot.buildpack.platform.docker.type.ImageReference;
import org.springframework.boot.buildpack.platform.docker.type.Layer; import org.springframework.boot.buildpack.platform.docker.type.Layer;
import org.springframework.boot.buildpack.platform.io.Content; import org.springframework.boot.buildpack.platform.io.Content;
import org.springframework.boot.buildpack.platform.io.Owner; import org.springframework.boot.buildpack.platform.io.Owner;
import org.springframework.boot.buildpack.platform.toml.Toml;
/** /**
* An short lived builder that is created for each {@link Lifecycle} run. * An short lived builder that is created for each {@link Lifecycle} run.
* *
* @author Phillip Webb * @author Phillip Webb
* @author Scott Frederick
*/ */
class EphemeralBuilder { class EphemeralBuilder {
...@@ -74,8 +73,6 @@ class EphemeralBuilder { ...@@ -74,8 +73,6 @@ class EphemeralBuilder {
update.withUpdatedConfig(this.builderMetadata::attachTo); update.withUpdatedConfig(this.builderMetadata::attachTo);
update.withTag(name); update.withTag(name);
update.withCreateDate(Instant.now(clock)); update.withCreateDate(Instant.now(clock));
update.withNewLayer(getDefaultDirsLayer(buildOwner));
update.withNewLayer(getStackLayer(builderMetadata));
if (env != null && !env.isEmpty()) { if (env != null && !env.isEmpty()) {
update.withNewLayer(getEnvLayer(env)); update.withNewLayer(getEnvLayer(env));
} }
...@@ -86,30 +83,6 @@ class EphemeralBuilder { ...@@ -86,30 +83,6 @@ class EphemeralBuilder {
update.withCreatedBy("Spring Boot", "dev"); update.withCreatedBy("Spring Boot", "dev");
} }
private Layer getDefaultDirsLayer(Owner buildOwner) throws IOException {
return Layer.of((layout) -> {
layout.folder("/workspace", buildOwner);
layout.folder("/layers", buildOwner);
layout.folder("/cnb", Owner.ROOT);
layout.folder("/cnb/buildpacks", Owner.ROOT);
layout.folder("/platform", Owner.ROOT);
layout.folder("/platform/env", Owner.ROOT);
});
}
private Layer getStackLayer(BuilderMetadata builderMetadata) throws IOException {
Toml toml = getRunImageToml(builderMetadata.getStack().getRunImage());
return Layer.of((layout) -> layout.file("/cnb/stack.toml", Owner.ROOT, Content.of(toml.toString())));
}
private Toml getRunImageToml(RunImage runImage) {
Toml toml = new Toml();
toml.table("run-image");
toml.string("image", runImage.getImage());
toml.array("mirrors", runImage.getMirrors());
return toml;
}
private Layer getEnvLayer(Map<String, String> env) throws IOException { private Layer getEnvLayer(Map<String, String> env) throws IOException {
return Layer.of((layout) -> { return Layer.of((layout) -> {
for (Map.Entry<String, String> entry : env.entrySet()) { for (Map.Entry<String, String> entry : env.entrySet()) {
......
...@@ -19,9 +19,7 @@ package org.springframework.boot.buildpack.platform.build; ...@@ -19,9 +19,7 @@ package org.springframework.boot.buildpack.platform.build;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStream; import java.io.OutputStream;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.time.Clock; import java.time.Clock;
...@@ -42,7 +40,6 @@ import org.springframework.boot.buildpack.platform.docker.type.ImageArchive; ...@@ -42,7 +40,6 @@ import org.springframework.boot.buildpack.platform.docker.type.ImageArchive;
import org.springframework.boot.buildpack.platform.docker.type.ImageConfig; import org.springframework.boot.buildpack.platform.docker.type.ImageConfig;
import org.springframework.boot.buildpack.platform.docker.type.ImageReference; import org.springframework.boot.buildpack.platform.docker.type.ImageReference;
import org.springframework.boot.buildpack.platform.json.AbstractJsonTests; import org.springframework.boot.buildpack.platform.json.AbstractJsonTests;
import org.springframework.util.FileCopyUtils;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
...@@ -50,6 +47,7 @@ import static org.assertj.core.api.Assertions.assertThat; ...@@ -50,6 +47,7 @@ import static org.assertj.core.api.Assertions.assertThat;
* Tests for {@link EphemeralBuilder}. * Tests for {@link EphemeralBuilder}.
* *
* @author Phillip Webb * @author Phillip Webb
* @author Scott Frederick
*/ */
class EphemeralBuilderTests extends AbstractJsonTests { class EphemeralBuilderTests extends AbstractJsonTests {
...@@ -101,33 +99,10 @@ class EphemeralBuilderTests extends AbstractJsonTests { ...@@ -101,33 +99,10 @@ class EphemeralBuilderTests extends AbstractJsonTests {
assertThat(builder.getArchive().getCreateDate()).isEqualTo(Instant.now(clock)); assertThat(builder.getArchive().getCreateDate()).isEqualTo(Instant.now(clock));
} }
@Test
void getArchiveContainsDefaultDirsLayer() throws Exception {
EphemeralBuilder builder = new EphemeralBuilder(this.owner, this.image, this.metadata, this.env);
File folder = unpack(getLayer(builder.getArchive(), 0), "dirs");
assertThat(new File(folder, "workspace")).isDirectory();
assertThat(new File(folder, "layers")).isDirectory();
assertThat(new File(folder, "cnb")).isDirectory();
assertThat(new File(folder, "cnb/buildpacks")).isDirectory();
assertThat(new File(folder, "platform")).isDirectory();
assertThat(new File(folder, "platform/env")).isDirectory();
}
@Test
void getArchiveContainsStackLayer() throws Exception {
EphemeralBuilder builder = new EphemeralBuilder(this.owner, this.image, this.metadata, this.env);
File folder = unpack(getLayer(builder.getArchive(), 1), "stack");
File tomlFile = new File(folder, "cnb/stack.toml");
assertThat(tomlFile).exists();
String toml = FileCopyUtils
.copyToString(new InputStreamReader(new FileInputStream(tomlFile), StandardCharsets.UTF_8));
assertThat(toml).contains("[run-image]").contains("image = ");
}
@Test @Test
void getArchiveContainsEnvLayer() throws Exception { void getArchiveContainsEnvLayer() throws Exception {
EphemeralBuilder builder = new EphemeralBuilder(this.owner, this.image, this.metadata, this.env); EphemeralBuilder builder = new EphemeralBuilder(this.owner, this.image, this.metadata, this.env);
File folder = unpack(getLayer(builder.getArchive(), 2), "env"); File folder = unpack(getLayer(builder.getArchive(), 0), "env");
assertThat(new File(folder, "platform/env/spring")).usingCharset(StandardCharsets.UTF_8).hasContent("boot"); assertThat(new File(folder, "platform/env/spring")).usingCharset(StandardCharsets.UTF_8).hasContent("boot");
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment