Search in sources :

Example 1 with ContainerImageBuilderBuildItem

use of io.quarkus.container.spi.ContainerImageBuilderBuildItem in project quarkus by quarkusio.

the class S2iProcessor method s2iBuildFromNative.

@BuildStep(onlyIf = { IsNormalNotRemoteDev.class, S2iBuild.class, NativeBuild.class })
public void s2iBuildFromNative(S2iConfig s2iConfig, ContainerImageConfig containerImageConfig, KubernetesClientBuildItem kubernetesClient, ContainerImageInfoBuildItem containerImage, ArchiveRootBuildItem archiveRoot, OutputTargetBuildItem out, PackageConfig packageConfig, List<GeneratedFileSystemResourceBuildItem> generatedResources, Optional<ContainerImageBuildRequestBuildItem> buildRequest, Optional<ContainerImagePushRequestBuildItem> pushRequest, BuildProducer<ArtifactResultBuildItem> artifactResultProducer, BuildProducer<ContainerImageBuilderBuildItem> containerImageBuilder, NativeImageBuildItem nativeImage) {
    if (containerImageConfig.isBuildExplicitlyDisabled()) {
        return;
    }
    if (!containerImageConfig.isBuildExplicitlyEnabled() && !containerImageConfig.isPushExplicitlyEnabled() && !buildRequest.isPresent() && !pushRequest.isPresent()) {
        return;
    }
    String namespace = Optional.ofNullable(kubernetesClient.getClient().getNamespace()).orElse("default");
    LOG.info("Performing s2i binary build with native image on server: " + kubernetesClient.getClient().getMasterUrl() + " in namespace:" + namespace + ".");
    Optional<GeneratedFileSystemResourceBuildItem> openshiftYml = generatedResources.stream().filter(r -> r.getName().endsWith("kubernetes" + File.separator + "openshift.yml")).findFirst();
    if (openshiftYml.isEmpty()) {
        LOG.warn("No Openshift manifests were generated so no s2i process will be taking place");
        return;
    }
    createContainerImage(kubernetesClient, openshiftYml.get(), s2iConfig, out.getOutputDirectory(), nativeImage.getPath());
    artifactResultProducer.produce(new ArtifactResultBuildItem(null, "native-container", Collections.emptyMap()));
    containerImageBuilder.produce(new ContainerImageBuilderBuildItem(S2I));
}
Also used : Arrays(java.util.Arrays) KubernetesClientBuildItem(io.quarkus.kubernetes.client.spi.KubernetesClientBuildItem) KubernetesEnvBuildItem(io.quarkus.kubernetes.spi.KubernetesEnvBuildItem) ContainerImageBuilderBuildItem(io.quarkus.container.spi.ContainerImageBuilderBuildItem) LogWatch(io.fabric8.kubernetes.client.dsl.LogWatch) BuildProducer(io.quarkus.deployment.annotations.BuildProducer) ArchiveRootBuildItem(io.quarkus.deployment.builditem.ArchiveRootBuildItem) ByteArrayInputStream(java.io.ByteArrayInputStream) Map(java.util.Map) Build(io.fabric8.openshift.api.model.Build) KubernetesCommandBuildItem(io.quarkus.kubernetes.spi.KubernetesCommandBuildItem) Path(java.nio.file.Path) IsNormalNotRemoteDev(io.quarkus.deployment.IsNormalNotRemoteDev) KubernetesClientException(io.fabric8.kubernetes.client.KubernetesClientException) NativeImageBuildItem(io.quarkus.deployment.pkg.builditem.NativeImageBuildItem) Predicate(java.util.function.Predicate) ContainerImagePushRequestBuildItem(io.quarkus.container.spi.ContainerImagePushRequestBuildItem) JarBuildItem(io.quarkus.deployment.pkg.builditem.JarBuildItem) Collection(java.util.Collection) ContainerImageConfig(io.quarkus.container.image.deployment.ContainerImageConfig) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Collectors(java.util.stream.Collectors) HasMetadata(io.fabric8.kubernetes.api.model.HasMetadata) Executors(java.util.concurrent.Executors) PackageConfig(io.quarkus.deployment.pkg.PackageConfig) ContainerImageInfoBuildItem(io.quarkus.container.spi.ContainerImageInfoBuildItem) Config(io.fabric8.kubernetes.client.Config) List(java.util.List) Stream(java.util.stream.Stream) ResolvedDependency(io.quarkus.maven.dependency.ResolvedDependency) Optional(java.util.Optional) Secret(io.fabric8.kubernetes.api.model.Secret) AvailableContainerImageExtensionBuildItem(io.quarkus.container.spi.AvailableContainerImageExtensionBuildItem) Logger(org.jboss.logging.Logger) KubernetesClientErrorHandler(io.quarkus.kubernetes.client.deployment.KubernetesClientErrorHandler) CurateOutcomeBuildItem(io.quarkus.deployment.pkg.builditem.CurateOutcomeBuildItem) CompiledJavaVersionBuildItem(io.quarkus.deployment.pkg.builditem.CompiledJavaVersionBuildItem) StandardCopyOption(java.nio.file.StandardCopyOption) ArrayList(java.util.ArrayList) ImageUtil(io.quarkus.container.image.deployment.util.ImageUtil) BuildStep(io.quarkus.deployment.annotations.BuildStep) BaseImageInfoBuildItem(io.quarkus.container.spi.BaseImageInfoBuildItem) ImageStream(io.fabric8.openshift.api.model.ImageStream) KubernetesList(io.fabric8.kubernetes.api.model.KubernetesList) ContainerImageBuildRequestBuildItem(io.quarkus.container.spi.ContainerImageBuildRequestBuildItem) Files(java.nio.file.Files) Executor(java.util.concurrent.Executor) ArtifactResultBuildItem(io.quarkus.deployment.pkg.builditem.ArtifactResultBuildItem) IOException(java.io.IOException) Serialization(io.dekorate.utils.Serialization) OpenShiftClient(io.fabric8.openshift.client.OpenShiftClient) InputStreamReader(java.io.InputStreamReader) NativeBuild(io.quarkus.deployment.pkg.steps.NativeBuild) File(java.io.File) TimeUnit(java.util.concurrent.TimeUnit) Clients(io.dekorate.utils.Clients) BuildConfig(io.fabric8.openshift.api.model.BuildConfig) OutputTargetBuildItem(io.quarkus.deployment.pkg.builditem.OutputTargetBuildItem) Closeable(java.io.Closeable) GeneratedFileSystemResourceBuildItem(io.quarkus.deployment.builditem.GeneratedFileSystemResourceBuildItem) KubernetesClient(io.fabric8.kubernetes.client.KubernetesClient) BufferedReader(java.io.BufferedReader) Collections(java.util.Collections) ContainerImageBuilderBuildItem(io.quarkus.container.spi.ContainerImageBuilderBuildItem) ArtifactResultBuildItem(io.quarkus.deployment.pkg.builditem.ArtifactResultBuildItem) GeneratedFileSystemResourceBuildItem(io.quarkus.deployment.builditem.GeneratedFileSystemResourceBuildItem) BuildStep(io.quarkus.deployment.annotations.BuildStep)

Example 2 with ContainerImageBuilderBuildItem

use of io.quarkus.container.spi.ContainerImageBuilderBuildItem in project quarkus by quarkusio.

the class JibProcessor method buildFromNative.

@BuildStep(onlyIf = { IsNormalNotRemoteDev.class, JibBuild.class, NativeBuild.class })
public void buildFromNative(ContainerImageConfig containerImageConfig, JibConfig jibConfig, ContainerImageInfoBuildItem containerImage, NativeImageBuildItem nativeImage, OutputTargetBuildItem outputTarget, Optional<ContainerImageBuildRequestBuildItem> buildRequest, Optional<ContainerImagePushRequestBuildItem> pushRequest, List<ContainerImageLabelBuildItem> containerImageLabels, // used to ensure that we work with the compressed native binary if compression was enabled
Optional<UpxCompressedBuildItem> upxCompressed, BuildProducer<ArtifactResultBuildItem> artifactResultProducer, BuildProducer<ContainerImageBuilderBuildItem> containerImageBuilder) {
    boolean buildContainerImage = buildContainerImageNeeded(containerImageConfig, buildRequest);
    boolean pushContainerImage = pushContainerImageNeeded(containerImageConfig, pushRequest);
    if (!buildContainerImage && !pushContainerImage) {
        return;
    }
    if (!NativeBinaryUtil.nativeIsLinuxBinary(nativeImage)) {
        throw new RuntimeException("The native binary produced by the build is not a Linux binary and therefore cannot be used in a Linux container image. Consider adding \"quarkus.native.container-build=true\" to your configuration");
    }
    JibContainerBuilder jibContainerBuilder = createContainerBuilderFromNative(jibConfig, containerImageConfig, nativeImage, containerImageLabels);
    setUser(jibConfig, jibContainerBuilder);
    setPlatforms(jibConfig, jibContainerBuilder);
    handleExtraFiles(outputTarget, jibContainerBuilder);
    log.info("Starting (local) container image build for native binary using jib.");
    JibContainer container = containerize(containerImageConfig, jibConfig, containerImage, jibContainerBuilder, pushRequest.isPresent());
    writeOutputFiles(container, jibConfig, outputTarget);
    artifactResultProducer.produce(new ArtifactResultBuildItem(null, "native-container", Map.of("container-image", container.getTargetImage().toString(), "pull-required", "" + pushContainerImage)));
    containerImageBuilder.produce(new ContainerImageBuilderBuildItem(JIB));
}
Also used : ContainerImageBuilderBuildItem(io.quarkus.container.spi.ContainerImageBuilderBuildItem) JibContainer(com.google.cloud.tools.jib.api.JibContainer) ArtifactResultBuildItem(io.quarkus.deployment.pkg.builditem.ArtifactResultBuildItem) JibContainerBuilder(com.google.cloud.tools.jib.api.JibContainerBuilder) BuildStep(io.quarkus.deployment.annotations.BuildStep) JarResultBuildStep(io.quarkus.deployment.pkg.steps.JarResultBuildStep)

Example 3 with ContainerImageBuilderBuildItem

use of io.quarkus.container.spi.ContainerImageBuilderBuildItem in project quarkus by quarkusio.

the class JibProcessor method buildFromJar.

@BuildStep(onlyIf = { IsNormalNotRemoteDev.class, JibBuild.class }, onlyIfNot = NativeBuild.class)
public void buildFromJar(ContainerImageConfig containerImageConfig, JibConfig jibConfig, PackageConfig packageConfig, ContainerImageInfoBuildItem containerImage, JarBuildItem sourceJar, MainClassBuildItem mainClass, OutputTargetBuildItem outputTarget, CurateOutcomeBuildItem curateOutcome, CompiledJavaVersionBuildItem compiledJavaVersion, Optional<ContainerImageBuildRequestBuildItem> buildRequest, Optional<ContainerImagePushRequestBuildItem> pushRequest, List<ContainerImageLabelBuildItem> containerImageLabels, Optional<AppCDSResultBuildItem> appCDSResult, BuildProducer<ArtifactResultBuildItem> artifactResultProducer, BuildProducer<ContainerImageBuilderBuildItem> containerImageBuilder) {
    boolean buildContainerImage = buildContainerImageNeeded(containerImageConfig, buildRequest);
    boolean pushContainerImage = pushContainerImageNeeded(containerImageConfig, pushRequest);
    if (!buildContainerImage && !pushContainerImage) {
        return;
    }
    JibContainerBuilder jibContainerBuilder;
    String packageType = packageConfig.type;
    if (packageConfig.isLegacyJar() || packageType.equalsIgnoreCase(PackageConfig.UBER_JAR)) {
        jibContainerBuilder = createContainerBuilderFromLegacyJar(determineBaseJvmImage(jibConfig, compiledJavaVersion), jibConfig, containerImageConfig, sourceJar, outputTarget, mainClass, containerImageLabels);
    } else if (packageConfig.isFastJar()) {
        jibContainerBuilder = createContainerBuilderFromFastJar(determineBaseJvmImage(jibConfig, compiledJavaVersion), jibConfig, containerImageConfig, sourceJar, curateOutcome, containerImageLabels, appCDSResult);
    } else {
        throw new IllegalArgumentException("Package type '" + packageType + "' is not supported by the container-image-jib extension");
    }
    setUser(jibConfig, jibContainerBuilder);
    setPlatforms(jibConfig, jibContainerBuilder);
    handleExtraFiles(outputTarget, jibContainerBuilder);
    log.info("Starting (local) container image build for jar using jib.");
    JibContainer container = containerize(containerImageConfig, jibConfig, containerImage, jibContainerBuilder, pushRequest.isPresent());
    writeOutputFiles(container, jibConfig, outputTarget);
    artifactResultProducer.produce(new ArtifactResultBuildItem(null, "jar-container", Map.of("container-image", container.getTargetImage().toString(), "pull-required", Boolean.toString(pushContainerImage))));
    containerImageBuilder.produce(new ContainerImageBuilderBuildItem(JIB));
}
Also used : ContainerImageBuilderBuildItem(io.quarkus.container.spi.ContainerImageBuilderBuildItem) JibContainer(com.google.cloud.tools.jib.api.JibContainer) ArtifactResultBuildItem(io.quarkus.deployment.pkg.builditem.ArtifactResultBuildItem) JibContainerBuilder(com.google.cloud.tools.jib.api.JibContainerBuilder) BuildStep(io.quarkus.deployment.annotations.BuildStep) JarResultBuildStep(io.quarkus.deployment.pkg.steps.JarResultBuildStep)

Example 4 with ContainerImageBuilderBuildItem

use of io.quarkus.container.spi.ContainerImageBuilderBuildItem in project quarkus by quarkusio.

the class BuildpackProcessor method buildFromNative.

@BuildStep(onlyIf = { IsNormalNotRemoteDev.class, BuildpackBuild.class, NativeBuild.class })
public void buildFromNative(ContainerImageConfig containerImageConfig, BuildpackConfig buildpackConfig, ContainerImageInfoBuildItem containerImage, NativeImageBuildItem nativeImage, OutputTargetBuildItem outputTarget, Optional<ContainerImageBuildRequestBuildItem> buildRequest, Optional<ContainerImagePushRequestBuildItem> pushRequest, List<ContainerImageLabelBuildItem> containerImageLabels, BuildProducer<ArtifactResultBuildItem> artifactResultProducer, BuildProducer<ContainerImageBuilderBuildItem> containerImageBuilder) {
    if (containerImageConfig.isBuildExplicitlyDisabled()) {
        return;
    }
    if (!containerImageConfig.isBuildExplicitlyEnabled() && !containerImageConfig.isPushExplicitlyEnabled() && !buildRequest.isPresent() && !pushRequest.isPresent()) {
        return;
    }
    if (!NativeBinaryUtil.nativeIsLinuxBinary(nativeImage)) {
        throw new RuntimeException("The native binary produced by the build is not a Linux binary and therefore cannot be used in a Linux container image. Consider adding \"quarkus.native.container-build=true\" to your configuration");
    }
    log.info("Starting (local) container image build for native binary using buildpack.");
    String targetImageName = runBuildpackBuild(buildpackConfig, containerImage, containerImageConfig, pushRequest, outputTarget, true);
    artifactResultProducer.produce(new ArtifactResultBuildItem(null, "native-container", Collections.singletonMap("container-image", targetImageName)));
    containerImageBuilder.produce(new ContainerImageBuilderBuildItem(BUILDPACK));
}
Also used : ContainerImageBuilderBuildItem(io.quarkus.container.spi.ContainerImageBuilderBuildItem) ArtifactResultBuildItem(io.quarkus.deployment.pkg.builditem.ArtifactResultBuildItem) BuildStep(io.quarkus.deployment.annotations.BuildStep)

Example 5 with ContainerImageBuilderBuildItem

use of io.quarkus.container.spi.ContainerImageBuilderBuildItem in project quarkus by quarkusio.

the class BuildpackProcessor method buildFromJar.

@BuildStep(onlyIf = { IsNormalNotRemoteDev.class, BuildpackBuild.class }, onlyIfNot = NativeBuild.class)
public void buildFromJar(ContainerImageConfig containerImageConfig, BuildpackConfig buildpackConfig, PackageConfig packageConfig, ContainerImageInfoBuildItem containerImage, JarBuildItem sourceJar, MainClassBuildItem mainClass, OutputTargetBuildItem outputTarget, CurateOutcomeBuildItem curateOutcome, Optional<ContainerImageBuildRequestBuildItem> buildRequest, Optional<ContainerImagePushRequestBuildItem> pushRequest, List<ContainerImageLabelBuildItem> containerImageLabels, Optional<AppCDSResultBuildItem> appCDSResult, BuildProducer<ArtifactResultBuildItem> artifactResultProducer, BuildProducer<ContainerImageBuilderBuildItem> containerImageBuilder) {
    if (containerImageConfig.isBuildExplicitlyDisabled()) {
        return;
    }
    if (!containerImageConfig.isBuildExplicitlyEnabled() && !containerImageConfig.isPushExplicitlyEnabled() && !buildRequest.isPresent() && !pushRequest.isPresent()) {
        return;
    }
    log.info("Starting (local) container image build for jar using builpack.");
    String targetImageName = runBuildpackBuild(buildpackConfig, containerImage, containerImageConfig, pushRequest, outputTarget, false);
    artifactResultProducer.produce(new ArtifactResultBuildItem(null, "jar-container", Collections.singletonMap("container-image", targetImageName)));
    containerImageBuilder.produce(new ContainerImageBuilderBuildItem(BUILDPACK));
}
Also used : ContainerImageBuilderBuildItem(io.quarkus.container.spi.ContainerImageBuilderBuildItem) ArtifactResultBuildItem(io.quarkus.deployment.pkg.builditem.ArtifactResultBuildItem) BuildStep(io.quarkus.deployment.annotations.BuildStep)

Aggregations

ContainerImageBuilderBuildItem (io.quarkus.container.spi.ContainerImageBuilderBuildItem)10 BuildStep (io.quarkus.deployment.annotations.BuildStep)10 ArtifactResultBuildItem (io.quarkus.deployment.pkg.builditem.ArtifactResultBuildItem)10 Clients (io.dekorate.utils.Clients)4 Serialization (io.dekorate.utils.Serialization)4 HasMetadata (io.fabric8.kubernetes.api.model.HasMetadata)4 KubernetesList (io.fabric8.kubernetes.api.model.KubernetesList)4 Secret (io.fabric8.kubernetes.api.model.Secret)4 Config (io.fabric8.kubernetes.client.Config)4 KubernetesClient (io.fabric8.kubernetes.client.KubernetesClient)4 KubernetesClientException (io.fabric8.kubernetes.client.KubernetesClientException)4 LogWatch (io.fabric8.kubernetes.client.dsl.LogWatch)4 Build (io.fabric8.openshift.api.model.Build)4 BuildConfig (io.fabric8.openshift.api.model.BuildConfig)4 ImageStream (io.fabric8.openshift.api.model.ImageStream)4 OpenShiftClient (io.fabric8.openshift.client.OpenShiftClient)4 ContainerImageConfig (io.quarkus.container.image.deployment.ContainerImageConfig)4 ImageUtil (io.quarkus.container.image.deployment.util.ImageUtil)4 AvailableContainerImageExtensionBuildItem (io.quarkus.container.spi.AvailableContainerImageExtensionBuildItem)4 BaseImageInfoBuildItem (io.quarkus.container.spi.BaseImageInfoBuildItem)4