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
6 changes: 5 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ module github.com/containifyci/java
go 1.22.5

require (
github.com/containifyci/engine-ci v0.3.1
github.com/containifyci/engine-ci v0.3.3
github.com/containifyci/engine-ci/protos2 v0.2.4 // indirect
)

Expand All @@ -23,6 +23,8 @@ require (
gopkg.in/yaml.v3 v3.0.1 // indirect
)

require github.com/stretchr/testify v1.9.0

require (
dario.cat/mergo v1.0.0 // indirect
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
Expand All @@ -49,6 +51,7 @@ require (
github.com/coreos/go-systemd/v22 v22.5.1-0.20231103132048-7d375ecc2b09 // indirect
github.com/cyberphone/json-canonicalization v0.0.0-20231217050601-ba74d44ecf5f // indirect
github.com/cyphar/filepath-securejoin v0.3.1 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/disiqueira/gotree/v3 v3.0.2 // indirect
github.com/distribution/reference v0.6.0 // indirect
github.com/docker/distribution v2.8.3+incompatible // indirect
Expand Down Expand Up @@ -118,6 +121,7 @@ require (
github.com/ostreedev/ostree-go v0.0.0-20210805093236-719684c64e4f // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pkg/sftp v1.13.6 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/proglottis/gpgme v0.1.3 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/rogpeppe/go-internal v1.12.0 // indirect
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,8 @@ github.com/containers/psgo v1.9.0 h1:eJ74jzSaCHnWt26OlKZROSyUyRcGDf+gYBdXnxrMW4g
github.com/containers/psgo v1.9.0/go.mod h1:0YoluUm43Mz2UnBIh1P+6V6NWcbpTL5uRtXyOcH0B5A=
github.com/containers/storage v1.55.0 h1:wTWZ3YpcQf1F+dSP4KxG9iqDfpQY1otaUXjPpffuhgg=
github.com/containers/storage v1.55.0/go.mod h1:28cB81IDk+y7ok60Of6u52RbCeBRucbFOeLunhER1RQ=
github.com/containifyci/engine-ci v0.3.1 h1:bQHGOw71ZSyNMrq7R9zs0WlpU9zVTRUH81ZkH83GtAQ=
github.com/containifyci/engine-ci v0.3.1/go.mod h1:HP5jAKiJ85BfyfpsYzwgYnlyPT/9S1MWBzbK7PmpX1M=
github.com/containifyci/engine-ci v0.3.3 h1:p6mt2fFLXJ5ZlCtEQdGam2b2aYn5p/hwhEBqvsCqgq4=
github.com/containifyci/engine-ci v0.3.3/go.mod h1:HP5jAKiJ85BfyfpsYzwgYnlyPT/9S1MWBzbK7PmpX1M=
github.com/containifyci/engine-ci/protos2 v0.2.4 h1:LV51janVvdk+plZ9bC/sX4luNjAegyP0xGgJhkdw3E0=
github.com/containifyci/engine-ci/protos2 v0.2.4/go.mod h1:gGQmVinm/RgjrcjiffTcdkbrgUEudwzk3GQp+wKD700=
github.com/coreos/go-systemd/v22 v22.5.1-0.20231103132048-7d375ecc2b09 h1:OoRAFlvDGCUqDLampLQjk0yeeSGdF9zzst/3G9IkBbc=
Expand Down
4 changes: 4 additions & 0 deletions main_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package main

import (
)
21 changes: 21 additions & 0 deletions pkg/maven/buildscript_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package maven

import (
"testing"

"github.com/stretchr/testify/assert"
)

func TestSimpleScript(t *testing.T) {
bs := NewBuildScript(false, "localhost")
script := Script(bs)

assert.Equal(t, "#!/bin/sh\nset -xe\n./mvnw --batch-mode package\n", script)
}

func TestVerboseScript(t *testing.T) {
bs := NewBuildScript(true, "localhost")
script := Script(bs)

assert.Equal(t, "#!/bin/sh\nset -xe\n./mvnw --batch-mode package -X\n", script)
}
4 changes: 2 additions & 2 deletions pkg/maven/maven.go
Original file line number Diff line number Diff line change
Expand Up @@ -144,14 +144,14 @@ func (c *MavenContainer) Build() error {
opts.Image = imageTag
opts.Env = append(opts.Env, []string{
"MAVEN_OPTS=-Xms512m -Xmx512m -XX:MaxDirectMemorySize=512m",
fmt.Sprintf("CONTAINIFYCI_HOST=%s", getContainifyHost()),
}...)

// On MacOS, we need to set a special docker host so that the testcontainers can access the host
if c.Platform.Host.OS == "darwin" {
opts.Env = append(opts.Env, []string{
fmt.Sprintf("TC_HOST=%s", c.Address().ForContainerDefault()),
fmt.Sprintf("TESTCONTAINERS_HOST_OVERRIDE=%s", c.Address().ForContainerDefault()),
fmt.Sprintf("CONTAINIFYCI_HOST=%s", getContainifyHost()),
}...)
}

Expand Down Expand Up @@ -247,7 +247,7 @@ func NewProd(version string) build.Build {
return container.Prod()
},
name: "maven-prod",
images: []string{ProdImage},
images: []string{fmt.Sprintf(ProdImage, version)},
async: false,
}
}
Expand Down
185 changes: 185 additions & 0 deletions pkg/maven/maven_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
package maven

import (
"errors"
"fmt"
"testing"

"github.com/containifyci/engine-ci/pkg/container"
"github.com/containifyci/engine-ci/pkg/cri"
"github.com/containifyci/engine-ci/pkg/cri/critest"
"github.com/containifyci/engine-ci/pkg/network"
"github.com/stretchr/testify/assert"
)

func InitTest(t *testing.T) *container.Build {
network.RuntimeOS = "darwin"
t.Setenv("SSH_AUTH_SOCK", "/tmp/ssh-auth.sock")
t.Setenv("CONTAINER_RUNTIME", "test")
arg := &container.Build{
App: "test",
Custom: map[string][]string{"CONTAINIFYCI_HOST": {"localhost"}},
Image: "test-image",
}
arg.Defaults()
container.NewBuild(arg)

cRuntime, err := cri.InitContainerRuntime()
assert.NoError(t, err)
if v, ok := cRuntime.(*critest.MockContainerManager); ok {
v.Reset()
}
return arg
}

func TestNew(t *testing.T) {
InitTest(t)

mc := New("17")
assert.Equal(t, "maven", mc.Name())
assert.False(t, mc.IsAsync())
assert.Equal(t, "test-image", mc.Image)
assert.Equal(t, "17", mc.Version)
assert.Equal(t, []string{"containifyci/maven-3-eclipse-temurin-17-alpine:214f702cd3dee211717ca17936aca88df6913e1db40f822ef9918e4369ea927d", "registry.access.redhat.com/ubi8/openjdk-17:latest"}, mc.Images())
}

func TestNewProd(t *testing.T) {
InitTest(t)

mc := NewProd("17")
assert.Equal(t, "maven-prod", mc.Name())
assert.False(t, mc.IsAsync())
assert.Equal(t, []string{"registry.access.redhat.com/ubi8/openjdk-17:latest"}, mc.Images())
}

func TestPull(t *testing.T) {
InitTest(t)

mc := New("17")
mc.Pull()

cRuntime, err := cri.InitContainerRuntime()
assert.NoError(t, err)

if v, ok := cRuntime.(*critest.MockContainerManager); ok {
assert.Equal(t, "registry.access.redhat.com/ubi8/openjdk-17:latest pulled", v.ImagesLogEntries[0])
}
}

func TestBuildLinuxPodman(t *testing.T) {
expectedEnvs := []string{
"MAVEN_OPTS=-Xms512m -Xmx512m -XX:MaxDirectMemorySize=512m",
"SSH_AUTH_SOCK=/tmp/ssh-auth.sock",
"CONTAINIFYCI_HOST=localhost",
"DOCKER_HOST=unix://var/run/podman.sock",
"TESTCONTAINERS_RYUK_DISABLED=true",
}

arg := InitTest(t)
arg.Platform.Host.OS = "linux"
arg.Runtime = "podman"

mc := New("17")
mc.Build()

cRuntime, err := cri.InitContainerRuntime()
assert.NoError(t, err)

if v, ok := cRuntime.(*critest.MockContainerManager); ok {
img := "containifyci/maven-3-eclipse-temurin-17-alpine:214f702cd3dee211717ca17936aca88df6913e1db40f822ef9918e4369ea927d"
assert.Len(t, v.ContainerLogsEntries[img], 2)
assert.Equal(t, []string{"container starting", "container running"}, v.ContainerLogsEntries[img])

assert.Equal(t, "started", v.GetContainerByImage(img).State)
assert.Equal(t, []string{"sh", "/tmp/script.sh"}, v.GetContainerByImage(img).Opts.Cmd)

fmt.Printf("Envs %+v\n", v.GetContainerByImage(img).Opts.Env)
for _, env := range expectedEnvs {
assert.Contains(t, v.GetContainerByImage(img).Opts.Env, env)
}
}
}

func TestBuildDarwinPodman(t *testing.T) {
expectedEnvs := []string{
"MAVEN_OPTS=-Xms512m -Xmx512m -XX:MaxDirectMemorySize=512m",
"TC_HOST=host.containers.internal",
"TESTCONTAINERS_HOST_OVERRIDE=host.containers.internal",
"CONTAINIFYCI_HOST=localhost",
"DOCKER_HOST=unix://var/run/podman.sock",
"TESTCONTAINERS_RYUK_DISABLED=true",
}

arg := InitTest(t)
arg.Platform.Host.OS = "darwin"
arg.Runtime = "podman"

mc := New("17")

cRuntime, err := cri.InitContainerRuntime()
assert.NoError(t, err)

if v, ok := cRuntime.(*critest.MockContainerManager); ok {
v.Errors["containifyci/maven-3-eclipse-temurin-17-alpine:214f702cd3dee211717ca17936aca88df6913e1db40f822ef9918e4369ea927d"] = errors.New("image not found")

mc.Run()

img := "containifyci/maven-3-eclipse-temurin-17-alpine:214f702cd3dee211717ca17936aca88df6913e1db40f822ef9918e4369ea927d"
assert.Len(t, v.ContainerLogsEntries[img], 2)
assert.Equal(t, []string{"container starting", "container running"}, v.ContainerLogsEntries[img])

assert.Equal(t, "started", v.GetContainerByImage(img).State)
assert.Equal(t, []string{"sh", "/tmp/script.sh"}, v.GetContainerByImage(img).Opts.Cmd)
assert.Equal(t, "#!/bin/sh\nset -xe\n./mvnw --batch-mode package\n", v.GetContainerByImage(img).Opts.Script)
assert.Equal(t, "/src", v.GetContainerByImage(img).Opts.WorkingDir)
assert.Equal(t, "containifyci/maven-3-eclipse-temurin-17-alpine:214f702cd3dee211717ca17936aca88df6913e1db40f822ef9918e4369ea927d", v.GetContainerByImage(img).Opts.Image)
assert.Equal(t, int64(4073741824), v.GetContainerByImage(img).Opts.Memory)
assert.Equal(t, uint64(2048), v.GetContainerByImage(img).Opts.CPU)

fmt.Printf("Envs %+v\n", v.GetContainerByImage(img).Opts.Env)
for _, env := range expectedEnvs {
assert.Contains(t, v.GetContainerByImage(img).Opts.Env, env)
}

//expect 3 images opnejdk image and maven-3-eclipse-temurin-17-alpine twice for both platforms amd64 and arm64
assert.Len(t, v.Images, 3)
assert.NotNil(t, v.Images["registry.access.redhat.com/ubi8/openjdk-17:latest"])
assert.Equal(t, "linux/amd64", v.Images["containifyci/maven-3-eclipse-temurin-17-alpine:214f702cd3dee211717ca17936aca88df6913e1db40f822ef9918e4369ea927d-linux/amd64"].Opts.Platform.String())
assert.Equal(t, "linux/arm64", v.Images["containifyci/maven-3-eclipse-temurin-17-alpine:214f702cd3dee211717ca17936aca88df6913e1db40f822ef9918e4369ea927d-linux/arm64"].Opts.Platform.String())
}
}

func TestProd(t *testing.T) {
expectedEnvs := []string{
"JAVA_OPTS=-javaagent:/deployments/dd-java-agent.jar -Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager",
"JAVA_APP_JAR=/deployments/quarkus-run.jar",
}

arg := InitTest(t)
arg.Platform.Host.OS = "darwin"
arg.Runtime = "podman"

mc := NewProd("17")

cRuntime, err := cri.InitContainerRuntime()
assert.NoError(t, err)

if v, ok := cRuntime.(*critest.MockContainerManager); ok {
mc.Run()

img := "registry.access.redhat.com/ubi8/openjdk-17:latest"
assert.Len(t, v.ContainerLogsEntries[img], 3)
assert.Equal(t, []string{"container starting", "container running", "container stopped"}, v.ContainerLogsEntries[img])

assert.Equal(t, "stopped", v.GetContainerByImage(img).State)
assert.Equal(t, []string{"sleep", "300"}, v.GetContainerByImage(img).Opts.Cmd)
assert.Equal(t, "185", v.GetContainerByImage(img).Opts.User)
assert.Equal(t, "/src", v.GetContainerByImage(img).Opts.WorkingDir)
assert.Equal(t, "registry.access.redhat.com/ubi8/openjdk-17:latest", v.GetContainerByImage(img).Opts.Image)

fmt.Printf("Envs %+v\n", v.GetContainerByImage(img).Opts.Env)
for _, env := range expectedEnvs {
assert.Contains(t, v.GetContainerByImage(img).Opts.Env, env)
}
}
}
53 changes: 53 additions & 0 deletions pkg/maven/steps_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package maven

import (
"testing"

"github.com/stretchr/testify/assert"
)

func TestStepsv17(t *testing.T) {
arg := InitTest(t)
arg.Custom = map[string][]string{"from": {"v17"}}

steps := Steps(arg)
assert.Len(t, steps, 2)
names := []string{steps[0].Name(), steps[1].Name()}
images := append(steps[0].Images(), steps[1].Images()...)

assert.Equal(t, []string{"maven", "maven-prod"}, names)
assert.Equal(t, []string{"containifyci/maven-3-eclipse-temurin-17-alpine:214f702cd3dee211717ca17936aca88df6913e1db40f822ef9918e4369ea927d", "registry.access.redhat.com/ubi8/openjdk-17:latest", "registry.access.redhat.com/ubi8/openjdk-17:latest"}, images)
}

func TestStepsv21(t *testing.T) {
arg := InitTest(t)
arg.Custom = map[string][]string{"from": {"v21"}}

steps := Steps(arg)
assert.Len(t, steps, 2)
names := []string{steps[0].Name(), steps[1].Name()}
images := append(steps[0].Images(), steps[1].Images()...)

assert.Equal(t, []string{"maven", "maven-prod"}, names)
assert.Equal(t, []string{"containifyci/maven-3-eclipse-temurin-21-alpine:98108b284d14233f76bb9ce91e7932734b135f899654e48306ab07e4ca3e35d8", "registry.access.redhat.com/ubi8/openjdk-21:latest", "registry.access.redhat.com/ubi8/openjdk-21:latest"}, images)
}

func TestStepsDefault(t *testing.T) {
arg := InitTest(t)

steps := Steps(arg)
assert.Len(t, steps, 2)
names := []string{steps[0].Name(), steps[1].Name()}
images := append(steps[0].Images(), steps[1].Images()...)

assert.Equal(t, []string{"maven", "maven-prod"}, names)
assert.Equal(t, []string{"containifyci/maven-3-eclipse-temurin-17-alpine:214f702cd3dee211717ca17936aca88df6913e1db40f822ef9918e4369ea927d", "registry.access.redhat.com/ubi8/openjdk-17:latest", "registry.access.redhat.com/ubi8/openjdk-17:latest"}, images)
}

func TestStepsUnknown(t *testing.T) {
t.SkipNow()
arg := InitTest(t)
arg.Custom = map[string][]string{"from": {"v24"}}

Steps(arg)
}