Skip to content

Commit 567e99f

Browse files
committed
core: job-run pull image
1 parent 5c6653d commit 567e99f

File tree

2 files changed

+76
-3
lines changed

2 files changed

+76
-3
lines changed

core/runjob.go

+55-3
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,37 @@ package core
22

33
import (
44
"fmt"
5+
"strings"
56
"time"
67

78
"github.com/fsouza/go-dockerclient"
89
"github.com/gobs/args"
910
)
1011

12+
var dockercfg *docker.AuthConfigurations
13+
14+
func init() {
15+
dockercfg, _ = docker.NewAuthConfigurationsFromDockerCfg()
16+
}
17+
1118
type RunJob struct {
1219
BareJob
1320
Client *docker.Client `json:"-"`
21+
User string `default:"root"`
22+
TTY bool `default:"false"`
23+
Delete bool `default:"true"`
1424
Image string
15-
User string `default:"root"`
16-
TTY bool `default:"false"`
17-
Delete bool `default:"true"`
1825
}
1926

2027
func NewRunJob(c *docker.Client) *RunJob {
2128
return &RunJob{Client: c}
2229
}
2330

2431
func (j *RunJob) Run(ctx *Context) error {
32+
if err := j.pullImage(); err != nil {
33+
return err
34+
}
35+
2536
container, err := j.buildContainer()
2637
if err != nil {
2738
return err
@@ -38,6 +49,15 @@ func (j *RunJob) Run(ctx *Context) error {
3849
return j.deleteContainer(container.ID)
3950
}
4051

52+
func (j *RunJob) pullImage() error {
53+
o, a := buildPullOptions(j.Image)
54+
if err := j.Client.PullImage(o, a); err != nil {
55+
return fmt.Errorf("error pulling image %q: %s", j.Image, err)
56+
}
57+
58+
return nil
59+
}
60+
4161
func (j *RunJob) buildContainer() (*docker.Container, error) {
4262
c, err := j.Client.CreateContainer(docker.CreateContainerOptions{
4363
Config: &docker.Config{
@@ -108,3 +128,35 @@ func (j *RunJob) deleteContainer(containerID string) error {
108128
ID: containerID,
109129
})
110130
}
131+
132+
func buildPullOptions(image string) (docker.PullImageOptions, docker.AuthConfiguration) {
133+
tag := "latest"
134+
registry := ""
135+
136+
parts := strings.Split(image, ":")
137+
if len(parts) == 2 {
138+
tag = parts[1]
139+
}
140+
141+
name := parts[0]
142+
parts = strings.Split(name, "/")
143+
if len(parts) > 2 {
144+
registry = parts[0]
145+
}
146+
147+
return docker.PullImageOptions{
148+
Repository: name,
149+
Registry: registry,
150+
Tag: tag,
151+
}, buildAuthConfiguration(registry)
152+
}
153+
154+
func buildAuthConfiguration(registry string) docker.AuthConfiguration {
155+
var auth docker.AuthConfiguration
156+
if dockercfg == nil {
157+
return auth
158+
}
159+
160+
auth, _ = dockercfg.Configs[registry]
161+
return auth
162+
}

core/runjob_test.go

+21
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,27 @@ func (s *SuiteRunJob) TestRun(c *C) {
6868
c.Assert(containers, HasLen, 0)
6969
}
7070

71+
func (s *SuiteRunJob) TestBuildPullImageOptionsBareImage(c *C) {
72+
o, _ := buildPullOptions("foo")
73+
c.Assert(o.Repository, Equals, "foo")
74+
c.Assert(o.Tag, Equals, "latest")
75+
c.Assert(o.Registry, Equals, "")
76+
}
77+
78+
func (s *SuiteRunJob) TestBuildPullImageOptionsVersion(c *C) {
79+
o, _ := buildPullOptions("foo:qux")
80+
c.Assert(o.Repository, Equals, "foo")
81+
c.Assert(o.Tag, Equals, "qux")
82+
c.Assert(o.Registry, Equals, "")
83+
}
84+
85+
func (s *SuiteRunJob) TestBuildPullImageOptionsRegistry(c *C) {
86+
o, _ := buildPullOptions("quay.io/srcd/rest:qux")
87+
c.Assert(o.Repository, Equals, "quay.io/srcd/rest")
88+
c.Assert(o.Tag, Equals, "qux")
89+
c.Assert(o.Registry, Equals, "quay.io")
90+
}
91+
7192
func (s *SuiteRunJob) buildImage(c *C) {
7293
inputbuf := bytes.NewBuffer(nil)
7394
tr := tar.NewWriter(inputbuf)

0 commit comments

Comments
 (0)