Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ public void buildNativeTestDockerImageTest() throws IOException {
Files.createDirectories(outputDir);
String defaultBuilderCmd = "native-image -jar " +
dockerModel.getFatJarPath().getFileName().toString() +
" -H:Name=hello --no-fallback -H:+StaticExecutableWithDynamicLibC";
" -o hello --no-fallback -H:+StaticExecutableWithDynamicLibC";
dockerModel.setBuilderCmd(defaultBuilderCmd);

boolean passed = false;
Expand All @@ -245,7 +245,7 @@ public void buildNativeTestDockerImageTest() throws IOException {
Assert.assertTrue(dockerFileContent.contains(copyJar));
String copyReflectJson = "COPY reflect-config.json .";
Assert.assertTrue(dockerFileContent.contains(copyReflectJson));
String nativeImageCMD = "RUN native-image -jar hello.jar -H:Name=hello --no-fallback " +
String nativeImageCMD = "RUN native-image -jar hello.jar -o hello --no-fallback " +
"-H:+StaticExecutableWithDynamicLibC " +
"-H:IncludeResources=excludedClasses.txt " +
"-H:IncludeResources=cache/tests_cache/test_suit.json " +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

package io.ballerina.c2c.test.samples;

import io.ballerina.c2c.DockerGenConstants;
import io.ballerina.c2c.exceptions.KubernetesPluginException;
import io.ballerina.c2c.test.utils.KubernetesTestUtils;
import io.ballerina.c2c.utils.KubernetesUtils;
Expand All @@ -44,26 +45,27 @@ public class NativeArgsTest {
private static final Path SOURCE_DIR_PATH = SAMPLE_DIR.resolve("graalvm-build-args");
private static final Path DOCKER_TARGET_PATH =
SOURCE_DIR_PATH.resolve("target").resolve(DOCKER).resolve("native_args");

@Test
public void validateDockerBuildOption() throws IOException, InterruptedException, KubernetesPluginException {
Assert.assertEquals(KubernetesTestUtils.compileBallerinaProject(SOURCE_DIR_PATH), 0);
File dockerFile = DOCKER_TARGET_PATH.resolve("Dockerfile").toFile();
String content = Files.readString(dockerFile.toPath(), StandardCharsets.UTF_8);
Assert.assertTrue(dockerFile.exists());
Assert.assertTrue(content.contains("RUN native-image --gc=epsilon -jar native_args.jar " +
"-H:Name=native_args --no-fallback -H:+StaticExecutableWithDynamicLibC"));
Assert.assertTrue(content.contains("FROM gcr.io/distroless/base"));
"-o native_args --no-fallback -H:+StaticExecutableWithDynamicLibC"));
Assert.assertTrue(content.contains("FROM " + DockerGenConstants.NATIVE_BUILDER_IMAGE));
KubernetesUtils.deleteDirectory(DOCKER_TARGET_PATH);
}

@Test(dependsOnMethods = { "validateDockerBuildOption" })
@Test(dependsOnMethods = {"validateDockerBuildOption"})
public void validateK8sBuildOption() throws IOException, InterruptedException, KubernetesPluginException {
Assert.assertEquals(KubernetesTestUtils.compileBallerinaProject(SOURCE_DIR_PATH, "k8s"), 0);
File dockerFile = DOCKER_TARGET_PATH.resolve("Dockerfile").toFile();
String content = Files.readString(dockerFile.toPath(), StandardCharsets.UTF_8);
Assert.assertTrue(dockerFile.exists());
Assert.assertTrue(content.contains("RUN native-image --gc=epsilon -jar native_args.jar " +
"-H:Name=native_args --no-fallback -H:+StaticExecutableWithDynamicLibC"));
"-o native_args --no-fallback -H:+StaticExecutableWithDynamicLibC"));
KubernetesUtils.deleteDirectory(DOCKER_TARGET_PATH);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

package io.ballerina.c2c.test.samples;

import io.ballerina.c2c.DockerGenConstants;
import io.ballerina.c2c.exceptions.KubernetesPluginException;
import io.ballerina.c2c.test.utils.KubernetesTestUtils;
import io.ballerina.c2c.utils.KubernetesUtils;
Expand Down Expand Up @@ -52,7 +53,7 @@ public void validateCustomBaseImage() throws IOException, InterruptedException,
String content = Files.readString(dockerFile.toPath(), StandardCharsets.UTF_8);
Assert.assertTrue(dockerFile.exists());
Assert.assertTrue(content.contains("FROM alpine"));
Assert.assertTrue(content.contains("FROM ghcr.io/graalvm/native-image-community:21-ol9 as build"));
Assert.assertTrue(content.contains("FROM " + DockerGenConstants.NATIVE_BUILDER_IMAGE + " as build"));
KubernetesUtils.deleteDirectory(DOCKER_TARGET_PATH);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

package io.ballerina.c2c.test.samples;

import io.ballerina.c2c.DockerGenConstants;
import io.ballerina.c2c.exceptions.KubernetesPluginException;
import io.ballerina.c2c.test.utils.KubernetesTestUtils;
import io.ballerina.c2c.utils.KubernetesUtils;
Expand All @@ -44,29 +45,30 @@ public class NativeBuilderConfigTest {
private static final Path SOURCE_DIR_PATH = SAMPLE_DIR.resolve("graalvm-custom-builder");
private static final Path DOCKER_TARGET_PATH =
SOURCE_DIR_PATH.resolve("target").resolve(DOCKER).resolve("custom_builder");

@Test
public void validateDockerBuildOption() throws IOException, InterruptedException, KubernetesPluginException {
Assert.assertEquals(KubernetesTestUtils.compileBallerinaProject(SOURCE_DIR_PATH), 0);
File dockerFile = DOCKER_TARGET_PATH.resolve("Dockerfile").toFile();
String content = Files.readString(dockerFile.toPath(), StandardCharsets.UTF_8);
Assert.assertTrue(dockerFile.exists());
Assert.assertTrue(content.contains("RUN native-image -jar custom_builder.jar -H:Name=custom_builder " +
Assert.assertTrue(content.contains("RUN native-image -jar custom_builder.jar -o custom_builder " +
"--no-fallback --static --libc=musl"));
Assert.assertTrue(content.contains("FROM ghcr.io/graalvm/native-image-community:21-muslib-ol9 as build"));
Assert.assertTrue(content.contains("FROM gcr.io/distroless/base"));
Assert.assertTrue(content.contains("FROM " + DockerGenConstants.NATIVE_RUNTIME_BASE_IMAGE));
KubernetesUtils.deleteDirectory(DOCKER_TARGET_PATH);
}

@Test(dependsOnMethods = { "validateDockerBuildOption" })
@Test(dependsOnMethods = {"validateDockerBuildOption"})
public void validateK8sBuildOption() throws IOException, InterruptedException, KubernetesPluginException {
Assert.assertEquals(KubernetesTestUtils.compileBallerinaProject(SOURCE_DIR_PATH, "k8s"), 0);
File dockerFile = DOCKER_TARGET_PATH.resolve("Dockerfile").toFile();
String content = Files.readString(dockerFile.toPath(), StandardCharsets.UTF_8);
Assert.assertTrue(dockerFile.exists());
Assert.assertTrue(content.contains("RUN native-image -jar custom_builder.jar -H:Name=custom_builder " +
Assert.assertTrue(content.contains("RUN native-image -jar custom_builder.jar -o custom_builder " +
"--no-fallback --static --libc=musl"));
Assert.assertTrue(content.contains("FROM ghcr.io/graalvm/native-image-community:21-muslib-ol9 as build"));
Assert.assertTrue(content.contains("FROM gcr.io/distroless/base"));
Assert.assertTrue(content.contains("FROM " + DockerGenConstants.NATIVE_RUNTIME_BASE_IMAGE));
KubernetesUtils.deleteDirectory(DOCKER_TARGET_PATH);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public void validateDockerBuildOption() throws IOException, InterruptedException
String content = Files.readString(dockerFile.toPath(), StandardCharsets.UTF_8);
Assert.assertTrue(dockerFile.exists());
Assert.assertTrue(content.contains("RUN native-image --static --libc=musl -jar impl_args.jar " +
"-H:Name=impl_args --no-fallback"));
"-o impl_args --no-fallback"));
Assert.assertTrue(content.contains("FROM alpine"));
Assert.assertFalse(content.contains("-H:+StaticExecutableWithDynamicLibC"));
KubernetesUtils.deleteDirectory(DOCKER_TARGET_PATH);
Expand All @@ -64,7 +64,7 @@ public void validateK8sBuildOption() throws IOException, InterruptedException, K
String content = Files.readString(dockerFile.toPath(), StandardCharsets.UTF_8);
Assert.assertTrue(dockerFile.exists());
Assert.assertTrue(content.contains("RUN native-image --static --libc=musl -jar impl_args.jar " +
"-H:Name=impl_args --no-fallback"));
"-o impl_args --no-fallback"));
Assert.assertFalse(content.contains("-H:+StaticExecutableWithDynamicLibC"));

KubernetesUtils.deleteDirectory(DOCKER_TARGET_PATH);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package io.ballerina.c2c.test.samples;

import com.github.dockerjava.api.command.InspectImageResponse;
import io.ballerina.c2c.DockerGenConstants;
import io.ballerina.c2c.KubernetesConstants;
import io.ballerina.c2c.exceptions.KubernetesPluginException;
import io.ballerina.c2c.test.utils.KubernetesTestUtils;
Expand Down Expand Up @@ -69,10 +70,10 @@ public void validateDockerfile() throws IOException {
File dockerFile = DOCKER_TARGET_PATH.resolve("Dockerfile").toFile();
Assert.assertTrue(dockerFile.exists());
String content = Files.readString(dockerFile.toPath(), StandardCharsets.UTF_8);
Assert.assertTrue(content.contains("RUN native-image -jar hello.jar -H:Name=hello --no-fallback " +
Assert.assertTrue(content.contains("RUN native-image -jar hello.jar -o hello --no-fallback " +
"-H:+StaticExecutableWithDynamicLibC"));
Assert.assertTrue(content.contains("FROM ghcr.io/graalvm/native-image-community:21-ol9 as build"));
Assert.assertTrue(content.contains("FROM gcr.io/distroless/base"));
Assert.assertTrue(content.contains("FROM " + DockerGenConstants.NATIVE_BUILDER_IMAGE + " as build"));
Assert.assertTrue(content.contains("FROM " + DockerGenConstants.NATIVE_RUNTIME_BASE_IMAGE));
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

package io.ballerina.c2c.test.samples;

import io.ballerina.c2c.DockerGenConstants;
import io.ballerina.c2c.KubernetesConstants;
import io.ballerina.c2c.exceptions.KubernetesPluginException;
import io.ballerina.c2c.test.utils.KubernetesTestUtils;
Expand Down Expand Up @@ -101,7 +102,7 @@ public void validateDeployment() {
Assert.assertEquals(deployment.getSpec().getTemplate().getSpec().getContainers().size(), 1);

// Assert Containers
Container container = deployment.getSpec().getTemplate().getSpec().getContainers().get(0);
Container container = deployment.getSpec().getTemplate().getSpec().getContainers().getFirst();
Assert.assertEquals(container.getImage(), DOCKER_IMAGE);
Assert.assertEquals(container.getPorts().size(), 1);
}
Expand All @@ -113,21 +114,21 @@ public void validateService() {
Assert.assertEquals("hello-svc", service.getMetadata().getName());
Assert.assertEquals("ClusterIP", service.getSpec().getType());
Assert.assertEquals(1, service.getSpec().getPorts().size());
Assert.assertEquals(9090, service.getSpec().getPorts().get(0).getPort().intValue());
Assert.assertEquals(9090, service.getSpec().getPorts().get(0).getTargetPort().getIntVal().intValue());
Assert.assertEquals("TCP", service.getSpec().getPorts().get(0).getProtocol());
Assert.assertEquals("port-1-hello-sv", service.getSpec().getPorts().get(0).getName());
Assert.assertEquals(9090, service.getSpec().getPorts().getFirst().getPort().intValue());
Assert.assertEquals(9090, service.getSpec().getPorts().getFirst().getTargetPort().getIntVal().intValue());
Assert.assertEquals("TCP", service.getSpec().getPorts().getFirst().getProtocol());
Assert.assertEquals("port-1-hello-sv", service.getSpec().getPorts().getFirst().getName());
}

@Test
public void validateDockerfile() throws IOException {
File dockerFile = DOCKER_TARGET_PATH.resolve("Dockerfile").toFile();
Assert.assertTrue(dockerFile.exists());
String content = Files.readString(dockerFile.toPath(), StandardCharsets.UTF_8);
Assert.assertTrue(content.contains("RUN native-image -jar hello.jar -H:Name=hello --no-fallback " +
Assert.assertTrue(content.contains("RUN native-image -jar hello.jar -o hello --no-fallback " +
"-H:+StaticExecutableWithDynamicLibC"));
Assert.assertTrue(content.contains("FROM ghcr.io/graalvm/native-image-community:21-ol9 as build"));
Assert.assertTrue(content.contains("FROM gcr.io/distroless/base"));
Assert.assertTrue(content.contains("FROM " + DockerGenConstants.NATIVE_BUILDER_IMAGE + " as build"));
Assert.assertTrue(content.contains("FROM " + DockerGenConstants.NATIVE_RUNTIME_BASE_IMAGE));
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public class DockerGenConstants {
public static final String TAG_SEPARATOR = ":";
public static final String JRE_SLIM_BASE = "ballerina/jvm-runtime:3.0";
public static final String NATIVE_BUILDER_IMAGE = "ghcr.io/graalvm/native-image-community:21-ol9";
public static final String NATIVE_RUNTIME_BASE_IMAGE = "gcr.io/distroless/base";
public static final String NATIVE_RUNTIME_BASE_IMAGE = "gcr.io/distroless/cc";
public static final int MAX_BALLERINA_LAYERS = 110;

public static final String SCHEMA_FILE_NAME = "c2c-schema.json";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ public static void resolveDockerToml(KubernetesModel model) throws KubernetesPlu
if (!dockerModel.getGraalvmBuildArgs().equals("")) {
defaultBuilderCmd.append(dockerModel.getGraalvmBuildArgs()).append(" ");
}
defaultBuilderCmd.append("-jar ").append(fatJarFileName).append(" -H:Name=")
defaultBuilderCmd.append("-jar ").append(fatJarFileName).append(" -o ")
.append(executableName).append(" --no-fallback");

//Avoid adding mostly static flag if --static flag is given
Expand Down
2 changes: 1 addition & 1 deletion docker-images/native-builder/build-native.sh
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,4 @@ native-image \
${3:+$(echo " $3")} \
-jar "$1" \
--no-fallback \
-H:Name="${2}"
-o "${2}"
2 changes: 1 addition & 1 deletion examples/graalvm-custom-builder/Cloud.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ buildImage = false

[graalvm.builder]
base = "ghcr.io/graalvm/native-image-community:21-muslib-ol9"
buildCmd = "native-image -jar custom_builder.jar -H:Name=custom_builder --no-fallback --static --libc=musl"
buildCmd = "native-image -jar custom_builder.jar -o custom_builder --no-fallback --static --libc=musl"