GitRoot
craft your forge, build your project, grow your community freely
1// SPDX-FileCopyrightText: 2025 Romain Maneschi <romain@gitroot.dev>
2//
3// SPDX-License-Identifier: EUPL-1.2
4
5package exec
6
7import (
8 "fmt"
9 "path/filepath"
10 "strings"
11
12 pluginLib "gitroot.dev/libs/golang/plugin/model"
13 "gitroot.dev/server/configuration"
14 "gitroot.dev/server/logger"
15)
16
17type Container struct {
18 logger *logger.Logger
19 conf configuration.ContainerConf
20 executor *BareMetal
21}
22
23func NewContainer(log *logger.Logger, conf configuration.ContainerConf) *Container {
24 mylog := log.NewSubLogger("container")
25 return &Container{
26 logger: mylog,
27 conf: conf,
28 executor: NewBareMetal(mylog),
29 }
30}
31
32func (e *Container) name() string {
33 return "container"
34}
35
36func (e *Container) exec(dir string, exe pluginLib.Exec) (*pluginLib.ExecStatus, error) {
37 eachCmds := make([]string, len(exe.Cmds))
38 for i, cmd := range exe.Cmds {
39 eachCmds[i] = fmt.Sprintf("%s %s", cmd.Cmd, strings.Join(cmd.Args, " "))
40 }
41 toBeRun := strings.Join(eachCmds, " && ")
42 isRemoteImage := !strings.HasSuffix(exe.Build, "Containerfile") && !strings.HasSuffix(exe.Build, "Dockerfile")
43 imageName := strings.ReplaceAll(strings.TrimLeft(dir, "/"), "/", "_")
44 if exe.Build == "" {
45 imageName = "docker.io/bash"
46 } else if isRemoteImage {
47 imageName = exe.Build
48 }
49
50 subCmd := pluginLib.Exec{Cmds: []pluginLib.Cmd{
51 {Cmd: e.conf.Bin, Args: []string{
52 "run", "--rm",
53 "-v", "/var/log:/var/log", //TODO make configurable
54 "-v", fmt.Sprintf("%s:/%s", filepath.Join(dir, APP_DIR), APP_DIR),
55 fmt.Sprintf("-w=/%s", APP_DIR),
56 imageName,
57 "/bin/sh", "-c", toBeRun,
58 }},
59 }}
60 if !isRemoteImage {
61 ctxDir, _ := filepath.Split(exe.Build)
62 subCmd.Cmds = append([]pluginLib.Cmd{{Cmd: e.conf.Bin, Args: []string{"build", "-t", imageName, ctxDir}}}, subCmd.Cmds...)
63 }
64 return e.executor.exec(dir, subCmd)
65}