From bb3d7c3ee2d0a11a3837d223e6a8fa57811fb35d Mon Sep 17 00:00:00 2001 From: coding-convention Date: Sun, 30 Jul 2023 14:01:10 +0000 Subject: [PATCH] feat: injection variables #1 --- api/v1.0/deploy/deploy.go | 32 +++++++++++++++++-- .../dockerfilegenerator.go | 16 ++++++++-- .../java-application-builder.go} | 18 ++++++++++- .../node-application-builder.go} | 17 +++++++++- 4 files changed, 76 insertions(+), 7 deletions(-) rename utils/dockerfilegenerator/{dockerfile-samples/java-application.go => sample-builder/java-application-builder.go} (57%) rename utils/dockerfilegenerator/{dockerfile-samples/node-application.go => sample-builder/node-application-builder.go} (58%) diff --git a/api/v1.0/deploy/deploy.go b/api/v1.0/deploy/deploy.go index 6759a07..e043a3f 100644 --- a/api/v1.0/deploy/deploy.go +++ b/api/v1.0/deploy/deploy.go @@ -13,10 +13,11 @@ import ( conf "github.com/sw-maestro-kumofactory/miz-ball/config" "github.com/sw-maestro-kumofactory/miz-ball/utils/dockerclient" + "github.com/sw-maestro-kumofactory/miz-ball/utils/dockerfilegenerator" "github.com/sw-maestro-kumofactory/miz-ball/utils/ecr" rep "github.com/sw-maestro-kumofactory/miz-ball/utils/repomanagement" - dockerfilesamples "github.com/sw-maestro-kumofactory/miz-ball/utils/dockerfilegenerator/dockerfile-samples" + samplebuilder "github.com/sw-maestro-kumofactory/miz-ball/utils/dockerfilegenerator/sample-builder" ) // TODO: add validation @@ -48,6 +49,7 @@ type DeployInfo struct { Language string `json:"Language"` Runtime string `json:"Runtime"` Compiler string `json:"Compiler"` + Env []EnvInfo `json:"env"` } type PortBindInfo struct { @@ -56,6 +58,11 @@ type PortBindInfo struct { Bind []string `json:"bind"` } +type EnvInfo struct { + Key string `json:"key"` + Value string `json:"value"` +} + var rootDir = "/app/repository/" func ApplicationDeploy2(c *gin.Context) { @@ -100,14 +107,33 @@ func ApplicationDeploy2(c *gin.Context) { srcDir := filepath.Join(repoDir, folderName) dstDir := repoDir + // TODO: wrap this code + builder := dockerfilegenerator.NewBuilder() + if info.Env != nil { + for _, env := range info.Env { + builder.AddEnv(env.Key, env.Value) + } + } if !info.Dockerfile { if info.Language == "node" { - dockerfilesamples.NodeApplication(srcDir) + samplebuilder.AddNodeBuilder(builder) + // samplebuilder.NodeApplication(srcDir) } else if info.Language == "java" { - dockerfilesamples.JavaApplication(srcDir) + samplebuilder.AddJavaBuilder(builder) + // samplebuilder.JavaApplication(srcDir) + } + } else if info.Dockerfile { + dockerfilePath := filepath.Join(srcDir, "Dockerfile") + dockerfileStream, err := os.ReadFile(dockerfilePath) + if err != nil { + fmt.Println("error") } + builder.AddDockerfile(dockerfileStream) + os.Remove(dockerfilePath) } + builder.CreateDockerfile(srcDir, "Dockerfile") + // until here err = rep.CompressToTarGz(srcDir, dstDir) if handleError(c, err, http.StatusBadRequest) { diff --git a/utils/dockerfilegenerator/dockerfilegenerator.go b/utils/dockerfilegenerator/dockerfilegenerator.go index 4d3b3b8..0466018 100644 --- a/utils/dockerfilegenerator/dockerfilegenerator.go +++ b/utils/dockerfilegenerator/dockerfilegenerator.go @@ -3,7 +3,7 @@ package dockerfilegenerator import ( "bytes" "fmt" - "io/ioutil" + "os" ) type Builder struct { @@ -18,10 +18,22 @@ func (b *Builder) AddDirective(instruction, arguments string) { b.buffer.WriteString(fmt.Sprintf("%s %s\n", instruction, arguments)) } +func (b *Builder) AddCommand(command string) { + b.buffer.WriteString(fmt.Sprintf("%s\n", command)) +} + +func (b *Builder) AddEnv(key, value string) { + b.buffer.WriteString(fmt.Sprintf("ENV %s=%s\n", key, value)) +} + func (b *Builder) Bytes() ([]byte, error) { return b.buffer.Bytes(), nil } +func (b *Builder) AddDockerfile(dockerfile []byte) { + b.buffer.Write(dockerfile) +} + func (b *Builder) CreateDockerfile(directory, filename string) error { content, err := b.Bytes() if err != nil { @@ -29,7 +41,7 @@ func (b *Builder) CreateDockerfile(directory, filename string) error { } path := fmt.Sprintf("%s/%s", directory, filename) - err = ioutil.WriteFile(path, content, 0644) + err = os.WriteFile(path, content, 0644) if err != nil { return err } diff --git a/utils/dockerfilegenerator/dockerfile-samples/java-application.go b/utils/dockerfilegenerator/sample-builder/java-application-builder.go similarity index 57% rename from utils/dockerfilegenerator/dockerfile-samples/java-application.go rename to utils/dockerfilegenerator/sample-builder/java-application-builder.go index 255cebf..40e5d1c 100644 --- a/utils/dockerfilegenerator/dockerfile-samples/java-application.go +++ b/utils/dockerfilegenerator/sample-builder/java-application-builder.go @@ -1,4 +1,4 @@ -package dockerfilesamples +package samplebuilder import ( "github.com/sw-maestro-kumofactory/miz-ball/utils/dockerfilegenerator" @@ -27,3 +27,19 @@ func JavaApplication(targetDir string) { panic(err) } } + +func AddJavaBuilder(builder *dockerfilegenerator.Builder) { + // Build the first stage + builder.AddDirective(dfenum.FROM, "gradle:jdk17-alpine AS builder") + builder.AddDirective(dfenum.WORKDIR, "/src") + builder.AddDirective(dfenum.COPY, ". .") + builder.AddDirective(dfenum.RUN, "ls") + builder.AddDirective(dfenum.RUN, "gradle build && cd build/libs && ls && rm $(ls *plain.jar) && mv $(ls *.jar) app.jar") + + // Build the second stage + builder.AddDirective(dfenum.FROM, "openjdk:17-alpine") + builder.AddDirective(dfenum.WORKDIR, "/app") + builder.AddDirective(dfenum.COPY, "--from=builder /src/build/libs /app") + builder.AddDirective(dfenum.EXPOSE, "8080") + builder.AddDirective(dfenum.ENTRYPOINT, `["java","-jar","./app.jar"]`) +} diff --git a/utils/dockerfilegenerator/dockerfile-samples/node-application.go b/utils/dockerfilegenerator/sample-builder/node-application-builder.go similarity index 58% rename from utils/dockerfilegenerator/dockerfile-samples/node-application.go rename to utils/dockerfilegenerator/sample-builder/node-application-builder.go index 5d24949..a6ab31e 100644 --- a/utils/dockerfilegenerator/dockerfile-samples/node-application.go +++ b/utils/dockerfilegenerator/sample-builder/node-application-builder.go @@ -1,4 +1,4 @@ -package dockerfilesamples +package samplebuilder import ( "github.com/sw-maestro-kumofactory/miz-ball/utils/dockerfilegenerator" @@ -26,3 +26,18 @@ func NodeApplication(targetDir string) { panic(err) } } + +func AddNodeBuilder(builder *dockerfilegenerator.Builder) { + builder.AddDirective(dfenum.FROM, "node:16-alpine AS builder") + builder.AddDirective(dfenum.WORKDIR, "/app") + builder.AddDirective(dfenum.COPY, ". .") + builder.AddDirective(dfenum.RUN, "npm install") + builder.AddDirective(dfenum.RUN, "npm run build") + + builder.AddDirective(dfenum.FROM, "node:16-alpine") + builder.AddDirective(dfenum.WORKDIR, "/app") + builder.AddDirective(dfenum.COPY, "--from=builder /app /app") + + builder.AddDirective(dfenum.EXPOSE, "3000") + builder.AddDirective(dfenum.ENTRYPOINT, `["npm","run","start"]`) +}