github.com/devdivbcp/moby@v17.12.0-ce-rc1.0.20200726071732-2d4bfdc789ad+incompatible/integration/build/build_session_test.go (about) 1 package build 2 3 import ( 4 "context" 5 "io/ioutil" 6 "net" 7 "net/http" 8 "strings" 9 "testing" 10 11 "github.com/docker/docker/api/types" 12 "github.com/docker/docker/api/types/versions" 13 dclient "github.com/docker/docker/client" 14 "github.com/docker/docker/internal/test/fakecontext" 15 "github.com/docker/docker/internal/test/request" 16 "github.com/moby/buildkit/session" 17 "github.com/moby/buildkit/session/filesync" 18 "golang.org/x/sync/errgroup" 19 "gotest.tools/assert" 20 is "gotest.tools/assert/cmp" 21 "gotest.tools/skip" 22 ) 23 24 func TestBuildWithSession(t *testing.T) { 25 skip.If(t, testEnv.DaemonInfo.OSType == "windows") 26 skip.If(t, versions.LessThan(testEnv.DaemonAPIVersion(), "1.39"), "experimental in older versions") 27 28 client := testEnv.APIClient() 29 30 dockerfile := ` 31 FROM busybox 32 COPY file / 33 RUN cat /file 34 ` 35 36 fctx := fakecontext.New(t, "", 37 fakecontext.WithFile("file", "some content"), 38 ) 39 defer fctx.Close() 40 41 out := testBuildWithSession(t, client, client.DaemonHost(), fctx.Dir, dockerfile) 42 assert.Check(t, is.Contains(out, "some content")) 43 44 fctx.Add("second", "contentcontent") 45 46 dockerfile += ` 47 COPY second / 48 RUN cat /second 49 ` 50 51 out = testBuildWithSession(t, client, client.DaemonHost(), fctx.Dir, dockerfile) 52 assert.Check(t, is.Equal(strings.Count(out, "Using cache"), 2)) 53 assert.Check(t, is.Contains(out, "contentcontent")) 54 55 du, err := client.DiskUsage(context.TODO()) 56 assert.Check(t, err) 57 assert.Check(t, du.BuilderSize > 10) 58 59 out = testBuildWithSession(t, client, client.DaemonHost(), fctx.Dir, dockerfile) 60 assert.Check(t, is.Equal(strings.Count(out, "Using cache"), 4)) 61 62 du2, err := client.DiskUsage(context.TODO()) 63 assert.Check(t, err) 64 assert.Check(t, is.Equal(du.BuilderSize, du2.BuilderSize)) 65 66 // rebuild with regular tar, confirm cache still applies 67 fctx.Add("Dockerfile", dockerfile) 68 // FIXME(vdemeester) use sock here 69 res, body, err := request.Do( 70 "/build", 71 request.Host(client.DaemonHost()), 72 request.Method(http.MethodPost), 73 request.RawContent(fctx.AsTarReader(t)), 74 request.ContentType("application/x-tar")) 75 assert.NilError(t, err) 76 assert.Check(t, is.DeepEqual(http.StatusOK, res.StatusCode)) 77 78 outBytes, err := request.ReadBody(body) 79 assert.NilError(t, err) 80 assert.Check(t, is.Contains(string(outBytes), "Successfully built")) 81 assert.Check(t, is.Equal(strings.Count(string(outBytes), "Using cache"), 4)) 82 83 _, err = client.BuildCachePrune(context.TODO(), types.BuildCachePruneOptions{All: true}) 84 assert.Check(t, err) 85 86 du, err = client.DiskUsage(context.TODO()) 87 assert.Check(t, err) 88 assert.Check(t, is.Equal(du.BuilderSize, int64(0))) 89 } 90 91 func testBuildWithSession(t *testing.T, client dclient.APIClient, daemonHost string, dir, dockerfile string) (outStr string) { 92 ctx := context.Background() 93 sess, err := session.NewSession(ctx, "foo1", "foo") 94 assert.Check(t, err) 95 96 fsProvider := filesync.NewFSSyncProvider([]filesync.SyncedDir{ 97 {Dir: dir}, 98 }) 99 sess.Allow(fsProvider) 100 101 g, ctx := errgroup.WithContext(ctx) 102 103 g.Go(func() error { 104 return sess.Run(ctx, func(ctx context.Context, proto string, meta map[string][]string) (net.Conn, error) { 105 return client.DialHijack(ctx, "/session", "h2c", meta) 106 }) 107 }) 108 109 g.Go(func() error { 110 // FIXME use sock here 111 res, body, err := request.Do( 112 "/build?remote=client-session&session="+sess.ID(), 113 request.Host(daemonHost), 114 request.Method(http.MethodPost), 115 request.With(func(req *http.Request) error { 116 req.Body = ioutil.NopCloser(strings.NewReader(dockerfile)) 117 return nil 118 }), 119 ) 120 if err != nil { 121 return err 122 } 123 assert.Check(t, is.DeepEqual(res.StatusCode, http.StatusOK)) 124 out, err := request.ReadBody(body) 125 assert.NilError(t, err) 126 assert.Check(t, is.Contains(string(out), "Successfully built")) 127 sess.Close() 128 outStr = string(out) 129 return nil 130 }) 131 132 err = g.Wait() 133 assert.Check(t, err) 134 return 135 }