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}