inject docker client into Builder

Signed-off-by: Abhijit Hiremagalur <abhi@pivotallabs.com>
This commit is contained in:
Alex Suraci 2014-02-24 17:02:57 -08:00 committed by Abhijit Hiremagalur
parent 12989b187c
commit acc51e83fd
4 changed files with 30 additions and 25 deletions

View file

@ -11,6 +11,7 @@ import (
"time" "time"
"github.com/drone/drone/pkg/build" "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/log"
"github.com/drone/drone/pkg/build/repo" "github.com/drone/drone/pkg/build/repo"
"github.com/drone/drone/pkg/build/script" "github.com/drone/drone/pkg/build/script"
@ -174,7 +175,7 @@ func run(path string) {
// loop through and create builders // loop through and create builders
for _, b := range builds { //script.Builds { for _, b := range builds { //script.Builds {
builder := build.New() builder := build.New(docker.DefaultClient)
builder.Build = b builder.Build = b
builder.Repo = &code builder.Repo = &code
builder.Key = key builder.Key = key

View file

@ -19,9 +19,6 @@ import (
"github.com/drone/drone/pkg/build/script" "github.com/drone/drone/pkg/build/script"
) )
// instance of the Docker client
var client = docker.New()
// BuildState stores information about a build // BuildState stores information about a build
// process including the Exit status and various // process including the Exit status and various
// Runtime statistics (coming soon). // Runtime statistics (coming soon).
@ -35,8 +32,10 @@ type BuildState struct {
// Max RAM, Max Swap, Disk space, and more. // Max RAM, Max Swap, Disk space, and more.
} }
func New() *Builder { func New(dockerClient *docker.Client) *Builder {
return &Builder{} return &Builder{
dockerClient: dockerClient,
}
} }
// Builder represents a build process being prepared // Builder represents a build process being prepared
@ -86,6 +85,8 @@ type Builder struct {
// specified services and linked to // specified services and linked to
// this build. // this build.
services []*docker.Container services []*docker.Container
dockerClient *docker.Client
} }
func (b *Builder) Run() error { func (b *Builder) Run() error {
@ -182,19 +183,19 @@ func (b *Builder) setup() error {
log.Infof("starting service container %s", image.Tag) log.Infof("starting service container %s", image.Tag)
// Run the contianer // 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 { if err != nil {
return err return err
} }
// Get the container info // Get the container info
info, err := client.Containers.Inspect(run.ID) info, err := b.dockerClient.Containers.Inspect(run.ID)
if err != nil { if err != nil {
// on error kill the container since it hasn't yet been // on error kill the container since it hasn't yet been
// added to the array and would therefore not get // added to the array and would therefore not get
// removed in the defer statement. // removed in the defer statement.
client.Containers.Stop(run.ID, 10) b.dockerClient.Containers.Stop(run.ID, 10)
client.Containers.Remove(run.ID) b.dockerClient.Containers.Remove(run.ID)
return err return err
} }
@ -224,16 +225,16 @@ func (b *Builder) setup() error {
// check for build container (ie bradrydzewski/go:1.2) // check for build container (ie bradrydzewski/go:1.2)
// and download if it doesn't already exist // 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 // 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 return err
} }
} }
// create the Docker image // create the Docker image
id := createUID() id := createUID()
if err := client.Images.Build(id, dir); err != nil { if err := b.dockerClient.Images.Build(id, dir); err != nil {
return err return err
} }
@ -241,11 +242,11 @@ func (b *Builder) setup() error {
log.Infof("copying repository to %s", b.Repo.Dir) log.Infof("copying repository to %s", b.Repo.Dir)
// get the image details // get the image details
b.image, err = client.Images.Inspect(id) b.image, err = b.dockerClient.Images.Inspect(id)
if err != nil { if err != nil {
// if we have problems with the image make sure // if we have problems with the image make sure
// we remove it before we exit // we remove it before we exit
client.Images.Remove(id) b.dockerClient.Images.Remove(id)
return err return err
} }
@ -264,10 +265,10 @@ func (b *Builder) teardown() error {
log.Info("removing build container") log.Info("removing build container")
// stop the container, ignore error message // 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 // 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) 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]) log.Infof("removing service container %s", b.Build.Services[i])
// stop the service container, ignore the error // 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 // 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) log.Errf("failed to delete service container %s", container.ID)
} }
} }
@ -291,7 +292,7 @@ func (b *Builder) teardown() error {
// debugging // debugging
log.Info("removing build image") 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()) 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 // create the container from the image
run, err := client.Containers.Create(&conf) run, err := b.dockerClient.Containers.Create(&conf)
if err != nil { if err != nil {
return err return err
} }
@ -336,18 +337,18 @@ func (b *Builder) run() error {
// attach to the container // attach to the container
go func() { go func() {
client.Containers.Attach(run.ID, &writer{b.Stdout}) b.dockerClient.Containers.Attach(run.ID, &writer{b.Stdout})
}() }()
// start the container // 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.ExitCode = 1
b.BuildState.Finished = time.Now().UTC().Unix() b.BuildState.Finished = time.Now().UTC().Unix()
return err return err
} }
// wait for the container to stop // wait for the container to stop
wait, err := client.Containers.Wait(run.ID) wait, err := b.dockerClient.Containers.Wait(run.ID)
if err != nil { if err != nil {
b.BuildState.ExitCode = 1 b.BuildState.ExitCode = 1
b.BuildState.Finished = time.Now().UTC().Unix() b.BuildState.Finished = time.Now().UTC().Unix()

View file

@ -29,6 +29,8 @@ const (
// Enables verbose logging to the Terminal window // Enables verbose logging to the Terminal window
var Logging = true var Logging = true
var DefaultClient = New() // TEMPORARY; PLEASE CONSTRUCT/INJECT YOURSELF
// New creates an instance of the Docker Client // New creates an instance of the Docker Client
func New() *Client { func New() *Client {
c := &Client{} c := &Client{}

View file

@ -4,6 +4,7 @@ import (
"bytes" "bytes"
"fmt" "fmt"
"github.com/drone/drone/pkg/build" "github.com/drone/drone/pkg/build"
"github.com/drone/drone/pkg/build/docker"
"github.com/drone/drone/pkg/build/git" "github.com/drone/drone/pkg/build/git"
r "github.com/drone/drone/pkg/build/repo" r "github.com/drone/drone/pkg/build/repo"
"github.com/drone/drone/pkg/channel" "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) { func runBuild(b *BuildTask, buf io.Writer) (bool, error) {
builder := build.New() builder := build.New(docker.DefaultClient)
builder.Build = b.Script 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.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) builder.Key = []byte(b.Repo.PrivateKey)