[FORGEJO] implement lxc separately from self-hosted

This commit is contained in:
Earl Warren 2023-11-09 03:36:09 +01:00
parent 8c59ad2ab3
commit 77ceaf4e5d
No known key found for this signature in database
GPG key ID: 0579CB2928A78A00
4 changed files with 89 additions and 62 deletions

View file

@ -7,6 +7,7 @@ type ExecutionsEnvironment interface {
ToContainerPath(string) string ToContainerPath(string) string
GetName() string GetName() string
GetRoot() string GetRoot() string
GetLXC() bool
GetActPath() string GetActPath() string
GetPathVariableName() string GetPathVariableName() string
DefaultPathVariable() string DefaultPathVariable() string

View file

@ -35,6 +35,7 @@ type HostEnvironment struct {
Root string Root string
CleanUp func() CleanUp func()
StdOut io.Writer StdOut io.Writer
LXC bool
} }
func (e *HostEnvironment) Create(_, _ []string) common.Executor { func (e *HostEnvironment) Create(_, _ []string) common.Executor {
@ -302,17 +303,21 @@ func (e *HostEnvironment) exec(ctx context.Context, commandparam []string, cmdli
} else { } else {
wd = e.Path wd = e.Path
} }
if _, err := os.Stat(wd); err != nil { if _, err := os.Stat(wd); err != nil {
common.Logger(ctx).Debugf("Failed to stat working directory %s %v\n", wd, err.Error()) common.Logger(ctx).Debugf("Failed to stat working directory %s %v\n", wd, err.Error())
} }
command := make([]string, len(commandparam)) command := make([]string, len(commandparam))
copy(command, commandparam) copy(command, commandparam)
if user == "root" {
command = append([]string{"/usr/bin/sudo"}, command...) if e.GetLXC() {
} else { if user == "root" {
common.Logger(ctx).Debugf("lxc-attach --name %v %v", e.Name, command) command = append([]string{"/usr/bin/sudo"}, command...)
command = append([]string{"/usr/bin/sudo", "--preserve-env", "--preserve-env=PATH", "/usr/bin/lxc-attach", "--keep-env", "--name", e.Name, "--"}, command...) } else {
common.Logger(ctx).Debugf("lxc-attach --name %v %v", e.Name, command)
command = append([]string{"/usr/bin/sudo", "--preserve-env", "--preserve-env=PATH", "/usr/bin/lxc-attach", "--keep-env", "--name", e.Name, "--"}, command...)
}
} }
f, err := lookupPathHost(command[0], env, e.StdOut) f, err := lookupPathHost(command[0], env, e.StdOut)
@ -414,6 +419,10 @@ func (e *HostEnvironment) ToContainerPath(path string) string {
return path return path
} }
func (e *HostEnvironment) GetLXC() bool {
return e.LXC
}
func (e *HostEnvironment) GetName() string { func (e *HostEnvironment) GetName() string {
return e.Name return e.Name
} }

View file

@ -50,6 +50,10 @@ func (*LinuxContainerEnvironmentExtensions) GetName() string {
return "NAME" return "NAME"
} }
func (*LinuxContainerEnvironmentExtensions) GetLXC() bool {
return false
}
func (*LinuxContainerEnvironmentExtensions) GetRoot() string { func (*LinuxContainerEnvironmentExtensions) GetRoot() string {
return "/var/run" return "/var/run"
} }

View file

@ -247,31 +247,29 @@ source $(dirname $0)/lxc-helpers-lib.sh
lxc_container_destroy "{{.Name}}" lxc_container_destroy "{{.Name}}"
`)) `))
func (rc *RunContext) stopHostEnvironment() common.Executor { func (rc *RunContext) stopHostEnvironment(ctx context.Context) error {
return func(ctx context.Context) error { logger := common.Logger(ctx)
logger := common.Logger(ctx) logger.Debugf("stopHostEnvironment")
logger.Debugf("stopHostEnvironment")
var stopScript bytes.Buffer var stopScript bytes.Buffer
if err := stopTemplate.Execute(&stopScript, struct { if err := stopTemplate.Execute(&stopScript, struct {
Name string Name string
Root string Root string
}{ }{
Name: rc.JobContainer.GetName(), Name: rc.JobContainer.GetName(),
Root: rc.JobContainer.GetRoot(), Root: rc.JobContainer.GetRoot(),
}); err != nil { }); err != nil {
return err return err
}
return common.NewPipelineExecutor(
rc.JobContainer.Copy(rc.JobContainer.GetActPath()+"/", &container.FileEntry{
Name: "workflow/stop-lxc.sh",
Mode: 0755,
Body: stopScript.String(),
}),
rc.JobContainer.Exec([]string{rc.JobContainer.GetActPath() + "/workflow/stop-lxc.sh"}, map[string]string{}, "root", "/tmp"),
)(ctx)
} }
return common.NewPipelineExecutor(
rc.JobContainer.Copy(rc.JobContainer.GetActPath()+"/", &container.FileEntry{
Name: "workflow/stop-lxc.sh",
Mode: 0755,
Body: stopScript.String(),
}),
rc.JobContainer.Exec([]string{rc.JobContainer.GetActPath() + "/workflow/stop-lxc.sh"}, map[string]string{}, "root", "/tmp"),
)(ctx)
} }
func (rc *RunContext) startHostEnvironment() common.Executor { func (rc *RunContext) startHostEnvironment() common.Executor {
@ -316,6 +314,7 @@ func (rc *RunContext) startHostEnvironment() common.Executor {
os.RemoveAll(miscpath) os.RemoveAll(miscpath)
}, },
StdOut: logWriter, StdOut: logWriter,
LXC: rc.IsLXCHostEnv(ctx),
} }
rc.cleanUpJobContainer = rc.JobContainer.Remove() rc.cleanUpJobContainer = rc.JobContainer.Remove()
for k, v := range rc.JobContainer.GetRunnerContext(ctx) { for k, v := range rc.JobContainer.GetRunnerContext(ctx) {
@ -353,33 +352,40 @@ func (rc *RunContext) startHostEnvironment() common.Executor {
return err return err
} }
return common.NewPipelineExecutor( executors := make([]common.Executor, 0, 10)
rc.JobContainer.Copy(rc.JobContainer.GetActPath()+"/", &container.FileEntry{
Name: "workflow/lxc-helpers-lib.sh", if rc.IsLXCHostEnv(ctx) {
Mode: 0755, executors = append(executors,
Body: lxcHelpersLib, rc.JobContainer.Copy(rc.JobContainer.GetActPath()+"/", &container.FileEntry{
}), Name: "workflow/lxc-helpers-lib.sh",
rc.JobContainer.Copy(rc.JobContainer.GetActPath()+"/", &container.FileEntry{ Mode: 0755,
Name: "workflow/lxc-helpers.sh", Body: lxcHelpersLib,
Mode: 0755, }),
Body: lxcHelpers, rc.JobContainer.Copy(rc.JobContainer.GetActPath()+"/", &container.FileEntry{
}), Name: "workflow/lxc-helpers.sh",
rc.JobContainer.Copy(rc.JobContainer.GetActPath()+"/", &container.FileEntry{ Mode: 0755,
Name: "workflow/start-lxc.sh", Body: lxcHelpers,
Mode: 0755, }),
Body: startScript.String(), rc.JobContainer.Copy(rc.JobContainer.GetActPath()+"/", &container.FileEntry{
}), Name: "workflow/start-lxc.sh",
rc.JobContainer.Exec([]string{rc.JobContainer.GetActPath() + "/workflow/start-lxc.sh"}, map[string]string{}, "root", "/tmp"), Mode: 0755,
rc.JobContainer.Copy(rc.JobContainer.GetActPath()+"/", &container.FileEntry{ Body: startScript.String(),
Name: "workflow/event.json", }),
Mode: 0o644, rc.JobContainer.Exec([]string{rc.JobContainer.GetActPath() + "/workflow/start-lxc.sh"}, map[string]string{}, "root", "/tmp"),
Body: rc.EventJSON, )
}, &container.FileEntry{ }
Name: "workflow/envs.txt",
Mode: 0o666, executors = append(executors, rc.JobContainer.Copy(rc.JobContainer.GetActPath()+"/", &container.FileEntry{
Body: "", Name: "workflow/event.json",
}), Mode: 0o644,
)(ctx) Body: rc.EventJSON,
}, &container.FileEntry{
Name: "workflow/envs.txt",
Mode: 0o666,
Body: "",
}))
return common.NewPipelineExecutor(executors...)(ctx)
} }
} }
@ -725,17 +731,25 @@ func (rc *RunContext) startContainer() common.Executor {
} }
} }
func (rc *RunContext) IsHostEnv(ctx context.Context) bool { func (rc *RunContext) IsBareHostEnv(ctx context.Context) bool {
platform := rc.runsOnImage(ctx) platform := rc.runsOnImage(ctx)
image := rc.containerImage(ctx) image := rc.containerImage(ctx)
return image == "" && strings.EqualFold(platform, "-self-hosted") return image == "" && strings.EqualFold(platform, "-self-hosted")
} }
func (rc *RunContext) IsLXCHostEnv(ctx context.Context) bool {
platform := rc.runsOnImage(ctx)
return strings.HasPrefix(platform, "lxc:")
}
func (rc *RunContext) IsHostEnv(ctx context.Context) bool {
return rc.IsBareHostEnv(ctx) || rc.IsLXCHostEnv(ctx)
}
func (rc *RunContext) stopContainer() common.Executor { func (rc *RunContext) stopContainer() common.Executor {
return func(ctx context.Context) error { return func(ctx context.Context) error {
image := rc.platformImage(ctx) if rc.IsLXCHostEnv(ctx) {
if strings.EqualFold(image, "-self-hosted") { return rc.stopHostEnvironment(ctx)
return rc.stopHostEnvironment()(ctx)
} }
return rc.stopJobContainer()(ctx) return rc.stopJobContainer()(ctx)
} }
@ -744,9 +758,8 @@ func (rc *RunContext) stopContainer() common.Executor {
func (rc *RunContext) closeContainer() common.Executor { func (rc *RunContext) closeContainer() common.Executor {
return func(ctx context.Context) error { return func(ctx context.Context) error {
if rc.JobContainer != nil { if rc.JobContainer != nil {
image := rc.platformImage(ctx) if rc.IsLXCHostEnv(ctx) {
if strings.EqualFold(image, "-self-hosted") { return rc.stopHostEnvironment(ctx)
return rc.stopHostEnvironment()(ctx)
} }
return rc.JobContainer.Close()(ctx) return rc.JobContainer.Close()(ctx)
} }