Skip to content

Commit 5498aab

Browse files
authored
feat: Use buildkit output writer (#39)
Signed-off-by: Ce Gao <[email protected]>
1 parent f3d69d1 commit 5498aab

File tree

9 files changed

+375
-8
lines changed

9 files changed

+375
-8
lines changed

build.MIDI

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
pip_package(name = [
22
"ormb",
33
"tensorflow",
4+
"jupyter"
45
])

cmd/midi/build.go

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@ package main
1717
import (
1818
"context"
1919
"io"
20+
"os"
2021

2122
"github.com/moby/buildkit/client"
23+
"github.com/moby/buildkit/util/progress/progresswriter"
2224
"github.com/pkg/errors"
2325
"github.com/sirupsen/logrus"
2426
cli "github.com/urfave/cli/v2"
@@ -77,11 +79,26 @@ func actionBuild(clicontext *cli.Context) error {
7779
ctx, cancel := context.WithCancel(clicontext.Context)
7880
defer cancel()
7981
eg, ctx := errgroup.WithContext(ctx)
80-
ch := make(chan *client.SolveStatus)
82+
// ch := make(chan *client.SolveStatus)
83+
84+
pw, err := progresswriter.NewPrinter(context.TODO(), os.Stderr, clicontext.String("progress"))
85+
if err != nil {
86+
return err
87+
}
88+
mw := progresswriter.NewMultiWriter(pw)
89+
90+
var writers []progresswriter.Writer
91+
w := mw.WithPrefix("", false)
92+
writers = append(writers, w)
8193

8294
// Create a pipe to load the image into the docker host.
8395
pipeR, pipeW := io.Pipe()
8496
eg.Go(func() error {
97+
defer func() {
98+
for _, w := range writers {
99+
close(w.Status())
100+
}
101+
}()
85102
defer pipeW.Close()
86103
_, err := bkClient.Solve(ctx, def, client.SolveOpt{
87104
Exports: []client.ExportEntry{
@@ -95,7 +112,7 @@ func actionBuild(clicontext *cli.Context) error {
95112
},
96113
},
97114
},
98-
}, ch)
115+
}, progresswriter.ResetTime(mw.WithPrefix("", false)).Status())
99116
if err != nil {
100117
err = errors.Wrap(err, "failed to solve LLB")
101118
logrus.Error(err)
@@ -107,8 +124,11 @@ func actionBuild(clicontext *cli.Context) error {
107124

108125
// Watch the progress.
109126
eg.Go(func() error {
110-
monitor := progress.NewMonitor()
111-
return monitor.Monitor(ctx, ch)
127+
// monitor := progress.NewMonitor()
128+
// return monitor.Monitor(ctx, ch)
129+
// not using shared context to not disrupt display but let is finish reporting errors
130+
<-pw.Done()
131+
return pw.Err()
112132
})
113133

114134
// Load the image to docker host.
@@ -144,5 +164,7 @@ func actionBuild(clicontext *cli.Context) error {
144164
return errors.Wrap(err, "failed to wait error group")
145165
}
146166
}
167+
monitor := progress.NewMonitor()
168+
monitor.Success()
147169
return nil
148170
}

go.mod

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ go 1.17
55
require (
66
github.com/creack/pty v1.1.18
77
github.com/docker/docker v20.10.7+incompatible
8+
github.com/fatih/color v1.13.0
89
github.com/gliderlabs/ssh v0.3.3
910
github.com/google/uuid v1.3.0
1011
github.com/moby/buildkit v0.10.1
12+
github.com/opencontainers/go-digest v1.0.0
1113
github.com/pkg/errors v0.9.1
1214
github.com/pkg/sftp v1.13.4
1315
github.com/sirupsen/logrus v1.8.1
@@ -21,6 +23,7 @@ require (
2123
github.com/Microsoft/go-winio v0.5.1 // indirect
2224
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect
2325
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e // indirect
26+
github.com/containerd/console v1.0.3 // indirect
2427
github.com/containerd/containerd v1.6.3-0.20220401172941-5ff8fce1fcc6 // indirect
2528
github.com/containerd/continuity v0.2.3-0.20220330195504-d132b287edc8 // indirect
2629
github.com/containerd/typeurl v1.0.2 // indirect
@@ -39,11 +42,15 @@ require (
3942
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect
4043
github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect
4144
github.com/kr/fs v0.1.0 // indirect
45+
github.com/mattn/go-colorable v0.1.9 // indirect
46+
github.com/mattn/go-isatty v0.0.14 // indirect
4247
github.com/moby/sys/signal v0.6.0 // indirect
43-
github.com/opencontainers/go-digest v1.0.0 // indirect
48+
github.com/morikuni/aec v1.0.0 // indirect
4449
github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 // indirect
4550
github.com/russross/blackfriday/v2 v2.1.0 // indirect
4651
github.com/tonistiigi/fsutil v0.0.0-20220115021204-b19f7f9cb274 // indirect
52+
github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea // indirect
53+
github.com/tonistiigi/vt100 v0.0.0-20210615222946-8066bb97264f // indirect
4754
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.29.0 // indirect
4855
go.opentelemetry.io/otel v1.4.1 // indirect
4956
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.4.1 // indirect
@@ -54,6 +61,7 @@ require (
5461
golang.org/x/net v0.0.0-20211216030914-fe4d6282115f // indirect
5562
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 // indirect
5663
golang.org/x/text v0.3.7 // indirect
64+
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect
5765
google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa // indirect
5866
google.golang.org/grpc v1.45.0 // indirect
5967
google.golang.org/protobuf v1.27.1 // indirect

go.sum

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWH
3737
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
3838
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
3939
github.com/containerd/cgroups v1.0.3 h1:ADZftAkglvCiD44c77s5YmMqaP2pzVCFZvBmAlBdAP4=
40+
github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw=
41+
github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U=
4042
github.com/containerd/containerd v1.6.3-0.20220401172941-5ff8fce1fcc6 h1:nig7zto6cp3Wt1lPMK8EmyP6f/ZNmn/tL6ASQ7stews=
4143
github.com/containerd/containerd v1.6.3-0.20220401172941-5ff8fce1fcc6/go.mod h1:WSt2SnDLAGWlu+Vl+EWay37seZLKqgRt6XLjIMy8SYM=
4244
github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM=
@@ -78,6 +80,8 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m
7880
github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
7981
github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
8082
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
83+
github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
84+
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
8185
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
8286
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
8387
github.com/gliderlabs/ssh v0.3.3 h1:mBQ8NiOgDkINJrZtoizkC3nDNYgSaWtxyem6S2XHBtA=
@@ -164,6 +168,11 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
164168
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
165169
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
166170
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
171+
github.com/mattn/go-colorable v0.1.9 h1:sqDoxXbdeALODt0DAeJCVp38ps9ZogZEAXjus69YV3U=
172+
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
173+
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
174+
github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
175+
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
167176
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
168177
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
169178
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
@@ -175,6 +184,7 @@ github.com/moby/sys/signal v0.6.0 h1:aDpY94H8VlhTGa9sNYUFCFsMZIUh5wm0B6XkIoJj/iY
175184
github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg=
176185
github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc=
177186
github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
187+
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
178188
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
179189
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
180190
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
@@ -226,6 +236,7 @@ github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/y
226236
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
227237
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
228238
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
239+
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
229240
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
230241
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
231242
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
@@ -234,6 +245,9 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1
234245
github.com/tonistiigi/fsutil v0.0.0-20220115021204-b19f7f9cb274 h1:wbyZxD6IPFp0sl5uscMOJRsz5UKGFiNiD16e+MVfKZY=
235246
github.com/tonistiigi/fsutil v0.0.0-20220115021204-b19f7f9cb274/go.mod h1:oPAfvw32vlUJSjyDcQ3Bu0nb2ON2B+G0dtVN/SZNJiA=
236247
github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea h1:SXhTLE6pb6eld/v/cCndK0AMpt1wiVFb/YYmqB3/QG0=
248+
github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk=
249+
github.com/tonistiigi/vt100 v0.0.0-20210615222946-8066bb97264f h1:DLpt6B5oaaS8jyXHa9VA4rrZloBVPVXeCtrOsrFauxc=
250+
github.com/tonistiigi/vt100 v0.0.0-20210615222946-8066bb97264f/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc=
237251
github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM=
238252
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
239253
github.com/urfave/cli/v2 v2.4.0 h1:m2pxjjDFgDxSPtO8WSdbndj17Wu2y8vOT86wE/tjr+I=
@@ -317,6 +331,8 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w
317331
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
318332
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
319333
golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
334+
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
335+
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
320336
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
321337
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
322338
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -327,6 +343,7 @@ golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7w
327343
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
328344
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
329345
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
346+
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
330347
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
331348
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0=
332349
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -339,6 +356,7 @@ golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
339356
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
340357
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
341358
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs=
359+
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
342360
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
343361
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
344362
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

main.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package main
2+
3+
import "github.com/tensorchord/MIDI/pkg/progress"
4+
5+
func main() {
6+
l := progress.Current(false)
7+
l.WithPrefix("😀 [MIDI]").Printf("?")
8+
}

pkg/progress/color.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// Copyright 2022 The MIDI Authors
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package progress
16+
17+
import "github.com/fatih/color"
18+
19+
var noColor = makeNoColor()
20+
var cachedColor = makeColor(color.FgHiGreen)
21+
var successColor = makeColor(color.FgHiGreen)
22+
23+
var availablePrefixColors = []*color.Color{
24+
makeColor(color.FgBlue),
25+
makeColor(color.FgMagenta),
26+
makeColor(color.FgCyan),
27+
makeColor(color.FgRed),
28+
makeColor(color.FgYellow),
29+
makeColor(color.FgGreen),
30+
makeColor(color.FgHiBlue),
31+
makeColor(color.FgHiMagenta),
32+
makeColor(color.FgHiCyan),
33+
makeColor(color.FgHiRed),
34+
makeColor(color.FgHiYellow),
35+
makeColor(color.FgHiWhite),
36+
}
37+
38+
func makeColor(att color.Attribute) *color.Color {
39+
c := color.New()
40+
c.Add(att)
41+
return c
42+
}
43+
44+
func makeNoColor() *color.Color {
45+
c := color.New()
46+
c.DisableColor()
47+
return c
48+
}

0 commit comments

Comments
 (0)