97 lines
1.9 KiB
Go
97 lines
1.9 KiB
Go
package runner
|
|
|
|
import (
|
|
"compress/gzip"
|
|
"errors"
|
|
"git.0x7f.app/WOJ/woj-server/internal/e"
|
|
"git.0x7f.app/WOJ/woj-server/pkg/file"
|
|
"git.0x7f.app/WOJ/woj-server/pkg/utils"
|
|
"github.com/containerd/containerd"
|
|
"go.uber.org/zap"
|
|
"os"
|
|
"path/filepath"
|
|
)
|
|
|
|
type depConfig struct {
|
|
tarball string
|
|
image string
|
|
}
|
|
|
|
func (s *service) LoadImageFromTarball(path string) error {
|
|
if !file.Exist(path) {
|
|
return errors.New("tarball not exists")
|
|
}
|
|
|
|
f, err := os.Open(path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer func(f *os.File) {
|
|
_ = f.Close()
|
|
}(f)
|
|
|
|
g, err := gzip.NewReader(f)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer func(g *gzip.Reader) {
|
|
_ = g.Close()
|
|
}(g)
|
|
|
|
_, err = s.container.client.Import(s.container.ctx, g)
|
|
return err
|
|
}
|
|
|
|
func (s *service) LoadImageFromRegistry(image string) error {
|
|
_, err := s.container.client.Pull(s.container.ctx, image, containerd.WithPullUnpack)
|
|
return err
|
|
}
|
|
|
|
func (s *service) LoadImage(cfg *depConfig) e.Status {
|
|
err := utils.NewTryErr().
|
|
Try(func() error { return s.LoadImageFromTarball(cfg.tarball) }).
|
|
Or(func() error { return s.LoadImageFromRegistry(cfg.image) }).
|
|
Done()
|
|
|
|
if err != nil {
|
|
s.log.Warn("[deps] 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 file.Exist(mark) {
|
|
return e.Success
|
|
}
|
|
|
|
// full
|
|
fullImage := &depConfig{
|
|
tarball: filepath.Join(TmpDir, "ubuntu-full.tar.gz"),
|
|
image: ContainerImageFull,
|
|
}
|
|
if s.LoadImage(fullImage) != e.Success {
|
|
return e.RunnerDepsBuildFailed
|
|
}
|
|
|
|
// tiny
|
|
tinyImage := &depConfig{
|
|
tarball: filepath.Join(TmpDir, "ubuntu-tiny.tar.gz"),
|
|
image: ContainerImageRun,
|
|
}
|
|
if s.LoadImage(tinyImage) != e.Success {
|
|
return e.RunnerDepsBuildFailed
|
|
}
|
|
|
|
// mark
|
|
_, _ = os.Create(mark)
|
|
|
|
return e.Success
|
|
}
|