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

Commit cc45267

Browse files
committed
core: file support
1 parent 54197d0 commit cc45267

File tree

7 files changed

+77
-52
lines changed

7 files changed

+77
-52
lines changed

core/docker.go

Lines changed: 19 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@ import (
66
"errors"
77
"fmt"
88
"io"
9-
"io/ioutil"
10-
"os"
11-
"path"
129
"sort"
1310
"strconv"
1411
"strings"
@@ -185,10 +182,9 @@ func (d *Docker) ListContainers(p *Project) ([]*Container, error) {
185182
}
186183

187184
func (d *Docker) ListImages(p *Project) ([]*Image, error) {
188-
Debug("Retrieving current containers", "project", p, "end-point", d.endPoint)
185+
Debug("Retrieving current images", "project", p, "end-point", d.endPoint)
189186

190187
l, err := d.client.ListImages(docker.ListImagesOptions{All: true})
191-
192188
if err != nil {
193189
return nil, err
194190
}
@@ -216,7 +212,7 @@ func (d *Docker) BuildImage(
216212
Debug("Building image", "project", p, "revision", rev, "end-point", d.endPoint)
217213

218214
input := bytes.NewBuffer(nil)
219-
if err := d.buildTar(p, dockerfile.Get(), input); err != nil {
215+
if err := d.buildTar(p, dockerfile, input); err != nil {
220216
return err
221217
}
222218

@@ -395,52 +391,36 @@ func (d *Docker) formatPort(port string) (guest docker.Port, host docker.PortBin
395391
return
396392
}
397393

398-
func (d *Docker) buildTar(p *Project, dockerfile []byte, buf *bytes.Buffer) error {
399-
t := time.Now()
400-
394+
func (d *Docker) buildTar(p *Project, df *Dockerfile, buf *bytes.Buffer) error {
401395
tr := tar.NewWriter(buf)
402-
tr.WriteHeader(&tar.Header{
403-
Name: "Dockerfile",
404-
Size: int64(len(dockerfile)),
405-
ModTime: t,
406-
AccessTime: t,
407-
ChangeTime: t,
408-
})
396+
defer tr.Close()
409397

410-
if _, err := tr.Write(dockerfile); err != nil {
398+
if err := d.addDockerFileToTar(tr, df); err != nil {
411399
return err
412400
}
413401

414-
for _, file := range p.Files {
415-
if err := d.addFileToTar(file, tr); err != nil {
402+
for _, f := range df.Files {
403+
if err := d.addFileToTar(tr, f.Name, f.Content); err != nil {
416404
return err
417405
}
418406
}
419407

420-
tr.Close()
421408
return nil
422409
}
423410

424-
func (d *Docker) addFileToTar(file string, tr *tar.Writer) error {
425-
content, err := ioutil.ReadFile(file)
426-
if err != nil {
427-
return err
428-
}
429-
430-
fInfo, err := os.Lstat(file)
431-
if err != nil {
432-
return err
433-
}
434-
435-
h, err := tar.FileInfoHeader(fInfo, "")
436-
h.Name = path.Base(file)
437-
if err != nil {
438-
return err
439-
}
411+
func (d *Docker) addDockerFileToTar(tr *tar.Writer, df *Dockerfile) error {
412+
return d.addFileToTar(tr, "Dockerfile", df.Get())
413+
}
440414

441-
if err := tr.WriteHeader(h); err != nil {
442-
return err
443-
}
415+
func (d *Docker) addFileToTar(tr *tar.Writer, file string, content []byte) error {
416+
t := time.Now()
417+
tr.WriteHeader(&tar.Header{
418+
Name: file,
419+
Size: int64(len(content)),
420+
ModTime: t,
421+
AccessTime: t,
422+
ChangeTime: t,
423+
})
444424

445425
if _, err := tr.Write(content); err != nil {
446426
return err

core/docker_group_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ func (s *CoreSuite) TestDockerGroup_BuildImage(c *C) {
1818
p := &Project{Repository: "git@github.com:foo/bar.git", UseShortRevisions: true}
1919
r := Revision{"foo/bar": Commit("qux")}
2020
input := bytes.NewBuffer(nil)
21-
result := dg.BuildImage(p, r, &Dockerfile{blob: []byte("")}, input)
21+
result := dg.BuildImage(p, r, &Dockerfile{content: []byte("")}, input)
2222

2323
c.Assert(result, HasLen, 5)
2424
for _, r := range result {
@@ -73,7 +73,7 @@ func (s *CoreSuite) TestDockerGroup_DeployListContainersAndListImages(c *C) {
7373
r := Revision{"foo/bar": Commit("qux")}
7474

7575
input := bytes.NewBuffer(nil)
76-
errors := dg.Deploy(p, r, &Dockerfile{blob: []byte("")}, input, true)
76+
errors := dg.Deploy(p, r, &Dockerfile{content: []byte("")}, input, true)
7777
c.Assert(errors, HasLen, 0)
7878
c.Assert(string(input.Bytes()), HasLen, 255)
7979

core/docker_test.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
"io/ioutil"
1010
"net/http"
1111
"net/http/httptest"
12-
"path"
1312
"time"
1413

1514
"github.com/fsouza/go-dockerclient"
@@ -33,7 +32,7 @@ func (s *CoreSuite) TestDocker_Deploy(c *C) {
3332

3433
d, _ := NewDocker(m.URL(), nil)
3534
rev := Revision{"foo": "bar"}
36-
err := d.Deploy(p, rev, &Dockerfile{blob: []byte("FROM base\n")}, input, false)
35+
err := d.Deploy(p, rev, &Dockerfile{content: []byte("FROM base\n")}, input, false)
3736
c.Assert(err, Equals, nil)
3837

3938
l, _ := d.ListContainers(p)
@@ -73,12 +72,10 @@ func (s *CoreSuite) TestDocker_BuildImage(c *C) {
7372

7473
defer ts.Close()
7574

76-
file := writeRandomFile("qux")
7775
p := &Project{
7876
Name: "image",
7977
Repository: "git@github.com:foo/bar.git",
8078
NoCache: true,
81-
Files: []string{file},
8279
}
8380

8481
input := bytes.NewBuffer(nil)
@@ -87,13 +84,12 @@ func (s *CoreSuite) TestDocker_BuildImage(c *C) {
8784
d, err := NewDocker(ts.URL, nil)
8885
c.Assert(err, IsNil)
8986

90-
err = d.BuildImage(p, Revision{"key": "qux"}, &Dockerfile{blob: []byte("FROM base\n")}, input)
87+
err = d.BuildImage(p, Revision{"key": "qux"}, &Dockerfile{content: []byte("FROM base\n")}, input)
9188
c.Assert(err, IsNil)
9289
s.Wait()
9390

94-
c.Assert(files, HasLen, 2)
91+
c.Assert(files, HasLen, 1)
9592
c.Assert(files["Dockerfile"], Equals, "FROM base\n")
96-
c.Assert(files[path.Base(file)], Equals, "qux")
9793
c.Assert(requests[0].URL.Query().Get("t"), Equals, "image:qux")
9894
c.Assert(requests[0].URL.Query().Get("nocache"), Equals, "1")
9995
c.Assert(requests[0].URL.Query().Get("rm"), Equals, "1")

core/dockerfile.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,29 @@ import (
77
)
88

99
type Dockerfile struct {
10-
blob []byte
10+
content []byte
1111
project *Project
1212
revision Revision
1313
environment *Environment
14+
Files []*File
1415
}
1516

16-
func NewDockerfile(blob []byte, p *Project, r Revision, e *Environment) *Dockerfile {
17+
type File struct {
18+
Name string
19+
Content []byte
20+
}
21+
22+
func NewDockerfile(content []byte, p *Project, r Revision, e *Environment) *Dockerfile {
1723
return &Dockerfile{
18-
blob: blob,
24+
content: content,
1925
project: p,
2026
revision: r,
2127
environment: e,
2228
}
2329
}
2430

2531
func (d *Dockerfile) Get() []byte {
26-
result := d.blob
32+
result := d.content
2733
result = d.resolveInfoVariables(result)
2834
result = d.resolveEtcdVariables(result)
2935

core/github.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,27 @@ func (g *Github) GetDockerFile(p *Project) (content []byte, err error) {
4141
return
4242
}
4343

44+
func (g *Github) GetFiles(p *Project) (files []*File, err error) {
45+
info := p.Repository.Info()
46+
commit, err := g.doGetLastCommit(info)
47+
if err != nil {
48+
return
49+
}
50+
51+
for _, f := range p.Files {
52+
file := &File{Name: f}
53+
file.Content, err = g.doGetFileContent(info, commit, f)
54+
55+
if err != nil {
56+
return
57+
}
58+
59+
files = append(files, file)
60+
}
61+
62+
return
63+
}
64+
4465
func (g *Github) GetLastCommit(p *Project) (Commit, error) {
4566
return g.doGetLastCommit(p.Repository.Info())
4667
}

core/github_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,24 @@ func (s *CoreSuite) TestGithub_GetDockerFile(c *C) {
7272
c.Assert(string(content), Equals, "build\nhttp/bindata.go\n")
7373
}
7474

75+
func (s *CoreSuite) TestGithub_GetFiles(c *C) {
76+
if !*githubFlag {
77+
c.Skip("-github not provided")
78+
}
79+
80+
p := &Project{
81+
Repository: "git@github.com:mcuadros/dockership.git",
82+
Files: []string{".gitignore"},
83+
}
84+
85+
g := NewGithub(githubToken)
86+
files, err := g.GetFiles(p)
87+
c.Assert(err, Equals, nil)
88+
c.Assert(files, HasLen, 1)
89+
c.Assert(string(files[0].Name), Equals, ".gitignore")
90+
c.Assert(string(files[0].Content), Equals, "build\nhttp/bindata.go\n")
91+
}
92+
7593
func (s *CoreSuite) TestGithub_GetDockerFileNotFound(c *C) {
7694
if !*githubFlag {
7795
c.Skip("-github not provided")

core/project.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ func (p *Project) Deploy(environment string, output io.Writer, force bool) []err
6767
}
6868

6969
file := NewDockerfile(blob, p, r, e)
70+
file.Files, err = c.GetFiles(p)
71+
if err != nil {
72+
return []error{err}
73+
}
7074

7175
errs = d.Deploy(p, r, file, output, force)
7276
p.afterDeploy(prevStatus, e, errs)

0 commit comments

Comments
 (0)