diff --git a/client/client_test.go b/client/client_test.go index f7597669d841..b196a286b90b 100644 --- a/client/client_test.go +++ b/client/client_test.go @@ -102,6 +102,7 @@ func TestIntegration(t *testing.T) { testCacheMountNoCache, testExporterTargetExists, testTarExporterWithSocket, + testMultipleRegistryCacheImportExport, }, mirrors) integration.Run(t, []integration.Test{ @@ -1658,7 +1659,7 @@ func testBuildPushAndValidate(t *testing.T, sb integration.Sandbox) { require.False(t, ok) } -func testBasicCacheImportExport(t *testing.T, sb integration.Sandbox, cacheOptionsEntryImport, cacheOptionsEntryExport CacheOptionsEntry) { +func testBasicCacheImportExport(t *testing.T, sb integration.Sandbox, cacheOptionsEntryImport, cacheOptionsEntryExport []CacheOptionsEntry) { requiresLinux(t) c, err := New(context.TODO(), sb.Address()) require.NoError(t, err) @@ -1688,9 +1689,7 @@ func testBasicCacheImportExport(t *testing.T, sb integration.Sandbox, cacheOptio OutputDir: destDir, }, }, - CacheExports: []CacheOptionsEntry{ - cacheOptionsEntryExport, - }, + CacheExports: cacheOptionsEntryExport, }, nil) require.NoError(t, err) @@ -1716,9 +1715,7 @@ func testBasicCacheImportExport(t *testing.T, sb integration.Sandbox, cacheOptio Type: ExporterLocal, OutputDir: destDir, }}, - CacheImports: []CacheOptionsEntry{ - cacheOptionsEntryImport, - }, + CacheImports: cacheOptionsEntryImport, }, nil) require.NoError(t, err) @@ -1744,7 +1741,29 @@ func testBasicRegistryCacheImportExport(t *testing.T, sb integration.Sandbox) { "ref": target, }, } - testBasicCacheImportExport(t, sb, o, o) + testBasicCacheImportExport(t, sb, []CacheOptionsEntry{o}, []CacheOptionsEntry{o}) +} + +func testMultipleRegistryCacheImportExport(t *testing.T, sb integration.Sandbox) { + registry, err := sb.NewRegistry() + if errors.Cause(err) == integration.ErrorRequirements { + t.Skip(err.Error()) + } + require.NoError(t, err) + target := registry + "/buildkit/testexport:latest" + o := CacheOptionsEntry{ + Type: "registry", + Attrs: map[string]string{ + "ref": target, + }, + } + o2 := CacheOptionsEntry{ + Type: "registry", + Attrs: map[string]string{ + "ref": target + "notexist", + }, + } + testBasicCacheImportExport(t, sb, []CacheOptionsEntry{o, o2}, []CacheOptionsEntry{o}) } func testBasicLocalCacheImportExport(t *testing.T, sb integration.Sandbox) { @@ -1763,7 +1782,7 @@ func testBasicLocalCacheImportExport(t *testing.T, sb integration.Sandbox) { "dest": dir, }, } - testBasicCacheImportExport(t, sb, im, ex) + testBasicCacheImportExport(t, sb, []CacheOptionsEntry{im}, []CacheOptionsEntry{ex}) } func testBasicInlineCacheImportExport(t *testing.T, sb integration.Sandbox) { diff --git a/solver/llbsolver/bridge.go b/solver/llbsolver/bridge.go index 42f2a8ce4f40..0905f98325ef 100644 --- a/solver/llbsolver/bridge.go +++ b/solver/llbsolver/bridge.go @@ -54,7 +54,7 @@ func (b *llbBridge) Solve(ctx context.Context, req frontend.SolveRequest) (res * } } if prevCm, ok := b.cms[cmId]; !ok { - func(cmId string) { + func(cmId string, im gw.CacheOptionsEntry) { cm = newLazyCacheManager(cmId, func() (solver.CacheManager, error) { var cmNew solver.CacheManager if err := inVertexContext(b.builder.Context(ctx), "importing cache manifest from "+cmId, "", func(ctx context.Context) error { @@ -74,7 +74,7 @@ func (b *llbBridge) Solve(ctx context.Context, req frontend.SolveRequest) (res * } return cmNew, nil }) - }(cmId) + }(cmId, im) b.cms[cmId] = cm } else { cm = prevCm