Skip to content

Commit

Permalink
configure docker client for remote builds just-in-time
Browse files Browse the repository at this point in the history
  • Loading branch information
jeromegn committed Feb 1, 2021
1 parent 7332bca commit d74c263
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 17 deletions.
9 changes: 7 additions & 2 deletions cmd/deploy.go
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,8 @@ func runDeploy(cmdCtx *cmdctx.CmdContext) error {
return err
}

needsCleaning := false

if imageRef != "" {
// image specified, resolve it, tagging and pushing if docker+local
cmdCtx.Statusf("deploy", cmdctx.SINFO, "Deploying image: %s\n", imageRef)
Expand All @@ -141,6 +143,7 @@ func runDeploy(cmdCtx *cmdctx.CmdContext) error {
}
}
} else {
needsCleaning = true
// no image specified, build one
buildArgs := map[string]string{}

Expand Down Expand Up @@ -211,7 +214,7 @@ func runDeploy(cmdCtx *cmdctx.CmdContext) error {
cmdCtx.Statusf("deploy", cmdctx.SINFO, "Image size: %s\n", humanize.Bytes(uint64(image.Size)))

cmdCtx.Status("deploy", cmdctx.SBEGIN, "Pushing Image")
err := buildOp.PushImage(*image)
err := buildOp.PushImage(cmdCtx, *image)
if err != nil {
return err
}
Expand Down Expand Up @@ -239,7 +242,9 @@ func runDeploy(cmdCtx *cmdctx.CmdContext) error {
return err
}

buildOp.CleanDeploymentTags()
if needsCleaning {
buildOp.CleanDeploymentTags(cmdCtx)
}

cmdCtx.Statusf("deploy", cmdctx.SINFO, "Release v%d created\n", release.Version)

Expand Down
67 changes: 52 additions & 15 deletions docker/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"os"
"path"
"strings"
"sync"
"time"

"github.com/dustin/go-humanize"
Expand Down Expand Up @@ -42,6 +43,8 @@ type BuildOperation struct {
ctx context.Context
apiClient *api.Client
dockerClient *DockerClient
dockerConfigured bool
dockerMutex sync.Mutex
localDockerAvailable bool
out io.Writer
appName string
Expand Down Expand Up @@ -80,26 +83,39 @@ func NewBuildOperation(ctx context.Context, cmdCtx *cmdctx.CmdContext) (*BuildOp

if err := op.dockerClient.Check(ctx); err == nil {
op.localDockerAvailable = true
if localOnly {
return nil, fmt.Errorf("Local docker unavailable and --local-only was passed, cannot proceed.")
}
} else {
terminal.Debugf("Error pinging local docker: %s\n", err)
}

if remoteOnly {
return op, nil
}

func (op *BuildOperation) configureDocker(cmdCtx *cmdctx.CmdContext) error {
op.dockerMutex.Lock()
defer op.dockerMutex.Unlock()

if op.dockerConfigured {
return nil
}

if op.remoteOnly {
terminal.Info("Remote only, hooking you up with a remote Docker builder...")
if err := setRemoteBuilder(ctx, cmdCtx, dockerClient); err != nil {
return nil, err
}
} else if err := op.dockerClient.Check(ctx); err != nil {
if localOnly {
return nil, fmt.Errorf("Local docker unavailable and --local-only was passed, cannot proceed.")
if err := setRemoteBuilder(op.ctx, cmdCtx, op.dockerClient); err != nil {
return err
}
} else if !op.localDockerAvailable {
terminal.Info("Local docker unavailable, hooking you up with a remote Docker builder...")
if err := setRemoteBuilder(ctx, cmdCtx, dockerClient); err != nil {
return nil, err
if err := setRemoteBuilder(op.ctx, cmdCtx, op.dockerClient); err != nil {
return err
}
}

return op, nil
op.dockerConfigured = true

return nil
}

func (op *BuildOperation) LocalDockerAvailable() bool {
Expand All @@ -121,6 +137,11 @@ func (op *BuildOperation) ResolveImageLocally(ctx context.Context, cmdCtx *cmdct
return nil, nil
}

// probably not needed, but still good
if err := op.configureDocker(cmdCtx); err != nil {
return nil, err
}

imgSummary, err := op.dockerClient.findImage(ctx, imageRef)
if err != nil {
return nil, err
Expand All @@ -147,7 +168,7 @@ func (op *BuildOperation) ResolveImageLocally(ctx context.Context, cmdCtx *cmdct
Tag: op.imageTag,
}

err = op.PushImage(*image)
err = op.PushImage(cmdCtx, *image)

if err != nil {
return nil, err
Expand All @@ -156,20 +177,28 @@ func (op *BuildOperation) ResolveImageLocally(ctx context.Context, cmdCtx *cmdct
return image, nil
}

func (op *BuildOperation) pushImage(imageTag string) error {
func (op *BuildOperation) pushImage(cmdCtx *cmdctx.CmdContext, imageTag string) error {

if imageTag == "" {
return errors.New("invalid image reference")
}

// ensure docker is configured
if err := op.configureDocker(cmdCtx); err != nil {
return err
}

if err := op.dockerClient.PushImage(op.ctx, imageTag, op.out); err != nil {
return err
}

return nil
}

func (op *BuildOperation) CleanDeploymentTags() {
func (op *BuildOperation) CleanDeploymentTags(cmdCtx *cmdctx.CmdContext) {
if err := op.configureDocker(cmdCtx); err != nil {
terminal.Warnf("could not clean up deployment tags: %v\n", err)
}
err := op.dockerClient.DeleteDeploymentImages(op.ctx, op.imageTag)
if err != nil {
terminal.Debugf("Error cleaning deployment tags: %s", err)
Expand Down Expand Up @@ -256,6 +285,10 @@ func (op *BuildOperation) BuildWithDocker(cmdCtx *cmdctx.CmdContext, dockerfileP

normalizedBuildArgs := normalizeBuildArgs(appConfig, buildArgs)

if err := op.configureDocker(cmdCtx); err != nil {
return nil, err
}

img, err := op.dockerClient.BuildImage(op.ctx, archive.File, op.imageTag, normalizedBuildArgs, op.out)

if err != nil {
Expand Down Expand Up @@ -288,6 +321,10 @@ func (op *BuildOperation) BuildWithPack(cmdCtx *cmdctx.CmdContext, buildArgs map
return nil, ErrNoBuildpackBuilder
}

if err := op.configureDocker(cmdCtx); err != nil {
return nil, err
}

c := op.initPackClient()

env := map[string]string{}
Expand Down Expand Up @@ -332,8 +369,8 @@ func (op *BuildOperation) BuildWithPack(cmdCtx *cmdctx.CmdContext, buildArgs map
}

// PushImage - Push the Image (where?)
func (op *BuildOperation) PushImage(image Image) error {
return op.pushImage(image.Tag)
func (op *BuildOperation) PushImage(cmdCtx *cmdctx.CmdContext, image Image) error {
return op.pushImage(cmdCtx, image.Tag)
}

// ResolveDockerfile - Resolve the location of the dockerfile, allowing for upper and lowercase naming
Expand Down

0 comments on commit d74c263

Please sign in to comment.