feat: #6 [2] Rewrite EnsureDeps

This commit is contained in:
Paul Pan 2024-01-06 15:07:11 +08:00
parent 8d66639cdc
commit 8e3222daab
Signed by: Paul
GPG Key ID: D639BDF5BA578AF4
2 changed files with 61 additions and 14 deletions

View File

@ -32,10 +32,9 @@ func init() {
TmpDir = path.Join(Prefix, TmpDir)
}
func (s *service) execute(script string, args ...string) error {
p := filepath.Join(ScriptsDir, script)
cmd := exec.Command(p, args...)
cmd.Dir = ScriptsDir
func (s *service) execute(exe string, args ...string) error {
cmd := exec.Command(exe, args...)
cmd.Dir = Prefix
if s.verbose {
cmd.Stdout = os.Stderr
cmd.Stderr = os.Stderr

View File

@ -1,35 +1,83 @@
package runner
import (
"errors"
"fmt"
"git.0x7f.app/WOJ/woj-server/internal/e"
"git.0x7f.app/WOJ/woj-server/pkg/utils"
"go.uber.org/zap"
"os"
"os/exec"
"path/filepath"
)
type depConfig struct {
tarball string
image string
dockerfile string
}
func (s *service) loadImage(cfg *depConfig) e.Status {
err := utils.NewTryErr().
Try(func() error {
// import from tarball
if !utils.FileExist(cfg.tarball) {
return errors.New("tarball not exists")
}
return s.execute("bash", "-c", fmt.Sprintf("gzip -d -c %s | podman load", cfg.tarball))
}).
Or(func() error {
// pull from docker hub
return s.execute("podman", "pull", cfg.image)
}).
Or(func() error {
// build from dockerfile
if !utils.FileExist(cfg.dockerfile) {
return errors.New("dockerfile not exists")
}
return s.execute("podman", "build", "-f", cfg.dockerfile, "-t", cfg.image, ".")
}).
Done()
if err != nil {
s.log.Warn("load image failed", zap.Error(err))
return e.RunnerDepsBuildFailed
}
return e.Success
}
func (s *service) EnsureDeps(force bool) e.Status {
mark := filepath.Join(Prefix, ".mark.image")
// check mark
if force {
_ = os.Remove(mark)
} else if utils.FileExist(mark) {
return e.Success
}
script := filepath.Join(ScriptsDir, "prepare_images.sh")
cmd := exec.Command(script)
cmd.Dir = ScriptsDir
if s.verbose {
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
// full
fullImage := &depConfig{
tarball: filepath.Join(TmpDir, "ubuntu-full.tar.gz"),
image: "git.0x7f.app/woj/ubuntu-full:latest",
dockerfile: filepath.Join(ScriptsDir, "ubuntu-full.Dockerfile"),
}
err := cmd.Run()
if err != nil {
s.log.Warn("prebuild docker images failed", zap.Error(err))
if s.loadImage(fullImage) != e.Success {
return e.RunnerDepsBuildFailed
}
// tiny
tinyImage := &depConfig{
tarball: filepath.Join(TmpDir, "ubuntu-tiny.tar.gz"),
image: "git.0x7f.app/woj/ubuntu-run:latest",
dockerfile: filepath.Join(ScriptsDir, "ubuntu-run.Dockerfile"),
}
if s.loadImage(tinyImage) != e.Success {
return e.RunnerDepsBuildFailed
}
// mark
_, _ = os.Create(mark)
return e.Success
}