From fe257a52faeb3850303d4f0ccaccec7720dfbee5 Mon Sep 17 00:00:00 2001 From: Anthony Nandaa Date: Sun, 10 Dec 2023 21:16:59 -0800 Subject: [PATCH] tests: enable integration test run on windows The plan is to enable to skip all the failing tests on windows so as to have the CI running on WS2022; and then we will go fixing each tests and enabling them in separate PRs. This is the baseline. This will be a helpful approach as we bring parity between windows and unix. Signed-off-by: Anthony Nandaa --- .github/workflows/test-os.yml | 30 +++++- client/build_test.go | 1 + client/client_test.go | 57 +++++++++-- cmd/buildctl/build_test.go | 4 + cmd/buildctl/buildctl_test.go | 1 + cmd/buildctl/diskusage_test.go | 1 + cmd/buildctl/prune_test.go | 1 + .../dockerfile/dockerfile_addchecksum_test.go | 1 + frontend/dockerfile/dockerfile_addgit_test.go | 1 + .../dockerfile/dockerfile_heredoc_test.go | 9 ++ frontend/dockerfile/dockerfile_mount_test.go | 13 +++ .../dockerfile/dockerfile_outline_test.go | 3 + .../dockerfile/dockerfile_provenance_test.go | 12 +++ .../dockerfile/dockerfile_runnetwork_test.go | 1 + .../dockerfile/dockerfile_secrets_test.go | 2 + frontend/dockerfile/dockerfile_ssh_test.go | 2 + .../dockerfile/dockerfile_targets_test.go | 2 + frontend/dockerfile/dockerfile_test.go | 98 +++++++++++++++++++ frontend/dockerfile/errors_test.go | 1 + frontend/frontend_test.go | 6 +- solver/jobs_test.go | 1 + util/testutil/integration/run.go | 7 ++ util/testutil/workers/oci.go | 23 +---- util/testutil/workers/oci_unix.go | 31 ++++++ util/testutil/workers/oci_windows.go | 7 ++ 25 files changed, 286 insertions(+), 29 deletions(-) create mode 100644 util/testutil/workers/oci_unix.go create mode 100644 util/testutil/workers/oci_windows.go diff --git a/.github/workflows/test-os.yml b/.github/workflows/test-os.yml index 1df513ac549bf..4737c87cbe233 100644 --- a/.github/workflows/test-os.yml +++ b/.github/workflows/test-os.yml @@ -20,7 +20,7 @@ on: env: GO_VERSION: "1.21" - TESTFLAGS: "-v --parallel=6 --timeout=30m" + TESTFLAGS: "-v --parallel=6 --timeout=60m" GOTESTSUM_VERSION: "v1.9.0" # same as one in Dockerfile GOTESTSUM_FORMAT: "standard-verbose" DESTDIR: "./bin" @@ -48,11 +48,37 @@ jobs: name: Install gotestsum run: | go install gotest.tools/gotestsum@${{ env.GOTESTSUM_VERSION }} + - + name: Install buildkitd.exe binary + run: | + go install .\cmd\buildkitd + - + name: Install containerd.exe binary + run: | + mkdir -p .\bin\installs -f + cd .\bin\installs + git clone https://github.com/containerd/containerd.git + cd containerd + $goModFileContent = Get-Content go.mod -Raw + $pattern = '(?<=github\.com/containerd/containerd v)[\d\.]+' + $version = [regex]::Match($goModFileContent, $pattern).Value + git checkout tags/v$version + go install .\cmd\... + cd ..\..\.. + - + name: Install registry.exe (distribution/distribution) binary + run: | + mkdir -p .\bin\installs -f + cd .\bin\installs + git clone https://github.com/distribution/distribution.git + cd distribution + go install .\cmd\... + cd ..\..\.. - name: Test env: TMPDIR: ${{ runner.temp }} - SKIP_INTEGRATION_TESTS: 1 + # SKIP_INTEGRATION_TESTS: 1 run: | mkdir -p ./bin/testreports gotestsum \ diff --git a/client/build_test.go b/client/build_test.go index 9bd77ce25bb56..daed799031439 100644 --- a/client/build_test.go +++ b/client/build_test.go @@ -2254,6 +2254,7 @@ func testClientGatewayNilResult(t *testing.T, sb integration.Sandbox) { } func testClientGatewayEmptyImageExec(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureDirectPush) c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) diff --git a/client/client_test.go b/client/client_test.go index 6b5f38a7b82c3..7951bd709765e 100644 --- a/client/client_test.go +++ b/client/client_test.go @@ -246,14 +246,16 @@ func testIntegration(t *testing.T, funcs ...func(t *testing.T, sb integration.Sa }), ) - integration.Run(t, integration.TestFuncs( - testBridgeNetworkingDNSNoRootless, - ), - mirrors, - integration.WithMatrix("netmode", map[string]interface{}{ - "dns": bridgeDNSNetwork, - }), - ) + if runtime.GOOS != "windows" { + integration.Run( + t, + integration.TestFuncs(testBridgeNetworkingDNSNoRootless), + mirrors, + integration.WithMatrix("netmode", map[string]interface{}{ + "dns": bridgeDNSNetwork, + }), + ) + } } func newContainerd(cdAddress string) (*containerd.Client, error) { @@ -262,6 +264,7 @@ func newContainerd(cdAddress string) (*containerd.Client, error) { // moby/buildkit#1336 func testCacheExportCacheKeyLoop(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureCacheExport, workers.FeatureCacheBackendLocal) c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) @@ -327,6 +330,7 @@ func testBridgeNetworking(t *testing.T, sb integration.Sandbox) { } func testBridgeNetworkingDNSNoRootless(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureCNINetwork) if os.Getenv("BUILDKIT_RUN_NETWORK_INTEGRATION_TESTS") == "" { t.SkipNow() @@ -396,6 +400,7 @@ func testHostNetworking(t *testing.T, sb integration.Sandbox) { } func testExportedImageLabels(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) defer c.Close() @@ -525,6 +530,7 @@ func testExportedImageLabels(t *testing.T, sb integration.Sandbox) { // #877 func testExportBusyboxLocal(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) defer c.Close() @@ -554,6 +560,7 @@ func testExportBusyboxLocal(t *testing.T, sb integration.Sandbox) { } func testHostnameLookup(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") if sb.Rootless() { t.SkipNow() } @@ -573,6 +580,7 @@ func testHostnameLookup(t *testing.T, sb integration.Sandbox) { // moby/buildkit#1301 func testHostnameSpecifying(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") if sb.Rootless() { t.SkipNow() } @@ -597,6 +605,7 @@ func testHostnameSpecifying(t *testing.T, sb integration.Sandbox) { // moby/buildkit#614 func testStdinClosed(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) defer c.Close() @@ -611,6 +620,7 @@ func testStdinClosed(t *testing.T, sb integration.Sandbox) { } func testSSHMount(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) defer c.Close() @@ -770,6 +780,7 @@ func testSSHMount(t *testing.T, sb integration.Sandbox) { } func testExtraHosts(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) defer c.Close() @@ -785,6 +796,7 @@ func testExtraHosts(t *testing.T, sb integration.Sandbox) { } func testShmSize(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) defer c.Close() @@ -816,6 +828,7 @@ func testShmSize(t *testing.T, sb integration.Sandbox) { } func testUlimit(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) defer c.Close() @@ -924,6 +937,7 @@ func testCgroupParent(t *testing.T, sb integration.Sandbox) { } func testNetworkMode(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) defer c.Close() @@ -997,6 +1011,7 @@ func testPushByDigest(t *testing.T, sb integration.Sandbox) { } func testSecurityMode(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureSecurityMode) command := `sh -c 'cat /proc/self/status | grep CapEff | cut -f 2 > /out'` mode := llb.SecurityModeSandbox @@ -1068,6 +1083,7 @@ func testSecurityMode(t *testing.T, sb integration.Sandbox) { } func testSecurityModeSysfs(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureSecurityMode) if sb.Rootless() { t.SkipNow() @@ -1114,6 +1130,7 @@ func testSecurityModeSysfs(t *testing.T, sb integration.Sandbox) { } func testSecurityModeErrors(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) defer c.Close() @@ -1294,6 +1311,7 @@ func testFrontendImageNaming(t *testing.T, sb integration.Sandbox) { } func testSecretMounts(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) defer c.Close() @@ -1367,6 +1385,7 @@ func testSecretMounts(t *testing.T, sb integration.Sandbox) { } func testSecretEnv(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) defer c.Close() @@ -2293,6 +2312,7 @@ func testBuildExportScratch(t *testing.T, sb integration.Sandbox) { } func testBuildHTTPSource(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) defer c.Close() @@ -3084,6 +3104,7 @@ func testSourceDateEpochTarExporter(t *testing.T, sb integration.Sandbox) { } func testSourceDateEpochImageExporter(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") cdAddress := sb.ContainerdAddress() if cdAddress == "" { t.SkipNow() @@ -3369,6 +3390,7 @@ func testTarExporterSymlink(t *testing.T, sb integration.Sandbox) { } func testBuildExportWithForeignLayer(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureImageExporter) c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) @@ -3667,6 +3689,7 @@ func testBuildExportWithUncompressed(t *testing.T, sb integration.Sandbox) { } func testBuildExportZstd(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureOCIExporter) c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) @@ -3763,6 +3786,7 @@ func testBuildExportZstd(t *testing.T, sb integration.Sandbox) { } func testPullZstdImage(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureDirectPush) for _, ociMediaTypes := range []bool{true, false} { ociMediaTypes := ociMediaTypes @@ -4708,6 +4732,7 @@ func testLazyImagePush(t *testing.T, sb integration.Sandbox) { } func testZstdLocalCacheExport(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureCacheExport, workers.FeatureCacheBackendLocal) c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) @@ -4767,6 +4792,7 @@ func testZstdLocalCacheExport(t *testing.T, sb integration.Sandbox) { } func testCacheExportIgnoreError(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureCacheExport) c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) @@ -5153,6 +5179,7 @@ func testBasicLocalCacheImportExport(t *testing.T, sb integration.Sandbox) { } func testBasicS3CacheImportExport(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureCacheExport, workers.FeatureCacheImport, @@ -5195,6 +5222,7 @@ func testBasicS3CacheImportExport(t *testing.T, sb integration.Sandbox) { } func testBasicAzblobCacheImportExport(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureCacheExport, workers.FeatureCacheImport, @@ -5563,6 +5591,7 @@ func testMultipleRecordsWithSameLayersCacheImportExport(t *testing.T, sb integra // moby/buildkit#3809 func testSnapshotWithMultipleBlobs(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureOCIExporter) c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) @@ -5704,6 +5733,7 @@ func testSnapshotWithMultipleBlobs(t *testing.T, sb integration.Sandbox) { } func testExportLocalNoPlatformSplit(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureOCIExporter, workers.FeatureMultiPlatform) c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) @@ -6262,6 +6292,7 @@ func testWhiteoutParentDir(t *testing.T, sb integration.Sandbox) { // #2490 func testMoveParentDir(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureOCIExporter) c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) @@ -6329,6 +6360,7 @@ func testMoveParentDir(t *testing.T, sb integration.Sandbox) { // #296 func testSchema1Image(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) defer c.Close() @@ -6346,6 +6378,7 @@ func testSchema1Image(t *testing.T, sb integration.Sandbox) { // #319 func testMountWithNoSource(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) defer c.Close() @@ -6375,6 +6408,7 @@ func testMountWithNoSource(t *testing.T, sb integration.Sandbox) { // #324 func testReadonlyRootFS(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) defer c.Close() @@ -6522,6 +6556,7 @@ func testSourceMapFromRef(t *testing.T, sb integration.Sandbox) { } func testRmSymlink(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) defer c.Close() @@ -6555,6 +6590,7 @@ func testRmSymlink(t *testing.T, sb integration.Sandbox) { } func testProxyEnv(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) defer c.Close() @@ -7407,6 +7443,7 @@ func testInvalidExporter(t *testing.T, sb integration.Sandbox) { // moby/buildkit#492 func testParallelLocalBuilds(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") ctx, cancel := context.WithCancelCause(sb.Context()) defer cancel(errors.WithStack(context.Canceled)) @@ -9229,6 +9266,7 @@ func testSBOMSupplements(t *testing.T, sb integration.Sandbox) { } func testMultipleCacheExports(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureMultiCacheExport) c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) @@ -9346,6 +9384,7 @@ func testMultipleCacheExports(t *testing.T, sb integration.Sandbox) { } func testMountStubsDirectory(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) defer c.Close() @@ -9405,6 +9444,7 @@ func testMountStubsDirectory(t *testing.T, sb integration.Sandbox) { // https://github.com/moby/buildkit/issues/3148 func testMountStubsTimestamp(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) defer c.Close() @@ -9811,6 +9851,7 @@ func testSourcePolicy(t *testing.T, sb integration.Sandbox) { } func testLLBMountPerformance(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") c, err := New(sb.Context(), sb.Address()) require.NoError(t, err) defer c.Close() diff --git a/cmd/buildctl/build_test.go b/cmd/buildctl/build_test.go index 370ae8ecf9565..e71213e6b93c2 100644 --- a/cmd/buildctl/build_test.go +++ b/cmd/buildctl/build_test.go @@ -23,6 +23,7 @@ import ( ) func testBuildWithLocalFiles(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") dir := integration.Tmpdir( t, fstest.CreateFile("foo", []byte("bar"), 0600), @@ -45,6 +46,7 @@ func testBuildWithLocalFiles(t *testing.T, sb integration.Sandbox) { } func testBuildLocalExporter(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") st := llb.Image("busybox"). Run(llb.Shlex("sh -c 'echo -n bar > /out/foo'")) @@ -67,6 +69,7 @@ func testBuildLocalExporter(t *testing.T, sb integration.Sandbox) { } func testBuildContainerdExporter(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") cdAddress := sb.ContainerdAddress() if cdAddress == "" { t.Skip("test is only for containerd worker") @@ -110,6 +113,7 @@ func testBuildContainerdExporter(t *testing.T, sb integration.Sandbox) { } func testBuildMetadataFile(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") st := llb.Image("busybox"). Run(llb.Shlex("sh -c 'echo -n bar > /foo'")) diff --git a/cmd/buildctl/buildctl_test.go b/cmd/buildctl/buildctl_test.go index 96dc154dfe577..3be348b42f431 100644 --- a/cmd/buildctl/buildctl_test.go +++ b/cmd/buildctl/buildctl_test.go @@ -31,6 +31,7 @@ func TestCLIIntegration(t *testing.T) { } func testUsage(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") require.NoError(t, sb.Cmd().Run()) require.NoError(t, sb.Cmd("--help").Run()) diff --git a/cmd/buildctl/diskusage_test.go b/cmd/buildctl/diskusage_test.go index 68f845919d672..528799ac790bd 100644 --- a/cmd/buildctl/diskusage_test.go +++ b/cmd/buildctl/diskusage_test.go @@ -8,6 +8,7 @@ import ( ) func testDiskUsage(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") cmd := sb.Cmd("du") err := cmd.Run() assert.NoError(t, err) diff --git a/cmd/buildctl/prune_test.go b/cmd/buildctl/prune_test.go index 6476506701817..fd6e1cd1847bb 100644 --- a/cmd/buildctl/prune_test.go +++ b/cmd/buildctl/prune_test.go @@ -8,6 +8,7 @@ import ( ) func testPrune(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") cmd := sb.Cmd("prune") err := cmd.Run() assert.NoError(t, err) diff --git a/frontend/dockerfile/dockerfile_addchecksum_test.go b/frontend/dockerfile/dockerfile_addchecksum_test.go index eb659d7768adc..cc1d0c912993c 100644 --- a/frontend/dockerfile/dockerfile_addchecksum_test.go +++ b/frontend/dockerfile/dockerfile_addchecksum_test.go @@ -23,6 +23,7 @@ func init() { } func testAddChecksum(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) f.RequiresBuildctl(t) diff --git a/frontend/dockerfile/dockerfile_addgit_test.go b/frontend/dockerfile/dockerfile_addgit_test.go index a4d863cbbdce8..d77228ffcdf2f 100644 --- a/frontend/dockerfile/dockerfile_addgit_test.go +++ b/frontend/dockerfile/dockerfile_addgit_test.go @@ -25,6 +25,7 @@ func init() { } func testAddGit(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) gitDir, err := os.MkdirTemp("", "buildkit") diff --git a/frontend/dockerfile/dockerfile_heredoc_test.go b/frontend/dockerfile/dockerfile_heredoc_test.go index 7d98679078ca2..081446ca7b4be 100644 --- a/frontend/dockerfile/dockerfile_heredoc_test.go +++ b/frontend/dockerfile/dockerfile_heredoc_test.go @@ -32,6 +32,7 @@ func init() { } func testCopyHeredoc(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -108,6 +109,7 @@ COPY --from=build /dest / } func testCopyHeredocSpecialSymbols(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -193,6 +195,7 @@ EOF } func testRunBasicHeredoc(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -238,6 +241,7 @@ COPY --from=build /dest /dest } func testRunFakeHeredoc(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -285,6 +289,7 @@ COPY --from=build /dest /dest } func testRunShebangHeredoc(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -333,6 +338,7 @@ COPY --from=build /dest /dest } func testRunComplexHeredoc(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -404,6 +410,7 @@ COPY --from=build /dest / } func testHeredocIndent(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -497,6 +504,7 @@ COPY --from=build /dest / } func testHeredocVarSubstitution(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -593,6 +601,7 @@ COPY --from=build /dest / } func testOnBuildHeredoc(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureDirectPush) f := getFrontend(t, sb) diff --git a/frontend/dockerfile/dockerfile_mount_test.go b/frontend/dockerfile/dockerfile_mount_test.go index 1d48312b28050..eec360c618c0e 100644 --- a/frontend/dockerfile/dockerfile_mount_test.go +++ b/frontend/dockerfile/dockerfile_mount_test.go @@ -34,6 +34,7 @@ func init() { } func testMountContext(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -61,6 +62,7 @@ RUN --mount=target=/context [ "$(cat /context/testfile)" == "contents0" ] } func testMountTmpfs(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -88,6 +90,7 @@ RUN [ ! -f /mytmp/foo ] } func testMountInvalid(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -156,6 +159,7 @@ RUN --mont=target=/mytmp,type=tmpfs /bin/true } func testMountRWCache(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -228,6 +232,7 @@ COPY --from=second /unique /unique } func testCacheMountUser(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -254,6 +259,7 @@ RUN --mount=type=cache,target=/mycache,uid=1001,gid=1002,mode=0751 [ "$(stat -c } func testCacheMountDefaultID(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -282,6 +288,7 @@ RUN --mount=type=cache,target=/mycache [ -f /mycache/foo ] } func testMountEnvVar(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -310,6 +317,7 @@ RUN --mount=type=cache,target=$SOME_PATH [ -f $SOME_PATH/foo ] } func testMountArg(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -338,6 +346,7 @@ RUN --mount=type=cache,target=/mycache2 [ -f /mycache2/foo ] } func testMountEnvAcrossStages(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -371,6 +380,7 @@ RUN --mount=type=$MNT_TYPE2,id=$MNT_ID,target=/whatever [ -f /whatever/foo ] } func testMountMetaArg(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -401,6 +411,7 @@ RUN --mount=type=cache,id=mycache,target=$META_PATH [ -f /tmp/meta/foo ] } func testMountFromError(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -432,6 +443,7 @@ RUN --mount=from=$ttt,type=cache,target=/tmp ls } func testMountTmpfsSize(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -473,6 +485,7 @@ COPY --from=base /tmpfssize / // moby/buildkit#4123 func testMountDuplicate(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` diff --git a/frontend/dockerfile/dockerfile_outline_test.go b/frontend/dockerfile/dockerfile_outline_test.go index 117b16016c319..a7bcd21910a40 100644 --- a/frontend/dockerfile/dockerfile_outline_test.go +++ b/frontend/dockerfile/dockerfile_outline_test.go @@ -25,6 +25,7 @@ var outlineTests = integration.TestFuncs( ) func testOutlineArgs(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureFrontendOutline) f := getFrontend(t, sb) if _, ok := f.(*clientFrontend); !ok { @@ -138,6 +139,7 @@ FROM second } func testOutlineSecrets(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureFrontendOutline) f := getFrontend(t, sb) if _, ok := f.(*clientFrontend); !ok { @@ -237,6 +239,7 @@ FROM second } func testOutlineDescribeDefinition(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureFrontendOutline) f := getFrontend(t, sb) if _, ok := f.(*clientFrontend); !ok { diff --git a/frontend/dockerfile/dockerfile_provenance_test.go b/frontend/dockerfile/dockerfile_provenance_test.go index 167f8d3f1a272..9684ce0a46997 100644 --- a/frontend/dockerfile/dockerfile_provenance_test.go +++ b/frontend/dockerfile/dockerfile_provenance_test.go @@ -41,6 +41,7 @@ import ( ) func testProvenanceAttestation(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureDirectPush, workers.FeatureProvenance) ctx := sb.Context() @@ -231,6 +232,7 @@ RUN echo "ok" > /foo } func testGitProvenanceAttestation(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureDirectPush, workers.FeatureProvenance) ctx := sb.Context() @@ -378,6 +380,7 @@ COPY myapp.Dockerfile / } func testMultiPlatformProvenance(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureDirectPush, workers.FeatureMultiPlatform, workers.FeatureProvenance) ctx := sb.Context() @@ -493,6 +496,7 @@ RUN echo "ok-$TARGETARCH" > /foo } func testClientFrontendProvenance(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureDirectPush, workers.FeatureProvenance) // Building with client frontend does not capture frontend provenance // because frontend runs in client, not in BuildKit. @@ -687,6 +691,7 @@ func testClientFrontendProvenance(t *testing.T, sb integration.Sandbox) { } func testClientLLBProvenance(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureDirectPush, workers.FeatureProvenance) ctx := sb.Context() @@ -801,6 +806,7 @@ func testClientLLBProvenance(t *testing.T, sb integration.Sandbox) { } func testSecretSSHProvenance(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureDirectPush, workers.FeatureProvenance) ctx := sb.Context() @@ -878,6 +884,7 @@ RUN --mount=type=secret,id=mysecret --mount=type=secret,id=othersecret --mount=t } func testOCILayoutProvenance(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureProvenance) ctx := sb.Context() @@ -1011,6 +1018,7 @@ EOF } func testNilProvenance(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureProvenance) ctx := sb.Context() @@ -1048,6 +1056,7 @@ ENV FOO=bar // https://github.com/moby/buildkit/issues/3562 func testDuplicatePlatformProvenance(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureProvenance) ctx := sb.Context() @@ -1078,6 +1087,7 @@ func testDuplicatePlatformProvenance(t *testing.T, sb integration.Sandbox) { // https://github.com/moby/buildkit/issues/3928 func testDockerIgnoreMissingProvenance(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureProvenance) c, err := client.New(sb.Context(), sb.Address()) require.NoError(t, err) @@ -1120,6 +1130,7 @@ func testDockerIgnoreMissingProvenance(t *testing.T, sb integration.Sandbox) { } func testFrontendDeduplicateSources(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") ctx := sb.Context() c, err := client.New(ctx, sb.Address()) @@ -1270,6 +1281,7 @@ COPY bar bar2 } func testDuplicateLayersProvenance(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureDirectPush, workers.FeatureProvenance) ctx := sb.Context() diff --git a/frontend/dockerfile/dockerfile_runnetwork_test.go b/frontend/dockerfile/dockerfile_runnetwork_test.go index 4786cb4ce97bb..6b404db745fb6 100644 --- a/frontend/dockerfile/dockerfile_runnetwork_test.go +++ b/frontend/dockerfile/dockerfile_runnetwork_test.go @@ -151,6 +151,7 @@ RUN --network=host nc 127.0.0.1 %s | grep foo } func testRunGlobalNetwork(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) s, err := echoserver.NewTestServer("foo") diff --git a/frontend/dockerfile/dockerfile_secrets_test.go b/frontend/dockerfile/dockerfile_secrets_test.go index 3c5f33de84b18..705642ea41ec6 100644 --- a/frontend/dockerfile/dockerfile_secrets_test.go +++ b/frontend/dockerfile/dockerfile_secrets_test.go @@ -22,6 +22,7 @@ func init() { } func testSecretFileParams(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -52,6 +53,7 @@ RUN [ ! -f /mysecret ] # check no stub left behind } func testSecretRequiredWithoutValue(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` diff --git a/frontend/dockerfile/dockerfile_ssh_test.go b/frontend/dockerfile/dockerfile_ssh_test.go index 2dbc165eadb54..1a5bb4fe501ad 100644 --- a/frontend/dockerfile/dockerfile_ssh_test.go +++ b/frontend/dockerfile/dockerfile_ssh_test.go @@ -31,6 +31,7 @@ func init() { } func testSSHSocketParams(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -78,6 +79,7 @@ RUN --mount=type=ssh,mode=741,uid=100,gid=102 [ "$(stat -c "%u %g %f" $SSH_AUTH_ } func testSSHFileDescriptorsClosed(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` diff --git a/frontend/dockerfile/dockerfile_targets_test.go b/frontend/dockerfile/dockerfile_targets_test.go index 8e7310d48dfe0..9390fbe01b638 100644 --- a/frontend/dockerfile/dockerfile_targets_test.go +++ b/frontend/dockerfile/dockerfile_targets_test.go @@ -24,6 +24,7 @@ var targetsTests = integration.TestFuncs( ) func testTargetsList(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureFrontendTargets) f := getFrontend(t, sb) if _, ok := f.(*clientFrontend); !ok { @@ -123,6 +124,7 @@ FROM second AS binary } func testTargetsDescribeDefinition(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureFrontendTargets) f := getFrontend(t, sb) if _, ok := f.(*clientFrontend); !ok { diff --git a/frontend/dockerfile/dockerfile_test.go b/frontend/dockerfile/dockerfile_test.go index b95ab7dd3c14d..1ed794e10a8f4 100644 --- a/frontend/dockerfile/dockerfile_test.go +++ b/frontend/dockerfile/dockerfile_test.go @@ -249,6 +249,7 @@ func TestIntegration(t *testing.T) { } func testDefaultEnvWithArgs(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -313,6 +314,7 @@ echo -n $my_arg $* > /out } func testEnvEmptyFormatting(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -348,6 +350,7 @@ RUN [ "$myenv" = 'foo%sbar' ] } func testDockerignoreOverride(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` FROM busybox @@ -404,6 +407,7 @@ foo } func testEmptyDestDir(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -433,6 +437,7 @@ RUN [ "$(cat testfile)" == "contents0" ] } func testExportCacheLoop(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureCacheExport, workers.FeatureCacheImport, workers.FeatureCacheBackendLocal) f := getFrontend(t, sb) @@ -510,6 +515,7 @@ COPY --from=base2 /foo /f } func testTarExporter(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -587,6 +593,7 @@ FROM stage-$TARGETOS } func testWorkdirCreatesDir(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -626,6 +633,7 @@ WORKDIR / } func testCacheReleased(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -661,6 +669,7 @@ FROM busybox } func testSymlinkedDockerfile(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -688,6 +697,7 @@ ENV foo bar } func testCopyChownExistingDir(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -781,6 +791,7 @@ RUN e="300:400"; p="/file" ; a=` + "`" + `stat -c "%u:%g } func testCopyWildcardCache(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -871,6 +882,7 @@ COPY --from=base unique / } func testEmptyWildcard(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -910,6 +922,7 @@ COPY foo nomatch* / } func testWorkdirUser(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -939,6 +952,7 @@ RUN [ "$(stat -c "%U %G" /mydir)" == "user user" ] } func testWorkdirCopyIgnoreRelative(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -969,6 +983,7 @@ COPY --from=base Dockerfile . } func testWorkdirExists(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -998,6 +1013,7 @@ RUN [ "$(stat -c "%U %G" /mydir)" == "user user" ] } func testCopyChownCreateDest(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -1034,6 +1050,7 @@ RUN [ "$(stat -c "%U %G" /dest01)" == "user01 user" ] } func testCopyThroughSymlinkContext(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -1075,6 +1092,7 @@ COPY link/foo . } func testCopyThroughSymlinkMultiStage(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -1116,6 +1134,7 @@ COPY --from=build /sub2/foo bar } func testCopySocket(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -1156,6 +1175,7 @@ COPY . / } func testIgnoreEntrypoint(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -1183,6 +1203,7 @@ RUN ["ls"] } func testQuotedMetaArgs(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -1227,6 +1248,7 @@ COPY --from=build /out . } func testMultiArgs(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -1270,6 +1292,7 @@ COPY --from=build /out . } func testDefaultShellAndPath(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureOCIExporter) f := getFrontend(t, sb) @@ -1357,6 +1380,7 @@ COPY Dockerfile . } func testExportMultiPlatform(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureOCIExporter, workers.FeatureMultiPlatform) f := getFrontend(t, sb) @@ -1493,6 +1517,7 @@ COPY arch-$TARGETARCH whoami // tonistiigi/fsutil#46 func testContextChangeDirToFile(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -1546,6 +1571,7 @@ COPY foo / } func testNoSnapshotLeak(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -1590,6 +1616,7 @@ COPY foo / // #1197 func testCopyFollowAllSymlinks(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -1620,6 +1647,7 @@ COPY foo/sub bar } func testCopySymlinks(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -1680,6 +1708,7 @@ COPY sub/l* alllinks/ } func testHTTPDockerfile(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -1730,6 +1759,7 @@ COPY --from=0 /foo /foo } func testCmdShell(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) cdAddress := sb.ContainerdAddress() @@ -1820,6 +1850,7 @@ ENTRYPOINT my entrypoint } func testPullScratch(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) cdAddress := sb.ContainerdAddress() @@ -1944,6 +1975,7 @@ COPY foo . } func testGlobalArg(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -1973,6 +2005,7 @@ FROM busybox:${tag} } func testDockerfileDirs(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) f.RequiresBuildctl(t) @@ -2038,6 +2071,7 @@ func testDockerfileDirs(t *testing.T, sb integration.Sandbox) { } func testDockerfileInvalidCommand(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) f.RequiresBuildctl(t) dockerfile := []byte(` @@ -2063,6 +2097,7 @@ func testDockerfileInvalidCommand(t *testing.T, sb integration.Sandbox) { } func testDockerfileInvalidInstruction(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) f.RequiresBuildctl(t) dockerfile := []byte(` @@ -2092,6 +2127,7 @@ func testDockerfileInvalidInstruction(t *testing.T, sb integration.Sandbox) { } func testDockerfileADDFromURL(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) f.RequiresBuildctl(t) @@ -2168,6 +2204,7 @@ ADD %s /dest/ } func testDockerfileAddArchive(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) f.RequiresBuildctl(t) @@ -2322,6 +2359,7 @@ ADD %s /newname.tar.gz } func testDockerfileAddArchiveWildcard(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) buf := bytes.NewBuffer(nil) @@ -2396,6 +2434,7 @@ ADD *.tar /dest } func testDockerfileAddChownExpand(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -2429,6 +2468,7 @@ RUN [ "$(stat -c "%u %G" /foo)" == "1000 nobody" ] } func testSymlinkDestination(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) f.RequiresBuildctl(t) @@ -2472,6 +2512,7 @@ COPY foo /symlink/ } func testDockerfileScratchConfig(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") cdAddress := sb.ContainerdAddress() if cdAddress == "" { t.Skip("test requires containerd worker") @@ -2538,6 +2579,7 @@ ENV foo=bar } func testExposeExpansion(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureImageExporter) f := getFrontend(t, sb) @@ -2613,6 +2655,7 @@ EXPOSE 5000 } func testDockerignore(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -2683,6 +2726,7 @@ Dockerfile } func testDockerignoreInvalid(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -2721,6 +2765,7 @@ COPY . . // moby/moby#10858 func testDockerfileLowercase(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(`FROM scratch @@ -2747,6 +2792,7 @@ func testDockerfileLowercase(t *testing.T, sb integration.Sandbox) { } func testExportedHistory(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) f.RequiresBuildctl(t) @@ -2826,6 +2872,7 @@ RUN ["ls"] } func testUser(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureImageExporter) f := getFrontend(t, sb) @@ -2970,6 +3017,7 @@ USER nobody // testUserAdditionalGids ensures that that the primary GID is also included in the additional GID list. // CVE-2023-25173: https://github.com/advisories/GHSA-hmfx-3pcx-653p func testUserAdditionalGids(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -3004,6 +3052,9 @@ RUN [ "$(id)" = "uid=1(daemon) gid=1(daemon) groups=1(daemon)" ] } func testCopyChown(t *testing.T, sb integration.Sandbox) { + // This test should work on Windows, but requires a proper image, and we will need + // to check SIDs instead of UIDs. + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -3066,6 +3117,7 @@ COPY --from=base /out / } func testCopyChmod(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -3125,6 +3177,7 @@ COPY --from=base /out / } func testCopyOverrideFiles(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -3177,6 +3230,7 @@ COPY files dest } func testCopyVarSubstitution(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -3217,6 +3271,7 @@ COPY $FOO baz } func testCopyWildcards(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -3305,6 +3360,7 @@ COPY sub/dir1 subdest6 } func testCopyRelative(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -3351,6 +3407,7 @@ RUN sh -c "[ $(cat /test5/foo) = 'hello' ]" } func testAddURLChmod(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) f.RequiresBuildctl(t) @@ -3407,6 +3464,7 @@ COPY --from=build /dest /dest } func testDockerfileFromGit(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) gitDir := t.TempDir() @@ -3501,6 +3559,7 @@ COPY --from=build foo bar2 } func testDockerfileFromHTTP(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) buf := bytes.NewBuffer(nil) @@ -3562,6 +3621,7 @@ COPY foo bar } func testMultiStageImplicitFrom(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -3634,6 +3694,7 @@ COPY --from=golang /usr/bin/go go } func testMultiStageCaseInsensitive(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -3679,6 +3740,7 @@ COPY --from=stage1 baz bax } func testLabels(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureImageExporter) f := getFrontend(t, sb) @@ -3750,6 +3812,7 @@ LABEL foo=bar // #2008 func testWildcardRenameCache(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -3789,6 +3852,7 @@ RUN ls /files/file1 } func testOnBuildCleared(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureDirectPush) f := getFrontend(t, sb) @@ -3891,6 +3955,7 @@ ONBUILD RUN mkdir -p /out && echo -n 11 >> /out/foo } func testCacheMultiPlatformImportExport(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureDirectPush, workers.FeatureCacheExport, @@ -4018,6 +4083,7 @@ COPY --from=base arch / } func testImageManifestCacheImportExport(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureCacheExport, workers.FeatureCacheBackendLocal) f := getFrontend(t, sb) @@ -4120,6 +4186,7 @@ COPY --from=base unique / require.Equal(t, string(dt), string(dt2)) } func testCacheImportExport(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureCacheExport, workers.FeatureCacheBackendLocal) f := getFrontend(t, sb) @@ -4211,6 +4278,7 @@ COPY --from=base unique / } func testReproducibleIDs(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureImageExporter) f := getFrontend(t, sb) @@ -4276,6 +4344,7 @@ RUN echo bar > bar } func testImportExportReproducibleIDs(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") cdAddress := sb.ContainerdAddress() if cdAddress == "" { t.Skip("test requires containerd worker") @@ -4362,6 +4431,7 @@ RUN echo bar > bar } func testNoCache(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -4443,6 +4513,7 @@ COPY --from=s1 unique2 / } func testPlatformArgsImplicit(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(fmt.Sprintf(` @@ -4491,6 +4562,7 @@ COPY foo2 bar2 } func testPlatformArgsExplicit(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -4543,6 +4615,7 @@ COPY --from=build out . } func testBuiltinArgs(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -4647,6 +4720,7 @@ COPY --from=build /out / } func testTarContext(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` @@ -4696,6 +4770,7 @@ COPY foo / } func testTarContextExternalDockerfile(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) foo := []byte("contents") @@ -4758,6 +4833,7 @@ COPY foo bar } func testFrontendUseForwardedSolveResults(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") c, err := client.New(sb.Context(), sb.Address()) require.NoError(t, err) defer c.Close() @@ -4826,6 +4902,7 @@ COPY foo foo2 } func testFrontendInputs(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) c, err := client.New(sb.Context(), sb.Address()) @@ -4886,6 +4963,7 @@ COPY foo foo2 } func testFrontendSubrequests(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) if _, ok := f.(*clientFrontend); !ok { t.Skip("only test with client frontend") @@ -4965,6 +5043,7 @@ COPY Dockerfile Dockerfile // moby/buildkit#1301 func testDockefileCheckHostname(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` FROM busybox @@ -5022,6 +5101,7 @@ RUN echo $(hostname) | grep foo } func testShmSize(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` FROM busybox AS base @@ -5064,6 +5144,7 @@ COPY --from=base /shmsize / } func testUlimit(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) dockerfile := []byte(` FROM busybox AS base @@ -5106,6 +5187,7 @@ COPY --from=base /ulimit / } func testCgroupParent(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") if sb.Rootless() { t.SkipNow() } @@ -5174,6 +5256,7 @@ COPY --from=base /out / } func testNamedImageContext(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") ctx := sb.Context() c, err := client.New(ctx, sb.Address()) @@ -5307,6 +5390,7 @@ COPY --from=base /env_foobar / } func testNamedImageContextPlatform(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureDirectPush) ctx := sb.Context() @@ -5379,6 +5463,7 @@ RUN echo hello } func testNamedImageContextTimestamps(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureDirectPush) ctx := sb.Context() @@ -5464,6 +5549,7 @@ RUN echo foo >> /test } func testNamedImageContextScratch(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") ctx := sb.Context() c, err := client.New(ctx, sb.Address()) @@ -5514,6 +5600,7 @@ EOF } func testNamedLocalContext(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") ctx := sb.Context() c, err := client.New(ctx, sb.Address()) @@ -5573,6 +5660,7 @@ COPY --from=base /o* / } func testNamedOCILayoutContext(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureOCIExporter, workers.FeatureOCILayout) // how this test works: // 1- we use a regular builder with a dockerfile to create an image two files: "out" with content "first", "out2" with content "second" @@ -5709,6 +5797,7 @@ COPY --from=imported /test/outfoo / } func testNamedOCILayoutContextExport(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureOCIExporter, workers.FeatureOCILayout) ctx := sb.Context() @@ -5819,6 +5908,7 @@ FROM nonexistent AS base } func testNamedInputContext(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") ctx := sb.Context() c, err := client.New(ctx, sb.Address()) @@ -5926,6 +6016,7 @@ COPY --from=build /foo /out / } func testNamedMultiplatformInputContext(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureMultiPlatform) ctx := sb.Context() @@ -6072,6 +6163,7 @@ COPY --from=build /foo /out / } func testNamedFilteredContext(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") ctx := sb.Context() c, err := client.New(ctx, sb.Address()) @@ -6180,6 +6272,7 @@ EOF } func testSourceDateEpochWithoutExporter(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureOCIExporter, workers.FeatureSourceDateEpoch) f := getFrontend(t, sb) @@ -6254,6 +6347,7 @@ COPY Dockerfile . } func testSBOMScannerImage(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureDirectPush, workers.FeatureSBOM) ctx := sb.Context() @@ -6358,6 +6452,7 @@ EOF } func testSBOMScannerArgs(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureDirectPush, workers.FeatureSBOM) ctx := sb.Context() @@ -6586,6 +6681,7 @@ ARG BUILDKIT_SBOM_SCAN_STAGE=true // #3495 func testMultiPlatformWarnings(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) // empty line in here is intentional to cause line continuation warning @@ -6659,6 +6755,7 @@ COPY Dockerfile \ } func testReproSourceDateEpoch(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") workers.CheckFeatureCompat(t, sb, workers.FeatureOCIExporter, workers.FeatureSourceDateEpoch) if sb.Snapshotter() == "native" { t.Skip("the digest is not reproducible with the \"native\" snapshotter because hardlinks are processed in a different way: https://github.com/moby/buildkit/pull/3456#discussion_r1062650263") @@ -6795,6 +6892,7 @@ func testNilContextInSolveGateway(t *testing.T, sb integration.Sandbox) { } func testCopyUnicodePath(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) c, err := client.New(sb.Context(), sb.Address()) require.NoError(t, err) diff --git a/frontend/dockerfile/errors_test.go b/frontend/dockerfile/errors_test.go index d954dbf5681e8..26680466d0310 100644 --- a/frontend/dockerfile/errors_test.go +++ b/frontend/dockerfile/errors_test.go @@ -13,6 +13,7 @@ import ( ) func testErrorsSourceMap(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") f := getFrontend(t, sb) tcases := []struct { diff --git a/frontend/frontend_test.go b/frontend/frontend_test.go index 25b82e74fecac..3218b56eab1e8 100644 --- a/frontend/frontend_test.go +++ b/frontend/frontend_test.go @@ -60,6 +60,7 @@ func testReturnNil(t *testing.T, sb integration.Sandbox) { } func testRefReadFile(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") ctx := sb.Context() c, err := client.New(ctx, sb.Address()) @@ -124,6 +125,7 @@ func testRefReadFile(t *testing.T, sb integration.Sandbox) { } func testRefReadDir(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") ctx := sb.Context() c, err := client.New(ctx, sb.Address()) @@ -148,7 +150,7 @@ func testRefReadDir(t *testing.T, sb integration.Sandbox) { require.True(t, ok) stat.ModTime = 0 // this will inevitably differ, we clear it during the tests below too stat.Path = filepath.Base(stat.Path) // we are only testing reading a single directory here - expMap[path] = stat + expMap[filepath.ToSlash(path)] = stat return nil }) @@ -239,6 +241,7 @@ func testRefReadDir(t *testing.T, sb integration.Sandbox) { } func testRefStatFile(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") ctx := sb.Context() c, err := client.New(ctx, sb.Address()) @@ -291,6 +294,7 @@ func testRefStatFile(t *testing.T, sb integration.Sandbox) { } func testRefEvaluate(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") ctx := sb.Context() c, err := client.New(ctx, sb.Address()) diff --git a/solver/jobs_test.go b/solver/jobs_test.go index c8898ab6e6567..35b84bb69fa11 100644 --- a/solver/jobs_test.go +++ b/solver/jobs_test.go @@ -31,6 +31,7 @@ func TestJobsIntegration(t *testing.T) { } func testParallelism(t *testing.T, sb integration.Sandbox) { + integration.SkipOnPlatform(t, "windows") ctx := sb.Context() c, err := client.New(ctx, sb.Address()) diff --git a/util/testutil/integration/run.go b/util/testutil/integration/run.go index 8850e2aa2ea7a..d817d1bffacc7 100644 --- a/util/testutil/integration/run.go +++ b/util/testutil/integration/run.go @@ -423,3 +423,10 @@ func prepareValueMatrix(tc testConf) []matrixValue { } return m } + +// Skips tests on Windows +func SkipOnPlatform(t *testing.T, goos string) { + if runtime.GOOS == goos { + t.Skipf("Skipped on %s", goos) + } +} diff --git a/util/testutil/workers/oci.go b/util/testutil/workers/oci.go index 54280f24e001e..da23ea516b638 100644 --- a/util/testutil/workers/oci.go +++ b/util/testutil/workers/oci.go @@ -4,31 +4,18 @@ import ( "context" "fmt" "log" - "os" "runtime" - "github.com/moby/buildkit/util/bklog" "github.com/moby/buildkit/util/testutil/integration" "github.com/pkg/errors" ) +// InitOCIWorker registers an integration test worker, which enables the --oci-worker +// flag in the test buildkitd instance and disables the --containerd-worker flag. This +// integration test worker is not supported on Windows. func InitOCIWorker() { - integration.Register(&OCI{ID: "oci"}) - - // the rootless uid is defined in Dockerfile - if s := os.Getenv("BUILDKIT_INTEGRATION_ROOTLESS_IDPAIR"); s != "" { - var uid, gid int - if _, err := fmt.Sscanf(s, "%d:%d", &uid, &gid); err != nil { - bklog.L.Fatalf("unexpected BUILDKIT_INTEGRATION_ROOTLESS_IDPAIR: %q", s) - } - if integration.RootlessSupported(uid) { - integration.Register(&OCI{ID: "oci-rootless", UID: uid, GID: gid}) - } - } - - if s := os.Getenv("BUILDKIT_INTEGRATION_SNAPSHOTTER"); s != "" { - integration.Register(&OCI{ID: "oci-snapshotter-" + s, Snapshotter: s}) - } + // calling platform specific + initOCIWorker() } type OCI struct { diff --git a/util/testutil/workers/oci_unix.go b/util/testutil/workers/oci_unix.go new file mode 100644 index 0000000000000..73b5f0340a4d1 --- /dev/null +++ b/util/testutil/workers/oci_unix.go @@ -0,0 +1,31 @@ +//go:build !windows +// +build !windows + +package workers + +import ( + "fmt" + "os" + + "github.com/moby/buildkit/util/bklog" + "github.com/moby/buildkit/util/testutil/integration" +) + +func initOCIWorker() { + integration.Register(&OCI{ID: "oci"}) + + // the rootless uid is defined in Dockerfile + if s := os.Getenv("BUILDKIT_INTEGRATION_ROOTLESS_IDPAIR"); s != "" { + var uid, gid int + if _, err := fmt.Sscanf(s, "%d:%d", &uid, &gid); err != nil { + bklog.L.Fatalf("unexpected BUILDKIT_INTEGRATION_ROOTLESS_IDPAIR: %q", s) + } + if integration.RootlessSupported(uid) { + integration.Register(&OCI{ID: "oci-rootless", UID: uid, GID: gid}) + } + } + + if s := os.Getenv("BUILDKIT_INTEGRATION_SNAPSHOTTER"); s != "" { + integration.Register(&OCI{ID: "oci-snapshotter-" + s, Snapshotter: s}) + } +} diff --git a/util/testutil/workers/oci_windows.go b/util/testutil/workers/oci_windows.go new file mode 100644 index 0000000000000..b97fd8fa0877e --- /dev/null +++ b/util/testutil/workers/oci_windows.go @@ -0,0 +1,7 @@ +package workers + +import "github.com/moby/buildkit/util/bklog" + +func initOCIWorker() { + bklog.L.Info("OCI Worker not supported on Windows.") +}