99 "net"
1010 "os"
1111 "path/filepath"
12+ "runtime"
1213 "slices"
1314 "strconv"
1415 "strings"
@@ -41,6 +42,7 @@ import (
4142 llberrdefs "github.com/moby/buildkit/solver/llbsolver/errdefs"
4243 opspb "github.com/moby/buildkit/solver/pb"
4344 "github.com/moby/buildkit/util/apicaps"
45+ "github.com/moby/buildkit/util/appdefaults"
4446 "github.com/moby/buildkit/util/bklog"
4547 "github.com/moby/buildkit/util/grpcerrors"
4648 "github.com/moby/buildkit/util/stack"
@@ -495,13 +497,17 @@ func newBridgeForwarder(ctx context.Context, llbBridge frontend.FrontendLLBBridg
495497 sm : sm ,
496498 ctrs : map [string ]gwclient.Container {},
497499 executor : exec ,
500+ id : identity .NewID (),
498501 }
499502 return lbf
500503}
501504
502505func serveLLBBridgeForwarder (ctx context.Context , llbBridge frontend.FrontendLLBBridge , exec executor.Executor , workers worker.Infos , inputs map [string ]* opspb.Definition , sid string , sm * session.Manager ) (* llbBridgeForwarder , context.Context ) {
506+ var listener net.Listener
507+ isWindowsPlatform := runtime .GOOS == "windows"
503508 ctx , cancel := context .WithCancelCause (ctx )
504509 lbf := newBridgeForwarder (ctx , llbBridge , exec , workers , inputs , sid , sm )
510+
505511 serverOpt := []grpc.ServerOption {
506512 grpc .UnaryInterceptor (grpcerrors .UnaryServerInterceptor ),
507513 grpc .StreamInterceptor (grpcerrors .StreamServerInterceptor ),
@@ -513,11 +519,20 @@ func serveLLBBridgeForwarder(ctx context.Context, llbBridge frontend.FrontendLLB
513519 pb .RegisterLLBBridgeServer (server , lbf )
514520
515521 go func () {
522+ if isWindowsPlatform {
523+ listener = createNPipeListener (llbBridge .GetFrontendID ())
524+ if err := handleWindowsPipeConn (ctx , listener , lbf , cancel ); err != nil {
525+ return
526+ }
527+ }
516528 serve (ctx , server , lbf .conn )
517529 select {
518530 case <- ctx .Done ():
519531 default :
520532 lbf .isErrServerClosed = true
533+ if isWindowsPlatform && listener != nil {
534+ _ = listener .Close ()
535+ }
521536 }
522537 cancel (errors .WithStack (context .Canceled ))
523538 }()
@@ -609,6 +624,7 @@ type llbBridgeForwarder struct {
609624 * pipe
610625 ctrs map [string ]gwclient.Container
611626 ctrsMu sync.Mutex
627+ id string
612628}
613629
614630func (lbf * llbBridgeForwarder ) ResolveSourceMeta (ctx context.Context , req * pb.ResolveSourceMetaRequest ) (* pb.ResolveSourceMetaResponse , error ) {
@@ -766,6 +782,10 @@ func (lbf *llbBridgeForwarder) Solve(ctx context.Context, req *pb.SolveRequest)
766782 }
767783 }
768784
785+ if runtime .GOOS == "windows" {
786+ ctx = context .WithValue (ctx , appdefaults .ContextKeyCustomFrontend , true )
787+ }
788+
769789 ctx = tracing .ContextWithSpanFromContext (ctx , lbf .callCtx )
770790 res , err := lbf .llbBridge .Solve (ctx , frontend.SolveRequest {
771791 Evaluate : req .Evaluate ,
0 commit comments