From 9775d8747acb9da7adc9b3df50989da0ce5ff375 Mon Sep 17 00:00:00 2001 From: Colin Chartier Date: Fri, 12 Jul 2019 19:52:24 -0400 Subject: [PATCH] Make buildkitd up poll instead of racing. --- build/builder.go | 14 +++++-------- build/buildkitd.go | 49 +++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 51 insertions(+), 12 deletions(-) diff --git a/build/builder.go b/build/builder.go index bab2ab3..c27f9d0 100644 --- a/build/builder.go +++ b/build/builder.go @@ -15,6 +15,7 @@ import ( "time" ) +//Builder uses buildkit to build a list of service directories type Builder struct { Registry string RegistryInsecure bool @@ -63,6 +64,7 @@ func (builder *Builder) buildkitSolveOpts(serviceDir, fullImageName string, writ return solveOpt } +//BuildService builds a specific sevice directory with a specific context func (builder *Builder) BuildService(ctx context.Context, serviceDir string) error { serviceName := filepath.Base(serviceDir) fullImageName := fmt.Sprintf("%s:%s", serviceName, builder.BuildTag) @@ -74,18 +76,12 @@ func (builder *Builder) BuildService(ctx context.Context, serviceDir string) err var resultR *io.PipeReader var resultW *io.PipeWriter - var err error if !builder.DoPush { resultR, resultW = io.Pipe() } buildOpts := builder.buildkitSolveOpts(serviceDir, fullImageName, resultW) - if err != nil { - builder.Interface.FailJob(serviceName, err) - builder.Logger.Log(serviceName, time.Now(), "Could not configure pushing / saving for image! ", err.Error()) - return err - } - err = util.RunContextuallyInParallel( + err := util.RunContextuallyInParallel( ctx, func(ctx context.Context) error { buildkitClient, err := client.New(ctx, BuildkitDaemonAddr, client.WithFailFast()) @@ -113,10 +109,10 @@ func (builder *Builder) BuildService(ctx context.Context, serviceDir string) err if !builder.DoPush { cmd := exec.Command("docker", "load") cmd.Stdin = resultR - if err = cmd.Start(); err != nil { + if err := cmd.Start(); err != nil { return err } - err = util.WaitCmdContextually(ctx, cmd) + err := util.WaitCmdContextually(ctx, cmd) resultR.CloseWithError(err) return err } diff --git a/build/buildkitd.go b/build/buildkitd.go index fcffcf6..9f278a8 100644 --- a/build/buildkitd.go +++ b/build/buildkitd.go @@ -4,6 +4,7 @@ import ( "bytes" "fmt" "github.com/distributed-containers-inc/sanic/bridge/docker" + "github.com/moby/buildkit/client/llb" "os/exec" "time" ) @@ -14,6 +15,48 @@ const BuildkitDaemonContainerName = "sanic-buildkitd" //BuildkitDaemonAddr is the address on the host at which the buildkit server will be listening const BuildkitDaemonAddr = "tcp://127.0.0.1:31652" +func waitBuildkitRunning() error { + var dummyImageData bytes.Buffer + dt, err := llb.Image("docker.io/library/alpine:latest@sha256:1072e499f3f655a032e88542330cf75b02e7bdf673278f701d7ba61629ee3ebe").Marshal(llb.LinuxAmd64) + if err != nil { + return err + } + err = llb.WriteTo(dt, &dummyImageData) + fmt.Printf("Data is: %d\n", len(dummyImageData.String())) + if err != nil { + return err + } + timer := time.NewTicker(time.Millisecond * 100) + defer timer.Stop() + + done := false + go func() { + time.Sleep(time.Second * 5) + done = true + }() + + for range timer.C { + cmd := exec.Command( + "docker", + "exec", + "-i", + BuildkitDaemonContainerName, + "buildctl", + "--addr", BuildkitDaemonAddr, + "build", + ) + cmd.Stdin = &dummyImageData + err = cmd.Run() + if err == nil { + return nil + } + if done { + break + } + } + return fmt.Errorf("buildkit daemon never came up") +} + //EnsureBuildkitDaemon makes sure that the buildkit docker container named "sanic-buildkitd" is running func EnsureBuildkitDaemon() error { running, err := containers.CheckRunning(BuildkitDaemonContainerName) @@ -23,11 +66,12 @@ func EnsureBuildkitDaemon() error { if running { return nil } + fmt.Println("The build daemon is not running yet. Starting it...") containers.ForceRemove(BuildkitDaemonContainerName) //ignore error intentionally stderr := &bytes.Buffer{} cmd := exec.Command("docker", "run", "-d", - "--name", "sanic-buildkitd", + "--name", BuildkitDaemonContainerName, "--restart", "always", "--privileged", "--network", "host", @@ -39,6 +83,5 @@ func EnsureBuildkitDaemon() error { if err != nil { return fmt.Errorf("could not start the builder docker image locally: %s\n%s", err.Error(), stderr.String()) } - time.Sleep(500 * time.Millisecond) //TODO HACK should poll for it to start instead of flat sleep - return nil + return waitBuildkitRunning() }