This is an automated email from the ASF dual-hosted git repository.
dhanak pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools.git
The following commit(s) were added to refs/heads/main by this push:
new 59bce7097d0 kie-issues#1526: [kn-plugin-workflow] kn-workflow-plugin
should persist workflow in the docker image (#2725)
59bce7097d0 is described below
commit 59bce7097d0ac0e61f94b3697420bb3afa0e4b39
Author: Dmitrii Tikhomirov <[email protected]>
AuthorDate: Tue Feb 4 02:00:48 2025 -0800
kie-issues#1526: [kn-plugin-workflow] kn-workflow-plugin should persist
workflow in the docker image (#2725)
---
.rat-excludes | 10 +++
.../pkg/command/quarkus/quarkus_project.go | 86 ++++++++++++++++++++-
.../pkg/command/quarkus/quarkus_project_test.go | 87 ++++++++++++++++++++++
.../command/quarkus/testdata/docker/Dockerfile.jvm | 16 ++++
.../quarkus/testdata/docker/Dockerfile.legacy-jar | 14 ++++
.../quarkus/testdata/docker/Dockerfile.native | 11 +++
.../testdata/docker/Dockerfile.native-micro | 11 +++
.../pkg/command/quarkus/testdata/dockerignore | 5 ++
8 files changed, 238 insertions(+), 2 deletions(-)
diff --git a/.rat-excludes b/.rat-excludes
index 00dae3453a6..e11dd0d5600 100644
--- a/.rat-excludes
+++ b/.rat-excludes
@@ -676,6 +676,16 @@ workflow-subflow-custom.sw.yaml
workflow.sw.yaml
# packages/kn-plugin-workflow/pkg/specs/testdata/workflow2.sw.yaml
workflow2.sw.yaml
+#
packages/kn-plugin-workflow/pkg/command/quarkus/testdata/docker/Dockerfile.jvm
+Dockerfile.jvm
+#
packages/kn-plugin-workflow/pkg/command/quarkus/testdata/docker/Dockerfile.native
+Dockerfile.native
+#
packages/kn-plugin-workflow/pkg/command/quarkus/testdata/docker/Dockerfile.legacy-jar
+Dockerfile.legacy-jar
+#
packages/kn-plugin-workflow/pkg/command/quarkus/testdata/docker/Dockerfile.native-micro
+Dockerfile.native-micro
+packages/kn-plugin-workflow/pkg/command/quarkus/testdata/dockerignore
+dockerignore
# packages/maven-base/kie-tools-maven-base.iml
kie-tools-maven-base.iml
# packages/maven-base/settings.xml
diff --git a/packages/kn-plugin-workflow/pkg/command/quarkus/quarkus_project.go
b/packages/kn-plugin-workflow/pkg/command/quarkus/quarkus_project.go
index 6d3bf133e51..7440edfb962 100644
--- a/packages/kn-plugin-workflow/pkg/command/quarkus/quarkus_project.go
+++ b/packages/kn-plugin-workflow/pkg/command/quarkus/quarkus_project.go
@@ -20,8 +20,11 @@
package quarkus
import (
+ "bufio"
"fmt"
"os"
+ "path"
+ "strings"
"github.com/apache/incubator-kie-tools/packages/kn-plugin-workflow/pkg/common"
"github.com/apache/incubator-kie-tools/packages/kn-plugin-workflow/pkg/metadata"
@@ -69,16 +72,31 @@ func CreateQuarkusProject(cfg CreateQuarkusProjectConfig)
error {
}
//Until we are part of Quarkus 3.x bom we need to manipulate the
pom.xml to use the right kogito dependencies
- pomPath := cfg.ProjectName + "/pom.xml"
+ pomPath := path.Join(cfg.ProjectName, "pom.xml")
if err := manipulatePomToKogito(pomPath, cfg); err != nil {
return err
}
+
+ dockerIgnorePath := path.Join(cfg.ProjectName, ".dockerignore")
+ if err := manipulateDockerIgnore(dockerIgnorePath); err != nil {
+ return err
+ }
+
+ extensions := []string{"jvm", "legacy-jar", "native", "native-micro"}
+
+ for _, extension := range extensions {
+ dockerfilePath := path.Join(cfg.ProjectName, "src/main/docker",
"Dockerfile."+extension)
+ if err := manipulateDockerfile(dockerfilePath); err != nil {
+ return err
+ }
+ }
+
return nil
}
func PostMavenCleanup(cfg CreateQuarkusProjectConfig) error {
for _, file := range filesToRemove {
- var fqdn = cfg.ProjectName + "/" + file
+ var fqdn = path.Join(cfg.ProjectName, file)
if err := os.RemoveAll(fqdn); err != nil {
return fmt.Errorf("error removing %s: %w", fqdn, err)
}
@@ -180,3 +198,67 @@ func manipulatePomToKogito(filename string, cfg
CreateQuarkusProjectConfig) erro
return nil
}
+
+func manipulateDockerIgnore(filename string) error {
+ line := "\n!target/classes/workflow.sw.json"
+ f, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, 0644)
+ defer f.Close()
+
+ if _, err := f.WriteString(line); err != nil {
+ return fmt.Errorf("error writing to %s: %w", filename, err)
+ }
+
+ if err != nil {
+ return fmt.Errorf("error opening %s: %w", filename, err)
+ }
+ return nil
+}
+
+func manipulateDockerfile(filename string) error {
+ text := "COPY target/classes/workflow.sw.json
/deployments/app/workflow.sw.json"
+
+ file, err := os.Open(filename)
+ defer file.Close()
+ if err != nil {
+ return fmt.Errorf("error opening %s: %w", filename, err)
+ }
+
+ appended := false
+ scanner := bufio.NewScanner(file)
+
+ var lines []string
+
+ for scanner.Scan() {
+ line := scanner.Text()
+ if strings.HasPrefix(line, "COPY") && !appended {
+ lines = append(lines, text)
+ appended = true
+ }
+ lines = append(lines, line)
+ }
+
+ if err := scanner.Err(); err != nil {
+ return fmt.Errorf("error reading from %s: %w", filename, err)
+ }
+
+ file, err = os.OpenFile(filename, os.O_WRONLY|os.O_TRUNC, 0644)
+ if err != nil {
+ return fmt.Errorf("error opening %s for writing: %w", filename,
err)
+ }
+ defer file.Close()
+
+ writer := bufio.NewWriter(file)
+ for _, line := range lines {
+ _, err := writer.WriteString(line + "\n")
+ if err != nil {
+ return fmt.Errorf("error writing to %s: %w", filename,
err)
+ }
+ }
+
+ err = writer.Flush()
+ if err != nil {
+ return fmt.Errorf("error flushing to %s: %w", filename, err)
+ }
+
+ return nil
+}
diff --git
a/packages/kn-plugin-workflow/pkg/command/quarkus/quarkus_project_test.go
b/packages/kn-plugin-workflow/pkg/command/quarkus/quarkus_project_test.go
index 98ccab8c5e9..d753476e268 100644
--- a/packages/kn-plugin-workflow/pkg/command/quarkus/quarkus_project_test.go
+++ b/packages/kn-plugin-workflow/pkg/command/quarkus/quarkus_project_test.go
@@ -20,7 +20,9 @@
package quarkus
import (
+ "bufio"
"os"
+ "path"
"testing"
"github.com/apache/incubator-kie-tools/packages/kn-plugin-workflow/pkg/metadata"
@@ -71,3 +73,88 @@ func TestManipulatePom(t *testing.T) {
t.Errorf("Manipulated XML does not match expected XML")
}
}
+
+func TestManipulateDockerFiles(t *testing.T) {
+ text := "COPY target/classes/workflow.sw.json
/deployments/app/workflow.sw.json"
+ tempDir, err := os.MkdirTemp("", "project")
+ if err != nil {
+ t.Fatalf("❌ ERROR: failed to create temporary directory: %v",
err)
+ }
+ defer os.RemoveAll(tempDir)
+
+ dockerDir := path.Join(tempDir, "/src/main/docker")
+ err = os.MkdirAll(dockerDir, 0755)
+ if err != nil {
+ t.Fatalf("Error creating docker directory: %v", err)
+ }
+ err = copyDir("testdata/docker", dockerDir)
+ if err != nil {
+ t.Fatalf("Error copying Dockerfiles: %v", err)
+ }
+
+ extensions := []string{"jvm", "legacy-jar", "native", "native-micro"}
+
+ for _, extension := range extensions {
+ dockerFilePath := path.Join(dockerDir, "Dockerfile."+extension)
+ _, err := os.Stat(dockerFilePath)
+ if err != nil {
+ t.Fatalf("Error reading Dockerfile: %v", err)
+ }
+
+ if err := manipulateDockerfile(dockerFilePath); err != nil {
+ t.Fatalf("Error manipulating Dockerfile: %v", err)
+ }
+
+ contains, err := checkFileContainsText(dockerFilePath, text)
+ if err != nil {
+ t.Fatalf("Failed to stat Dockerfile for extension %s:
%v", extension, err)
+ }
+ if !contains {
+ t.Errorf("Dockerfile does not contain expected text")
+ }
+ }
+}
+func TestManipulateDockerIgnoreFile(t *testing.T) {
+ text := "!target/classes/workflow.sw.json"
+ tempDir, err := os.MkdirTemp("", "project")
+ if err != nil {
+ t.Fatalf("❌ ERROR: failed to create temporary directory: %v",
err)
+ }
+ defer os.RemoveAll(tempDir)
+
+ dockerIgnorePath := path.Join(tempDir, ".dockerignore")
+ err = copyFile("testdata/dockerignore", dockerIgnorePath)
+ if err != nil {
+ t.Fatalf("Error copying .dockerignore: %v", err)
+ }
+ if err := manipulateDockerIgnore(dockerIgnorePath); err != nil {
+ t.Fatalf("Error manipulating .dockerignore: %v", err)
+ }
+ contains, err := checkFileContainsText(dockerIgnorePath, text)
+ if err != nil {
+ t.Fatalf("Error reading .dockerignore: %v", err)
+ }
+ if !contains {
+ t.Errorf(".dockerignore does not contain expected text")
+ }
+
+}
+
+func checkFileContainsText(filePath, text string) (bool, error) {
+ file, err := os.Open(filePath)
+ if err != nil {
+ return false, err
+ }
+ defer file.Close()
+
+ var contains = false
+ scanner := bufio.NewScanner(file)
+ for scanner.Scan() {
+ line := scanner.Text()
+ if line == text {
+ contains = true
+ break
+ }
+ }
+ return contains, nil
+}
diff --git
a/packages/kn-plugin-workflow/pkg/command/quarkus/testdata/docker/Dockerfile.jvm
b/packages/kn-plugin-workflow/pkg/command/quarkus/testdata/docker/Dockerfile.jvm
new file mode 100644
index 00000000000..0d0f446b4b9
--- /dev/null
+++
b/packages/kn-plugin-workflow/pkg/command/quarkus/testdata/docker/Dockerfile.jvm
@@ -0,0 +1,16 @@
+FROM registry.access.redhat.com/ubi8/openjdk-17:1.18
+
+ENV LANGUAGE='en_US:en'
+
+
+COPY --chown=185 target/quarkus-app/lib/ /deployments/lib/
+COPY --chown=185 target/quarkus-app/*.jar /deployments/
+COPY --chown=185 target/quarkus-app/app/ /deployments/app/
+COPY --chown=185 target/quarkus-app/quarkus/ /deployments/quarkus/
+
+EXPOSE 8080
+USER 185
+ENV JAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0
-Djava.util.logging.manager=org.jboss.logmanager.LogManager"
+ENV JAVA_APP_JAR="/deployments/quarkus-run.jar"
+
+ENTRYPOINT [ "/opt/jboss/container/java/run/run-java.sh" ]
diff --git
a/packages/kn-plugin-workflow/pkg/command/quarkus/testdata/docker/Dockerfile.legacy-jar
b/packages/kn-plugin-workflow/pkg/command/quarkus/testdata/docker/Dockerfile.legacy-jar
new file mode 100644
index 00000000000..9797ef13588
--- /dev/null
+++
b/packages/kn-plugin-workflow/pkg/command/quarkus/testdata/docker/Dockerfile.legacy-jar
@@ -0,0 +1,14 @@
+FROM registry.access.redhat.com/ubi8/openjdk-17:1.18
+
+ENV LANGUAGE='en_US:en'
+
+
+COPY target/lib/* /deployments/lib/
+COPY target/*-runner.jar /deployments/quarkus-run.jar
+
+EXPOSE 8080
+USER 185
+ENV JAVA_OPTS_APPEND="-Dquarkus.http.host=0.0.0.0
-Djava.util.logging.manager=org.jboss.logmanager.LogManager"
+ENV JAVA_APP_JAR="/deployments/quarkus-run.jar"
+
+ENTRYPOINT [ "/opt/jboss/container/java/run/run-java.sh" ]
diff --git
a/packages/kn-plugin-workflow/pkg/command/quarkus/testdata/docker/Dockerfile.native
b/packages/kn-plugin-workflow/pkg/command/quarkus/testdata/docker/Dockerfile.native
new file mode 100644
index 00000000000..b640808e62c
--- /dev/null
+++
b/packages/kn-plugin-workflow/pkg/command/quarkus/testdata/docker/Dockerfile.native
@@ -0,0 +1,11 @@
+FROM registry.access.redhat.com/ubi8/ubi-minimal:8.9
+WORKDIR /work/
+RUN chown 1001 /work \
+ && chmod "g+rwX" /work \
+ && chown 1001:root /work
+COPY --chown=1001:root target/*-runner /work/application
+
+EXPOSE 8080
+USER 1001
+
+ENTRYPOINT ["./application", "-Dquarkus.http.host=0.0.0.0"]
diff --git
a/packages/kn-plugin-workflow/pkg/command/quarkus/testdata/docker/Dockerfile.native-micro
b/packages/kn-plugin-workflow/pkg/command/quarkus/testdata/docker/Dockerfile.native-micro
new file mode 100644
index 00000000000..fb244ab56f9
--- /dev/null
+++
b/packages/kn-plugin-workflow/pkg/command/quarkus/testdata/docker/Dockerfile.native-micro
@@ -0,0 +1,11 @@
+FROM quay.io/quarkus/quarkus-micro-image:2.0
+WORKDIR /work/
+RUN chown 1001 /work \
+ && chmod "g+rwX" /work \
+ && chown 1001:root /work
+COPY --chown=1001:root target/*-runner /work/application
+
+EXPOSE 8080
+USER 1001
+
+ENTRYPOINT ["./application", "-Dquarkus.http.host=0.0.0.0"]
diff --git
a/packages/kn-plugin-workflow/pkg/command/quarkus/testdata/dockerignore
b/packages/kn-plugin-workflow/pkg/command/quarkus/testdata/dockerignore
new file mode 100644
index 00000000000..94810d006e7
--- /dev/null
+++ b/packages/kn-plugin-workflow/pkg/command/quarkus/testdata/dockerignore
@@ -0,0 +1,5 @@
+*
+!target/*-runner
+!target/*-runner.jar
+!target/lib/*
+!target/quarkus-app/*
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]