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
26 changes: 26 additions & 0 deletions examples/simple-app-build-local-mvn/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: kbld-simple-app-build-local-bazel
spec:
selector:
matchLabels:
app: kbld-simple-app-build-local-bazel
template:
metadata:
labels:
app: kbld-simple-app-build-local-bazel
spec:
containers:
- name: my-app
image: simple-app
---
apiVersion: kbld.k14s.io/v1alpha1
kind: Config
sources:
- image: simple-app
path: test/e2e/assets/simple-app
maven:
run:
target: helloworld
name: simple-app
2 changes: 2 additions & 0 deletions pkg/kbld/builder/docker/docker.go
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,8 @@ func (d Docker) Inspect(ref string) (InspectData, error) {
cmd.Stdout = &stdoutBuf
cmd.Stderr = &stderrBuf

d.logger.NewPrefixedWriter(ref + " | ").Write([]byte(fmt.Sprintf("running command: %s\n", cmd)))

err := cmd.Run()
if err != nil {
return InspectData{}, err
Expand Down
80 changes: 80 additions & 0 deletions pkg/kbld/builder/maven/jib.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package maven

import (
"bytes"
ctlbdk "carvel.dev/kbld/pkg/kbld/builder/docker"
"carvel.dev/kbld/pkg/kbld/config"
ctllog "carvel.dev/kbld/pkg/kbld/logger"
"fmt"
"io"
"os/exec"
"path/filepath"
"regexp"
)

var defaultImageTag = "latest"
var ImageID = regexp.MustCompile("(sha256:)([0-9a-z]+)")

type Jib struct {
docker ctlbdk.Docker
logger ctllog.Logger
}

func NewMavenJib(docker ctlbdk.Docker, logger ctllog.Logger) Jib {
return Jib{docker: docker, logger: logger}
}

func (b *Jib) Run(image, directory string, opts config.SourceJibRunOpts) (ctlbdk.TmpRef, error) {

prefixedLogger := b.logger.NewPrefixedWriter(image + " | ")

prefixedLogger.Write([]byte(fmt.Sprintf("starting build (using kbld jib build): %s\n", directory)))
defer prefixedLogger.Write([]byte("finished build (using kbld jib build)\n"))

tag := opts.Tag
if tag == nil {
tag = &defaultImageTag
}
targetImage := fmt.Sprintf("%s:%s", image, *tag)

var stdoutBuf, stderrBuf bytes.Buffer

if opts.Target == nil {
return ctlbdk.TmpRef{}, fmt.Errorf("Expected target to be specified, but was not")
}

// Base arguments for the Maven Jib command.
cmdArgs := []string{
"compile",
"jib:dockerBuild",
"-Dimage=" + targetImage,
"-Djib.allowInsecureRegistries=true",
}

if opts.RawOptions != nil {
cmdArgs = append(cmdArgs, *opts.RawOptions...)
}

cmd := exec.Command("mvn", cmdArgs...)

cmd.Dir = filepath.Join(directory, *opts.Target)
cmd.Stdout = io.MultiWriter(&stdoutBuf, prefixedLogger)
cmd.Stderr = io.MultiWriter(&stderrBuf, prefixedLogger)

prefixedLogger.Write([]byte(fmt.Sprintf("running command: %s\n", cmd)))

if err := cmd.Run(); err != nil {
prefixedLogger.Write([]byte(fmt.Sprintf("error: %s\n", err)))
return ctlbdk.TmpRef{}, err
}

inspectData, err := b.docker.Inspect(targetImage)
if err != nil {
prefixedLogger.Write([]byte(fmt.Sprintf("inspect error: %s\n", err)))
return ctlbdk.TmpRef{}, err
}

prefixedLogger.Write([]byte(fmt.Sprintf("digest: %s, id: %s\n", inspectData.RepoDigests, inspectData.ID)))

return b.docker.RetagStable(ctlbdk.NewTmpRef(inspectData.ID), image, inspectData.ID, prefixedLogger)
}
1 change: 1 addition & 0 deletions pkg/kbld/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ type Source struct {
KubectlBuildkit *SourceKubectlBuildkitOpts
Ko *SourceKoOpts
Bazel *SourceBazelOpts
Maven *SourceJibOpts
}

type ImageOverride struct {
Expand Down
14 changes: 14 additions & 0 deletions pkg/kbld/config/config_jib.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// Copyright 2024 The Carvel Authors.
// SPDX-License-Identifier: Apache-2.0

package config

type SourceJibOpts struct {
Run SourceJibRunOpts
}

type SourceJibRunOpts struct {
Target *string `json:"target"`
RawOptions *[]string `json:"rawOptions"`
Tag *string `json:"tag,omitempty"`
}
14 changes: 12 additions & 2 deletions pkg/kbld/image/built.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
package image

import (
maven "carvel.dev/kbld/pkg/kbld/builder/maven"
"path/filepath"

ctlbbz "carvel.dev/kbld/pkg/kbld/builder/bazel"
Expand All @@ -25,13 +26,14 @@ type BuiltImage struct {
kubectlBuildkit ctlbkb.KubectlBuildkit
ko ctlbko.Ko
bazel ctlbbz.Bazel
maven maven.Jib
}

func NewBuiltImage(url string, buildSource ctlconf.Source, imgDst *ctlconf.ImageDestination,
docker ctlbdk.Docker, dockerBuildx ctlbdk.Buildx, pack ctlbpk.Pack,
kubectlBuildkit ctlbkb.KubectlBuildkit, ko ctlbko.Ko, bazel ctlbbz.Bazel) BuiltImage {
kubectlBuildkit ctlbkb.KubectlBuildkit, ko ctlbko.Ko, bazel ctlbbz.Bazel, maven maven.Jib) BuiltImage {

return BuiltImage{url, buildSource, imgDst, docker, dockerBuildx, pack, kubectlBuildkit, ko, bazel}
return BuiltImage{url, buildSource, imgDst, docker, dockerBuildx, pack, kubectlBuildkit, ko, bazel, maven}
}

func (i BuiltImage) URL() (string, []ctlconf.Origin, error) {
Expand Down Expand Up @@ -84,6 +86,14 @@ func (i BuiltImage) URL() (string, []ctlconf.Origin, error) {
urlRepo, i.buildSource.Path, i.imgDst, *i.buildSource.Docker.Buildx)
return url, origins, err

case i.buildSource.Maven != nil:
dockerTmpRef, err := i.maven.Run(urlRepo, i.buildSource.Path, i.buildSource.Maven.Run)
if err != nil {
return "", nil, err
}

return i.optionalPushWithDocker(dockerTmpRef, origins)

// Fall back on Docker by default
default:
if i.buildSource.Docker == nil {
Expand Down
4 changes: 3 additions & 1 deletion pkg/kbld/image/factory.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
package image

import (
maven2 "carvel.dev/kbld/pkg/kbld/builder/maven"
"fmt"

ctlbbz "carvel.dev/kbld/pkg/kbld/builder/bazel"
Expand Down Expand Up @@ -72,9 +73,10 @@ func (f Factory) New(url string) Image {
kubectlBuildkit := ctlbkb.NewKubectlBuildkit(f.logger)
ko := ctlbko.NewKo(f.logger)
bazel := ctlbbz.NewBazel(docker, f.logger)
maven := maven2.NewMavenJib(docker, f.logger)

var builtImg Image = NewBuiltImage(url, srcConf, imgDstConf,
docker, dockerBuildx, pack, kubectlBuildkit, ko, bazel)
docker, dockerBuildx, pack, kubectlBuildkit, ko, bazel, maven)

if imgDstConf != nil {
builtImg = NewTaggedImage(builtImg, *imgDstConf, f.registry)
Expand Down
52 changes: 52 additions & 0 deletions test/e2e/assets/simple-app/helloworld/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>example</groupId>
<artifactId>helloworld</artifactId>
<version>1</version>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jib-maven-plugin.version>3.4.6</jib-maven-plugin.version>
<maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version>
</properties>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>

<!-- Jib -->
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>${jib-maven-plugin.version}</version>
<configuration>
<from>
<image>gcr.io/distroless/java</image>
</from>
<to>
<image>image-built-with-jib</image>
</to>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package example;

public class HelloWorld {

public static void main(String[] args) throws Exception {
System.out.println("Hello world");

}
}