woj-server/internal/service/runner/deps.go

97 lines
1.9 KiB
Go
Raw Normal View History

package runner
import (
2024-01-27 17:37:27 +08:00
"compress/gzip"
2024-01-06 15:07:11 +08:00
"errors"
2023-07-14 21:47:11 +08:00
"git.0x7f.app/WOJ/woj-server/internal/e"
"git.0x7f.app/WOJ/woj-server/pkg/file"
2023-07-14 21:47:11 +08:00
"git.0x7f.app/WOJ/woj-server/pkg/utils"
2024-01-27 17:37:27 +08:00
"github.com/containerd/containerd"
"go.uber.org/zap"
"os"
"path/filepath"
)
2024-01-06 15:07:11 +08:00
type depConfig struct {
2024-01-27 17:37:27 +08:00
tarball string
image string
2024-01-06 15:07:11 +08:00
}
2024-01-27 17:37:27 +08:00
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 {
2024-01-06 15:07:11 +08:00
err := utils.NewTryErr().
2024-01-27 17:37:27 +08:00
Try(func() error { return s.LoadImageFromTarball(cfg.tarball) }).
Or(func() error { return s.LoadImageFromRegistry(cfg.image) }).
2024-01-06 15:07:11 +08:00
Done()
if err != nil {
2024-01-06 19:47:16 +08:00
s.log.Warn("[deps] load image failed", zap.Error(err))
2024-01-06 15:07:11 +08:00
return e.RunnerDepsBuildFailed
}
return e.Success
}
func (s *service) EnsureDeps(force bool) e.Status {
2023-12-21 17:08:53 +08:00
mark := filepath.Join(Prefix, ".mark.image")
2024-01-06 15:07:11 +08:00
// check mark
if force {
_ = os.Remove(mark)
} else if file.Exist(mark) {
return e.Success
}
2024-01-06 15:07:11 +08:00
// full
fullImage := &depConfig{
2024-01-27 17:37:27 +08:00
tarball: filepath.Join(TmpDir, "ubuntu-full.tar.gz"),
image: ContainerImageFull,
2023-08-11 23:56:58 +08:00
}
2024-01-27 17:37:27 +08:00
if s.LoadImage(fullImage) != e.Success {
2024-01-06 15:07:11 +08:00
return e.RunnerDepsBuildFailed
}
// tiny
tinyImage := &depConfig{
2024-01-27 17:37:27 +08:00
tarball: filepath.Join(TmpDir, "ubuntu-tiny.tar.gz"),
image: ContainerImageRun,
2024-01-06 15:07:11 +08:00
}
2024-01-27 17:37:27 +08:00
if s.LoadImage(tinyImage) != e.Success {
return e.RunnerDepsBuildFailed
}
2024-01-06 15:07:11 +08:00
// mark
_, _ = os.Create(mark)
return e.Success
}