Skip to content

Commit

Permalink
Make buildkitd up poll instead of racing.
Browse files Browse the repository at this point in the history
  • Loading branch information
ColinChartier committed Jul 12, 2019
1 parent a42d7e8 commit 9775d87
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 12 deletions.
14 changes: 5 additions & 9 deletions build/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
"time"
)

//Builder uses buildkit to build a list of service directories
type Builder struct {
Registry string
RegistryInsecure bool
Expand Down Expand Up @@ -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)
Expand All @@ -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())
Expand Down Expand Up @@ -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
}
Expand Down
49 changes: 46 additions & 3 deletions build/buildkitd.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"bytes"
"fmt"
"github.com/distributed-containers-inc/sanic/bridge/docker"
"github.com/moby/buildkit/client/llb"
"os/exec"
"time"
)
Expand All @@ -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)
Expand All @@ -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",
Expand All @@ -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()
}

0 comments on commit 9775d87

Please sign in to comment.