diff --git a/util/testutil/integration/run.go b/util/testutil/integration/run.go index c087c7cb6..fefbb167c 100644 --- a/util/testutil/integration/run.go +++ b/util/testutil/integration/run.go @@ -360,37 +360,80 @@ func lazyMirrorRunnerFunc(t *testing.T, images map[string]string) func() string var mirror string return func() string { once.Do(func() { - host, cleanup, err := runMirror(t, images) + m, err := RunMirror() require.NoError(t, err) - t.Cleanup(func() { _ = cleanup() }) - mirror = host + require.NoError(t, m.AddImages(t, images)) + t.Cleanup(func() { _ = m.Close() }) + mirror = m.Host }) return mirror } } -func runMirror(t *testing.T, mirroredImages map[string]string) (host string, _ func() error, err error) { +type Mirror struct { + Host string + dir string + cleanup func() error +} + +func (m *Mirror) lock() (*flock.Flock, error) { + if m.dir == "" { + return nil, nil + } + if err := os.MkdirAll(m.dir, 0700); err != nil { + return nil, err + } + lock := flock.New(filepath.Join(m.dir, "lock")) + if err := lock.Lock(); err != nil { + return nil, err + } + return lock, nil +} + +func (m *Mirror) Close() error { + if m.cleanup != nil { + return m.cleanup() + } + return nil +} + +func (m *Mirror) AddImages(t *testing.T, images map[string]string) (err error) { + lock, err := m.lock() + if err != nil { + return err + } + defer func() { + if lock != nil { + lock.Unlock() + } + }() + + if err := copyImagesLocal(t, m.Host, images); err != nil { + return err + } + return nil +} + +func RunMirror() (_ *Mirror, err error) { mirrorDir := os.Getenv("BUILDKIT_REGISTRY_MIRROR_DIR") - var lock *flock.Flock - if mirrorDir != "" { - if err := os.MkdirAll(mirrorDir, 0700); err != nil { - return "", nil, err - } - lock = flock.New(filepath.Join(mirrorDir, "lock")) - if err := lock.Lock(); err != nil { - return "", nil, err - } - defer func() { - if err != nil { - lock.Unlock() - } - }() + m := &Mirror{ + dir: mirrorDir, } - mirror, cleanup, err := NewRegistry(mirrorDir) + lock, err := m.lock() if err != nil { - return "", nil, err + return nil, err + } + defer func() { + if err != nil { + lock.Unlock() + } + }() + + host, cleanup, err := NewRegistry(mirrorDir) + if err != nil { + return nil, err } defer func() { if err != nil { @@ -398,17 +441,16 @@ func runMirror(t *testing.T, mirroredImages map[string]string) (host string, _ f } }() - if err := copyImagesLocal(t, mirror, mirroredImages); err != nil { - return "", nil, err - } + m.Host = host + m.cleanup = cleanup - if mirrorDir != "" { + if lock != nil { if err := lock.Unlock(); err != nil { - return "", nil, err + return nil, err } } - return mirror, cleanup, err + return m, err } type matrixValue struct { diff --git a/worker/containerd/containerd_test.go b/worker/containerd/containerd_test.go index f8e7cbae1..04db1b3db 100644 --- a/worker/containerd/containerd_test.go +++ b/worker/containerd/containerd_test.go @@ -14,6 +14,11 @@ import ( "github.com/stretchr/testify/require" ) +func TestMain(m *testing.M) { + defer tests.RunMirror()() + m.Run() +} + func init() { workers.InitContainerdWorker() } diff --git a/worker/runc/runc_test.go b/worker/runc/runc_test.go index ea58b90d4..82b4c40f5 100644 --- a/worker/runc/runc_test.go +++ b/worker/runc/runc_test.go @@ -27,6 +27,11 @@ import ( "github.com/stretchr/testify/require" ) +func TestMain(m *testing.M) { + defer tests.RunMirror()() + m.Run() +} + func newWorkerOpt(t *testing.T, processMode oci.ProcessMode) base.WorkerOpt { tmpdir := t.TempDir() diff --git a/worker/tests/common.go b/worker/tests/common.go index 07efebb55..85ac3c24c 100644 --- a/worker/tests/common.go +++ b/worker/tests/common.go @@ -4,6 +4,7 @@ import ( "bytes" "context" "io" + "sync" "testing" "time" @@ -14,14 +15,38 @@ import ( "github.com/moby/buildkit/session" "github.com/moby/buildkit/snapshot" "github.com/moby/buildkit/source/containerimage" + "github.com/moby/buildkit/util/testutil/integration" "github.com/moby/buildkit/worker/base" "github.com/pkg/errors" "github.com/stretchr/testify/require" "golang.org/x/sync/errgroup" ) +var mirrorOnce sync.Once +var mirror *integration.Mirror +var mirrorMu sync.Mutex + +func RunMirror() func() error { + mirrorOnce.Do(func() { + m, err := integration.RunMirror() + if err != nil { + panic(err) + } + mirror = m + }) + return func() error { return mirror.Close() } +} + +func mirrorBusybox(t *testing.T) string { + mirrorMu.Lock() + defer mirrorMu.Unlock() + require.NotNil(t, mirror, "mirror must be initialized") + require.NoError(t, mirror.AddImages(t, integration.OfficialImages("busybox:latest"))) + return mirror.Host + "/library/busybox:latest" +} + func NewBusyboxSourceSnapshot(ctx context.Context, t *testing.T, w *base.Worker, sm *session.Manager) cache.ImmutableRef { - img, err := containerimage.NewImageIdentifier("docker.io/library/busybox:latest") + img, err := containerimage.NewImageIdentifier(mirrorBusybox(t)) require.NoError(t, err) src, err := w.SourceManager.Resolve(ctx, img, sm, nil) require.NoError(t, err)