diff --git a/client/client_test.go b/client/client_test.go index da999900f0024..f27e8c98b1760 100644 --- a/client/client_test.go +++ b/client/client_test.go @@ -245,7 +245,7 @@ func newContainerd(cdAddress string) (*containerd.Client, error) { // moby/buildkit#1336 func testCacheExportCacheKeyLoop(t *testing.T, sb integration.Sandbox) { - integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport) + integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport, integration.FeatureCacheBackendLocal) c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) defer c.Close() @@ -3747,7 +3747,7 @@ func testBuildPushAndValidate(t *testing.T, sb integration.Sandbox) { } func testStargzLazyRegistryCacheImportExport(t *testing.T, sb integration.Sandbox) { - integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport) + integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport, integration.FeatureCacheImport, integration.FeatureCacheBackendRegistry) requiresLinux(t) cdAddress := sb.ContainerdAddress() if cdAddress == "" || sb.Snapshotter() != "stargz" { @@ -3945,7 +3945,12 @@ func testStargzLazyRegistryCacheImportExport(t *testing.T, sb integration.Sandbo } func testStargzLazyInlineCacheImportExport(t *testing.T, sb integration.Sandbox) { - integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport) + integration.CheckFeatureCompat(t, sb, + integration.FeatureCacheExport, + integration.FeatureCacheImport, + integration.FeatureCacheBackendInline, + integration.FeatureCacheBackendRegistry, + ) requiresLinux(t) cdAddress := sb.ContainerdAddress() if cdAddress == "" || sb.Snapshotter() != "stargz" { @@ -4392,7 +4397,7 @@ func testLazyImagePush(t *testing.T, sb integration.Sandbox) { } func testZstdLocalCacheExport(t *testing.T, sb integration.Sandbox) { - integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport) + integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport, integration.FeatureCacheBackendLocal) c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) defer c.Close() @@ -4451,7 +4456,7 @@ func testZstdLocalCacheExport(t *testing.T, sb integration.Sandbox) { } func testCacheExportIgnoreError(t *testing.T, sb integration.Sandbox) { - integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport) + integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport, integration.FeatureCacheBackendLocal) c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) defer c.Close() @@ -4558,7 +4563,7 @@ func testCacheExportIgnoreError(t *testing.T, sb integration.Sandbox) { } func testUncompressedLocalCacheImportExport(t *testing.T, sb integration.Sandbox) { - integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport) + integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport, integration.FeatureCacheImport, integration.FeatureCacheBackendLocal) dir := t.TempDir() im := CacheOptionsEntry{ Type: "local", @@ -4578,7 +4583,7 @@ func testUncompressedLocalCacheImportExport(t *testing.T, sb integration.Sandbox } func testUncompressedRegistryCacheImportExport(t *testing.T, sb integration.Sandbox) { - integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport) + integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport, integration.FeatureCacheImport, integration.FeatureCacheBackendRegistry) registry, err := sb.NewRegistry() if errors.Is(err, integration.ErrRequirements) { t.Skip(err.Error()) @@ -4603,7 +4608,7 @@ func testUncompressedRegistryCacheImportExport(t *testing.T, sb integration.Sand } func testZstdLocalCacheImportExport(t *testing.T, sb integration.Sandbox) { - integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport) + integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport, integration.FeatureCacheImport, integration.FeatureCacheBackendLocal) dir := t.TempDir() im := CacheOptionsEntry{ Type: "local", @@ -4624,7 +4629,7 @@ func testZstdLocalCacheImportExport(t *testing.T, sb integration.Sandbox) { } func testZstdRegistryCacheImportExport(t *testing.T, sb integration.Sandbox) { - integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport) + integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport, integration.FeatureCacheImport, integration.FeatureCacheBackendRegistry) registry, err := sb.NewRegistry() if errors.Is(err, integration.ErrRequirements) { t.Skip(err.Error()) @@ -4712,7 +4717,7 @@ func testBasicCacheImportExport(t *testing.T, sb integration.Sandbox, cacheOptio } func testBasicRegistryCacheImportExport(t *testing.T, sb integration.Sandbox) { - integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport) + integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport, integration.FeatureCacheImport, integration.FeatureCacheBackendRegistry) registry, err := sb.NewRegistry() if errors.Is(err, integration.ErrRequirements) { t.Skip(err.Error()) @@ -4729,7 +4734,7 @@ func testBasicRegistryCacheImportExport(t *testing.T, sb integration.Sandbox) { } func testMultipleRegistryCacheImportExport(t *testing.T, sb integration.Sandbox) { - integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport) + integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport, integration.FeatureCacheImport, integration.FeatureCacheBackendRegistry) registry, err := sb.NewRegistry() if errors.Is(err, integration.ErrRequirements) { t.Skip(err.Error()) @@ -4752,7 +4757,7 @@ func testMultipleRegistryCacheImportExport(t *testing.T, sb integration.Sandbox) } func testBasicLocalCacheImportExport(t *testing.T, sb integration.Sandbox) { - integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport) + integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport, integration.FeatureCacheImport, integration.FeatureCacheBackendLocal) dir := t.TempDir() im := CacheOptionsEntry{ Type: "local", @@ -4770,7 +4775,7 @@ func testBasicLocalCacheImportExport(t *testing.T, sb integration.Sandbox) { } func testBasicS3CacheImportExport(t *testing.T, sb integration.Sandbox) { - integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport) + integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport, integration.FeatureCacheImport, integration.FeatureCacheBackendS3) opts := integration.MinioOpts{ Region: "us-east-1", @@ -4808,7 +4813,7 @@ func testBasicS3CacheImportExport(t *testing.T, sb integration.Sandbox) { } func testBasicAzblobCacheImportExport(t *testing.T, sb integration.Sandbox) { - integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport) + integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport, integration.FeatureCacheImport, integration.FeatureCacheBackendAzblob) opts := integration.AzuriteOpts{ AccountName: "azblobcacheaccount", @@ -4841,7 +4846,13 @@ func testBasicAzblobCacheImportExport(t *testing.T, sb integration.Sandbox) { } func testBasicInlineCacheImportExport(t *testing.T, sb integration.Sandbox) { - integration.CheckFeatureCompat(t, sb, integration.FeatureDirectPush, integration.FeatureCacheImport) + integration.CheckFeatureCompat(t, sb, + integration.FeatureDirectPush, + integration.FeatureCacheExport, + integration.FeatureCacheImport, + integration.FeatureCacheBackendInline, + integration.FeatureCacheBackendRegistry, + ) requiresLinux(t) registry, err := sb.NewRegistry() if errors.Is(err, integration.ErrRequirements) { @@ -5001,7 +5012,7 @@ func testBasicInlineCacheImportExport(t *testing.T, sb integration.Sandbox) { } func testBasicGhaCacheImportExport(t *testing.T, sb integration.Sandbox) { - integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport) + integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport, integration.FeatureCacheImport, integration.FeatureCacheBackendGha) runtimeToken := os.Getenv("ACTIONS_RUNTIME_TOKEN") cacheURL := os.Getenv("ACTIONS_CACHE_URL") if runtimeToken == "" || cacheURL == "" { diff --git a/frontend/dockerfile/dockerfile_test.go b/frontend/dockerfile/dockerfile_test.go index fac007561014d..0c753000a5c84 100644 --- a/frontend/dockerfile/dockerfile_test.go +++ b/frontend/dockerfile/dockerfile_test.go @@ -420,7 +420,7 @@ RUN [ "$(cat testfile)" == "contents0" ] } func testExportCacheLoop(t *testing.T, sb integration.Sandbox) { - integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport) + integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport, integration.FeatureCacheImport, integration.FeatureCacheBackendLocal) f := getFrontend(t, sb) dockerfile := []byte(` @@ -3949,7 +3949,12 @@ ONBUILD RUN mkdir -p /out && echo -n 11 >> /out/foo } func testCacheMultiPlatformImportExport(t *testing.T, sb integration.Sandbox) { - integration.CheckFeatureCompat(t, sb, integration.FeatureDirectPush) + integration.CheckFeatureCompat(t, sb, + integration.FeatureDirectPush, + integration.FeatureCacheExport, + integration.FeatureCacheBackendInline, + integration.FeatureCacheBackendRegistry, + ) f := getFrontend(t, sb) registry, err := sb.NewRegistry() @@ -4072,7 +4077,7 @@ COPY --from=base arch / } func testCacheImportExport(t *testing.T, sb integration.Sandbox) { - integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport) + integration.CheckFeatureCompat(t, sb, integration.FeatureCacheExport, integration.FeatureCacheBackendLocal) f := getFrontend(t, sb) registry, err := sb.NewRegistry() diff --git a/util/testutil/integration/dockerd.go b/util/testutil/integration/dockerd.go index a0168b45e797b..e2441a71435b8 100644 --- a/util/testutil/integration/dockerd.go +++ b/util/testutil/integration/dockerd.go @@ -25,6 +25,12 @@ func InitDockerdWorker() { unsupported: []string{ FeatureCacheExport, FeatureCacheImport, + FeatureCacheBackendAzblob, + FeatureCacheBackendGha, + FeatureCacheBackendInline, + FeatureCacheBackendLocal, + FeatureCacheBackendRegistry, + FeatureCacheBackendS3, FeatureDirectPush, FeatureImageExporter, FeatureMultiCacheExport, diff --git a/util/testutil/integration/sandbox.go b/util/testutil/integration/sandbox.go index 6601770b509b1..439ca6652a8f8 100644 --- a/util/testutil/integration/sandbox.go +++ b/util/testutil/integration/sandbox.go @@ -9,6 +9,7 @@ import ( "os/exec" "path/filepath" "runtime" + "strconv" "strings" "testing" "time" @@ -47,7 +48,13 @@ func (b backend) Snapshotter() string { func (b backend) isUnsupportedFeature(feature string) bool { for _, unsupportedFeature := range b.unsupportedFeatures { - if feature == unsupportedFeature { + var envFeature *bool + if v := os.Getenv("BUILDKIT_TEST_FEATURE_" + strings.ToUpper(feature)); v != "" { + if bb, err := strconv.ParseBool(v); err == nil { + envFeature = &bb + } + } + if feature == unsupportedFeature && (envFeature == nil || !*envFeature) { return true } } @@ -270,41 +277,53 @@ func printLogs(logs map[string]*bytes.Buffer, f func(args ...interface{})) { } const ( - FeatureCacheExport = "cache export" - FeatureCacheImport = "cache import" - FeatureDirectPush = "direct push" - FeatureFrontendOutline = "frontend outline" - FeatureFrontendTargets = "frontend targets" - FeatureImageExporter = "image exporter" - FeatureInfo = "info" - FeatureMultiCacheExport = "multi cache export" - FeatureMultiPlatform = "multi-platform" - FeatureOCIExporter = "oci exporter" - FeatureOCILayout = "oci layout" - FeatureProvenance = "provenance" - FeatureSBOM = "sbom" - FeatureSecurityMode = "security mode" - FeatureSourceDateEpoch = "source date epoch" - FeatureCNINetwork = "cni network" + FeatureCacheExport = "cacheExport" + FeatureCacheImport = "cacheImport" + FeatureCacheBackendAzblob = "cacheBackendAzblob" + FeatureCacheBackendGha = "cacheBackendGha" + FeatureCacheBackendInline = "cacheBackendInline" + FeatureCacheBackendLocal = "cacheBackendLocal" + FeatureCacheBackendRegistry = "cacheBackendRegistry" + FeatureCacheBackendS3 = "cacheBackendS3" + FeatureDirectPush = "directPush" + FeatureFrontendOutline = "frontendOutline" + FeatureFrontendTargets = "frontendTargets" + FeatureImageExporter = "imageExporter" + FeatureInfo = "info" + FeatureMultiCacheExport = "multiCacheExport" + FeatureMultiPlatform = "multiPlatform" + FeatureOCIExporter = "ociExporter" + FeatureOCILayout = "ociLayout" + FeatureProvenance = "provenance" + FeatureSBOM = "sbom" + FeatureSecurityMode = "securityMode" + FeatureSourceDateEpoch = "sourceDateEpoch" + FeatureCNINetwork = "cniNetwork" ) var features = map[string]struct{}{ - FeatureCacheExport: {}, - FeatureCacheImport: {}, - FeatureDirectPush: {}, - FeatureFrontendOutline: {}, - FeatureFrontendTargets: {}, - FeatureImageExporter: {}, - FeatureInfo: {}, - FeatureMultiCacheExport: {}, - FeatureMultiPlatform: {}, - FeatureOCIExporter: {}, - FeatureOCILayout: {}, - FeatureProvenance: {}, - FeatureSBOM: {}, - FeatureSecurityMode: {}, - FeatureSourceDateEpoch: {}, - FeatureCNINetwork: {}, + FeatureCacheExport: {}, + FeatureCacheImport: {}, + FeatureCacheBackendAzblob: {}, + FeatureCacheBackendGha: {}, + FeatureCacheBackendInline: {}, + FeatureCacheBackendLocal: {}, + FeatureCacheBackendRegistry: {}, + FeatureCacheBackendS3: {}, + FeatureDirectPush: {}, + FeatureFrontendOutline: {}, + FeatureFrontendTargets: {}, + FeatureImageExporter: {}, + FeatureInfo: {}, + FeatureMultiCacheExport: {}, + FeatureMultiPlatform: {}, + FeatureOCIExporter: {}, + FeatureOCILayout: {}, + FeatureProvenance: {}, + FeatureSBOM: {}, + FeatureSecurityMode: {}, + FeatureSourceDateEpoch: {}, + FeatureCNINetwork: {}, } func CheckFeatureCompat(t *testing.T, sb Sandbox, reason ...string) { @@ -322,7 +341,15 @@ func CheckFeatureCompat(t *testing.T, sb Sandbox, reason ...string) { var ereasons []string for _, r := range reason { if _, ok := features[r]; ok { - if b.isUnsupportedFeature(r) { + envFeatureName := "BUILDKIT_TEST_FEATURE_" + strings.ToUpper(r) + if v := os.Getenv(envFeatureName); v != "" { + if envFeatureEnabled, err := strconv.ParseBool(v); err != nil { + sb.ClearLogs() + t.Fatalf("failed to parse %s", envFeatureName) + } else if !envFeatureEnabled { + ereasons = append(ereasons, r) + } + } else if b.isUnsupportedFeature(r) { ereasons = append(ereasons, r) } } else {