diff --git a/internal/service/runner/common.go b/internal/service/runner/common.go index 76da6c5..138f537 100644 --- a/internal/service/runner/common.go +++ b/internal/service/runner/common.go @@ -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 diff --git a/internal/service/runner/deps.go b/internal/service/runner/deps.go index 28f7849..d0f8d6e 100644 --- a/internal/service/runner/deps.go +++ b/internal/service/runner/deps.go @@ -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 }