Skip to content
This repository was archived by the owner on Mar 30, 2020. It is now read-only.

Commit 1732c38

Browse files
committed
core: image tagging on build
1 parent b027521 commit 1732c38

File tree

7 files changed

+73
-30
lines changed

7 files changed

+73
-30
lines changed

config/config.go

+5
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ type Config struct {
1414
UseShortRevisions bool `default:"true"`
1515
GithubToken string
1616
EtcdServers []string `gcfg:"EtcdServer"`
17+
Repository string `default:"dockership"`
1718
}
1819
HTTP struct {
1920
Listen string `default:":8080"`
@@ -61,6 +62,10 @@ func (c *Config) LoadEnvironments() {
6162
if e.EtcdServers == nil || len(e.EtcdServers) == 0 {
6263
e.EtcdServers = c.Global.EtcdServers
6364
}
65+
66+
if len(e.Repository) == 0 {
67+
e.Repository = c.Global.Repository
68+
}
6469
}
6570
}
6671

core/docker.go

+23-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ import (
1717
"github.com/fsouza/go-dockerclient"
1818
)
1919

20+
const LatestTag = "latest"
21+
2022
type Docker struct {
2123
endPoint string
2224
env *Environment
@@ -227,7 +229,27 @@ func (d *Docker) BuildImage(
227229
OutputStream: output,
228230
}
229231

230-
return d.client.BuildImage(opts)
232+
if err := d.client.BuildImage(opts); err != nil {
233+
return err
234+
}
235+
236+
return d.tagImage(image)
237+
}
238+
239+
func (d *Docker) tagImage(image ImageId) error {
240+
for _, tag := range []string{LatestTag, image.GetRevisionString()} {
241+
err := d.client.TagImage(string(image), docker.TagImageOptions{
242+
Force: true,
243+
Repo: d.env.Repository,
244+
Tag: tag,
245+
})
246+
247+
if err != nil {
248+
return err
249+
}
250+
}
251+
252+
return nil
231253
}
232254

233255
func (d *Docker) Run(p *Project, rev Revision) error {

core/docker_group_test.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package core
22

33
import (
44
"bytes"
5+
56
"github.com/fsouza/go-dockerclient/testing"
67
. "gopkg.in/check.v1"
78
)
@@ -10,7 +11,7 @@ func (s *CoreSuite) TestDockerGroup_BuildImage(c *C) {
1011
dg := &DockerGroup{dockers: make(map[string]*Docker, 0)}
1112
for i := 0; i < 5; i++ {
1213
m, _ := testing.NewServer("127.0.0.1:0", nil, nil)
13-
dg.dockers[m.URL()], _ = NewDocker(m.URL(), nil)
14+
dg.dockers[m.URL()], _ = NewDocker(m.URL(), &Environment{Repository: "foo"})
1415
m.Stop()
1516
}
1617

@@ -65,7 +66,7 @@ func (s *CoreSuite) TestDockerGroup_DeployListContainersAndListImages(c *C) {
6566
for i := 0; i < 5; i++ {
6667
m, _ := testing.NewServer("127.0.0.1:0", nil, nil)
6768
defer m.Stop()
68-
dg.dockers[m.URL()], _ = NewDocker(m.URL(), nil)
69+
dg.dockers[m.URL()], _ = NewDocker(m.URL(), &Environment{Repository: "foo"})
6970
}
7071

7172
p := &Project{Name: "foo", Repository: "git@github.com:foo/bar.git", UseShortRevisions: true}
@@ -87,6 +88,6 @@ func (s *CoreSuite) TestDockerGroup_DeployListContainersAndListImages(c *C) {
8788
c.Assert(errors, HasLen, 0)
8889
c.Assert(images, HasLen, 5)
8990
for _, r := range images {
90-
c.Assert(r.RepoTags[0], Equals, "foo:qux")
91+
c.Assert(r.RepoTags, HasLen, 2)
9192
}
9293
}

core/docker_test.go

+31-19
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func (s *CoreSuite) TestDocker_Deploy(c *C) {
3131

3232
input := bytes.NewBuffer(nil)
3333

34-
d, _ := NewDocker(m.URL(), nil)
34+
d, _ := NewDocker(m.URL(), &Environment{Repository: "foo"})
3535
rev := Revision{"foo": "bar"}
3636
err := d.Deploy(p, rev, &Dockerfile{blob: []byte("FROM base\n")}, input, false)
3737
c.Assert(err, Equals, nil)
@@ -44,7 +44,7 @@ func (s *CoreSuite) TestDocker_Deploy(c *C) {
4444
}
4545

4646
func (s *CoreSuite) TestDocker_BuildImage(c *C) {
47-
var request *http.Request
47+
var requests []*http.Request
4848
files := make(map[string]string, 0)
4949

5050
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
@@ -55,18 +55,20 @@ func (s *CoreSuite) TestDocker_BuildImage(c *C) {
5555
defer r.Body.Close()
5656
defer s.Done()
5757

58-
tr := tar.NewReader(r.Body)
59-
for {
60-
header, err := tr.Next()
61-
if err != nil {
62-
break
63-
}
58+
requests = append(requests, r)
6459

65-
content, _ := ioutil.ReadAll(tr)
66-
files[header.Name] = string(content)
67-
}
60+
if r.URL.Path == "/build" {
61+
tr := tar.NewReader(r.Body)
62+
for {
63+
header, err := tr.Next()
64+
if err != nil {
65+
break
66+
}
6867

69-
request = r
68+
content, _ := ioutil.ReadAll(tr)
69+
files[header.Name] = string(content)
70+
}
71+
}
7072
}))
7173

7274
defer ts.Close()
@@ -81,18 +83,28 @@ func (s *CoreSuite) TestDocker_BuildImage(c *C) {
8183

8284
input := bytes.NewBuffer(nil)
8385

84-
s.Add(1)
85-
d, _ := NewDocker(ts.URL, nil)
86-
err := d.BuildImage(p, Revision{"key": "qux"}, &Dockerfile{blob: []byte("FROM base\n")}, input)
86+
s.Add(3)
87+
d, err := NewDocker(ts.URL, &Environment{Repository: "foo"})
88+
c.Assert(err, IsNil)
89+
90+
err = d.BuildImage(p, Revision{"key": "qux"}, &Dockerfile{blob: []byte("FROM base\n")}, input)
91+
c.Assert(err, IsNil)
8792
s.Wait()
8893

89-
c.Assert(err, Equals, nil)
9094
c.Assert(files, HasLen, 2)
9195
c.Assert(files["Dockerfile"], Equals, "FROM base\n")
9296
c.Assert(files[path.Base(file)], Equals, "qux")
93-
c.Assert(request.URL.Query().Get("t"), Equals, "image:qux")
94-
c.Assert(request.URL.Query().Get("nocache"), Equals, "1")
95-
c.Assert(request.URL.Query().Get("rm"), Equals, "1")
97+
c.Assert(requests[0].URL.Query().Get("t"), Equals, "image:qux")
98+
c.Assert(requests[0].URL.Query().Get("nocache"), Equals, "1")
99+
c.Assert(requests[0].URL.Query().Get("rm"), Equals, "1")
100+
101+
c.Assert(requests[1].URL.Query().Get("tag"), Equals, "latest")
102+
c.Assert(requests[1].URL.Query().Get("repo"), Equals, "foo")
103+
c.Assert(requests[1].URL.Query().Get("force"), Equals, "1")
104+
105+
c.Assert(requests[2].URL.Query().Get("tag"), Equals, "qux")
106+
c.Assert(requests[2].URL.Query().Get("repo"), Equals, "foo")
107+
c.Assert(requests[2].URL.Query().Get("force"), Equals, "1")
96108
}
97109

98110
func (s *CoreSuite) TestDocker_Run(c *C) (p *Project, m *testing.DockerServer, rev Revision) {

core/project_test.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,9 @@ func (s *CoreSuite) TestProject_Status(c *C) {
7979
}
8080

8181
input := bytes.NewBuffer(nil)
82-
da, _ := NewDocker(envs["a"].DockerEndPoints[0], nil)
82+
da, _ := NewDocker(envs["a"].DockerEndPoints[0], &Environment{Repository: "foo"})
8383
da.Deploy(p, Revision{}, &Dockerfile{}, input, false)
84-
db, _ := NewDocker(envs["b"].DockerEndPoints[0], nil)
84+
db, _ := NewDocker(envs["b"].DockerEndPoints[0], &Environment{Repository: "foo"})
8585
db.Deploy(p, Revision{}, &Dockerfile{}, input, false)
8686

8787
r, err := p.Status()
@@ -110,9 +110,9 @@ func (s *CoreSuite) TestProject_ListContainers(c *C) {
110110

111111
input := bytes.NewBuffer(nil)
112112

113-
da, _ := NewDocker(envs["a"].DockerEndPoints[0], nil)
113+
da, _ := NewDocker(envs["a"].DockerEndPoints[0], &Environment{Repository: "foo"})
114114
da.Deploy(p, Revision{}, &Dockerfile{}, input, false)
115-
db, _ := NewDocker(envs["b"].DockerEndPoints[0], nil)
115+
db, _ := NewDocker(envs["b"].DockerEndPoints[0], &Environment{Repository: "foo"})
116116
db.Deploy(p, Revision{}, &Dockerfile{}, input, false)
117117
time.Sleep(1 * time.Second)
118118
l, err := p.ListContainers()
@@ -137,9 +137,9 @@ func (s *CoreSuite) TestProject_ListImages(c *C) {
137137

138138
input := bytes.NewBuffer(nil)
139139

140-
da, _ := NewDocker(envs["a"].DockerEndPoints[0], nil)
140+
da, _ := NewDocker(envs["a"].DockerEndPoints[0], &Environment{Repository: "foo"})
141141
da.Deploy(p, Revision{}, &Dockerfile{}, input, false)
142-
db, _ := NewDocker(envs["b"].DockerEndPoints[0], nil)
142+
db, _ := NewDocker(envs["b"].DockerEndPoints[0], &Environment{Repository: "foo"})
143143
db.Deploy(p, Revision{}, &Dockerfile{}, input, false)
144144
time.Sleep(1 * time.Second)
145145
l, err := p.ListImages()

core/types.go

+1
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ type Environment struct {
208208
DockerEndPoints []string `gcfg:"DockerEndPoint"`
209209
CertPath string `json:"-"`
210210
EtcdServers []string `gcfg:"EtcdServer"`
211+
Repository string
211212
Name string
212213
Host string `gcfg:"Host"`
213214
}

documentation/configuration.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ A miscellaneous of configuration variables used across the whole tool.
3434

3535
* `UseShortRevisions` (default: true): if it is false all the images and containers will be defined using full length revision names, instead the short ones.
3636

37+
* `Repository` (default: dockership): this is the name of the repository used to tag your images. `<repository>/<image>`.
38+
3739
* `EtcdServer` (multiple, optional): etcd server, needed for etcd variables at the Dockerfiles.
3840

3941

@@ -69,7 +71,7 @@ An environment is a logical group of any number of Docker servers. Dockership su
6971
* `Repository` (mandatory): Github repository SSH clone URL, the branch can be added to the end of the URL preceded of a `!` (eg.: `git@github.com:mcuadros/dockership.git!master`)
7072
* `Dockerfile` (default: Dockerfile): the path to the Dockerfile at the repository.
7173
* `RelatedRepositories` (optional, multiple): SSH clone URL to dependent repositories. (Link to more explanatory document)
72-
* `History` (default: 3): Number to old images you want to keep in each Docker server.
74+
* `History` (default: 3): Number to old images you want to keep in each Docker server.
7375
* `NoCache` (optional): Avoid to use the Docker cache (like --no-cache at `docker build`)
7476
* `Port` (multiple, optional): container port to expose, format: `<host-addr>:<host-port>:<container-port>/<proto>` (like -p at `docker run`), additionaly the port can be configured just for one enviroment adding it to end of the port preceded by a `@` (eg: `2.2.2.2:80:80/tcp@live`)
7577
* `Restart` (optional, default: no): restart policy to apply when a container exits (no, on-failure[:max-retry], always) (like --restart at `docker run`)

0 commit comments

Comments
 (0)