From acc51e83fdb732d69dced3d3a2104d2008f74682 Mon Sep 17 00:00:00 2001 From: Alex Suraci Date: Mon, 24 Feb 2014 17:02:57 -0800 Subject: [PATCH] inject docker client into Builder Signed-off-by: Abhijit Hiremagalur --- cmd/drone/drone.go | 3 ++- pkg/build/build.go | 47 +++++++++++++++++++------------------- pkg/build/docker/client.go | 2 ++ pkg/queue/worker.go | 3 ++- 4 files changed, 30 insertions(+), 25 deletions(-) diff --git a/cmd/drone/drone.go b/cmd/drone/drone.go index c12e3ef2..812db1f8 100644 --- a/cmd/drone/drone.go +++ b/cmd/drone/drone.go @@ -11,6 +11,7 @@ import ( "time" "github.com/drone/drone/pkg/build" + "github.com/drone/drone/pkg/build/docker" "github.com/drone/drone/pkg/build/log" "github.com/drone/drone/pkg/build/repo" "github.com/drone/drone/pkg/build/script" @@ -174,7 +175,7 @@ func run(path string) { // loop through and create builders for _, b := range builds { //script.Builds { - builder := build.New() + builder := build.New(docker.DefaultClient) builder.Build = b builder.Repo = &code builder.Key = key diff --git a/pkg/build/build.go b/pkg/build/build.go index ba8d3969..f5e73ecf 100644 --- a/pkg/build/build.go +++ b/pkg/build/build.go @@ -19,9 +19,6 @@ import ( "github.com/drone/drone/pkg/build/script" ) -// instance of the Docker client -var client = docker.New() - // BuildState stores information about a build // process including the Exit status and various // Runtime statistics (coming soon). @@ -35,8 +32,10 @@ type BuildState struct { // Max RAM, Max Swap, Disk space, and more. } -func New() *Builder { - return &Builder{} +func New(dockerClient *docker.Client) *Builder { + return &Builder{ + dockerClient: dockerClient, + } } // Builder represents a build process being prepared @@ -86,6 +85,8 @@ type Builder struct { // specified services and linked to // this build. services []*docker.Container + + dockerClient *docker.Client } func (b *Builder) Run() error { @@ -182,19 +183,19 @@ func (b *Builder) setup() error { log.Infof("starting service container %s", image.Tag) // Run the contianer - run, err := client.Containers.RunDaemonPorts(image.Tag, image.Ports...) + run, err := b.dockerClient.Containers.RunDaemonPorts(image.Tag, image.Ports...) if err != nil { return err } // Get the container info - info, err := client.Containers.Inspect(run.ID) + info, err := b.dockerClient.Containers.Inspect(run.ID) if err != nil { // on error kill the container since it hasn't yet been // added to the array and would therefore not get // removed in the defer statement. - client.Containers.Stop(run.ID, 10) - client.Containers.Remove(run.ID) + b.dockerClient.Containers.Stop(run.ID, 10) + b.dockerClient.Containers.Remove(run.ID) return err } @@ -224,16 +225,16 @@ func (b *Builder) setup() error { // check for build container (ie bradrydzewski/go:1.2) // and download if it doesn't already exist - if _, err := client.Images.Inspect(b.Build.Image); err == docker.ErrNotFound { + if _, err := b.dockerClient.Images.Inspect(b.Build.Image); err == docker.ErrNotFound { // download the image if it doesn't exist - if err := client.Images.Pull(b.Build.Image); err != nil { + if err := b.dockerClient.Images.Pull(b.Build.Image); err != nil { return err } } // create the Docker image id := createUID() - if err := client.Images.Build(id, dir); err != nil { + if err := b.dockerClient.Images.Build(id, dir); err != nil { return err } @@ -241,11 +242,11 @@ func (b *Builder) setup() error { log.Infof("copying repository to %s", b.Repo.Dir) // get the image details - b.image, err = client.Images.Inspect(id) + b.image, err = b.dockerClient.Images.Inspect(id) if err != nil { // if we have problems with the image make sure // we remove it before we exit - client.Images.Remove(id) + b.dockerClient.Images.Remove(id) return err } @@ -264,10 +265,10 @@ func (b *Builder) teardown() error { log.Info("removing build container") // stop the container, ignore error message - client.Containers.Stop(b.container.ID, 15) + b.dockerClient.Containers.Stop(b.container.ID, 15) // remove the container, ignore error message - if err := client.Containers.Remove(b.container.ID); err != nil { + if err := b.dockerClient.Containers.Remove(b.container.ID); err != nil { log.Errf("failed to delete build container %s", b.container.ID) } } @@ -278,10 +279,10 @@ func (b *Builder) teardown() error { log.Infof("removing service container %s", b.Build.Services[i]) // stop the service container, ignore the error - client.Containers.Stop(container.ID, 15) + b.dockerClient.Containers.Stop(container.ID, 15) // remove the service container, ignore the error - if err := client.Containers.Remove(container.ID); err != nil { + if err := b.dockerClient.Containers.Remove(container.ID); err != nil { log.Errf("failed to delete service container %s", container.ID) } } @@ -291,7 +292,7 @@ func (b *Builder) teardown() error { // debugging log.Info("removing build image") - if _, err := client.Images.Remove(b.image.ID); err != nil { + if _, err := b.dockerClient.Images.Remove(b.image.ID); err != nil { log.Errf("failed to completely delete build image %s. %s", b.image.ID, err.Error()) } } @@ -326,7 +327,7 @@ func (b *Builder) run() error { } // create the container from the image - run, err := client.Containers.Create(&conf) + run, err := b.dockerClient.Containers.Create(&conf) if err != nil { return err } @@ -336,18 +337,18 @@ func (b *Builder) run() error { // attach to the container go func() { - client.Containers.Attach(run.ID, &writer{b.Stdout}) + b.dockerClient.Containers.Attach(run.ID, &writer{b.Stdout}) }() // start the container - if err := client.Containers.Start(run.ID, &host); err != nil { + if err := b.dockerClient.Containers.Start(run.ID, &host); err != nil { b.BuildState.ExitCode = 1 b.BuildState.Finished = time.Now().UTC().Unix() return err } // wait for the container to stop - wait, err := client.Containers.Wait(run.ID) + wait, err := b.dockerClient.Containers.Wait(run.ID) if err != nil { b.BuildState.ExitCode = 1 b.BuildState.Finished = time.Now().UTC().Unix() diff --git a/pkg/build/docker/client.go b/pkg/build/docker/client.go index bb33a28f..123e5246 100644 --- a/pkg/build/docker/client.go +++ b/pkg/build/docker/client.go @@ -29,6 +29,8 @@ const ( // Enables verbose logging to the Terminal window var Logging = true +var DefaultClient = New() // TEMPORARY; PLEASE CONSTRUCT/INJECT YOURSELF + // New creates an instance of the Docker Client func New() *Client { c := &Client{} diff --git a/pkg/queue/worker.go b/pkg/queue/worker.go index e2cf8f6d..cb27d6a8 100644 --- a/pkg/queue/worker.go +++ b/pkg/queue/worker.go @@ -4,6 +4,7 @@ import ( "bytes" "fmt" "github.com/drone/drone/pkg/build" + "github.com/drone/drone/pkg/build/docker" "github.com/drone/drone/pkg/build/git" r "github.com/drone/drone/pkg/build/repo" "github.com/drone/drone/pkg/channel" @@ -167,7 +168,7 @@ func (w *worker) execute(task *BuildTask) error { } func runBuild(b *BuildTask, buf io.Writer) (bool, error) { - builder := build.New() + builder := build.New(docker.DefaultClient) builder.Build = b.Script builder.Repo = &r.Repo{Path: b.Repo.URL, Branch: b.Commit.Branch, Commit: b.Commit.Hash, PR: b.Commit.PullRequest, Dir: filepath.Join("/var/cache/drone/src", b.Repo.Slug), Depth: git.GitDepth(b.Script.Git)} builder.Key = []byte(b.Repo.PrivateKey)