Skip to content

Commit 128268d

Browse files
committed
Allow building (name).Dockerfile
1 parent 07c3aad commit 128268d

File tree

4 files changed

+57
-29
lines changed

4 files changed

+57
-29
lines changed

build/builder.go

+23-21
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"io"
1212
"os"
1313
"os/exec"
14-
"path/filepath"
1514
"time"
1615
)
1716

@@ -25,12 +24,17 @@ type Builder struct {
2524
DoPush bool
2625
}
2726

28-
func (builder *Builder) buildkitSolveOpts(serviceDir, fullImageName string, writer io.WriteCloser) *client.SolveOpt {
27+
func (builder *Builder) buildkitSolveOpts(
28+
serviceDir, dockerfileName, fullImageName string,
29+
writer io.WriteCloser) *client.SolveOpt {
2930
solveOpt := &client.SolveOpt{
3031
LocalDirs: map[string]string{
3132
"context": serviceDir,
3233
"dockerfile": serviceDir,
3334
},
35+
FrontendAttrs: map[string]string{
36+
"filename": dockerfileName,
37+
},
3438
Session: []session.Attachable{authprovider.NewDockerAuthProvider()},
3539
}
3640

@@ -65,42 +69,41 @@ func (builder *Builder) buildkitSolveOpts(serviceDir, fullImageName string, writ
6569
}
6670

6771
//BuildService builds a specific sevice directory with a specific context
68-
func (builder *Builder) BuildService(ctx context.Context, serviceDir string) error {
69-
serviceName := filepath.Base(serviceDir)
70-
fullImageName := fmt.Sprintf("%s:%s", serviceName, builder.BuildTag)
72+
func (builder *Builder) BuildService(ctx context.Context, service util.BuildableService) error {
73+
fullImageName := fmt.Sprintf("%s:%s", service.Name, builder.BuildTag)
7174
if builder.Registry != "" {
72-
fullImageName = fmt.Sprintf("%s/%s:%s", builder.Registry, serviceName, builder.BuildTag)
75+
fullImageName = fmt.Sprintf("%s/%s:%s", builder.Registry, service.Name, builder.BuildTag)
7376
}
74-
builder.Interface.StartJob(serviceName, fullImageName)
77+
builder.Interface.StartJob(service.Name, fullImageName)
7578
statusChannel := make(chan *client.SolveStatus)
7679

7780
var resultR *io.PipeReader
7881
var resultW *io.PipeWriter
7982
if !builder.DoPush {
8083
resultR, resultW = io.Pipe()
8184
}
82-
buildOpts := builder.buildkitSolveOpts(serviceDir, fullImageName, resultW)
85+
buildOpts := builder.buildkitSolveOpts(service.Dir, service.Dockerfile, fullImageName, resultW)
8386

8487
err := util.RunContextuallyInParallel(
8588
ctx,
8689
func(ctx context.Context) error {
8790
buildkitClient, err := client.New(ctx, BuildkitDaemonAddr, client.WithFailFast())
8891
if err != nil {
89-
builder.Interface.FailJob(serviceName, err)
90-
builder.Logger.Log(serviceName, time.Now(), "Could not connect to build daemon! ", err.Error())
92+
builder.Interface.FailJob(service.Name, err)
93+
builder.Logger.Log(service.Name, time.Now(), "Could not connect to build daemon! ", err.Error())
9194
return err
9295
}
93-
builder.Logger.Log(serviceName, time.Now(), "Starting build of ", serviceDir)
96+
builder.Logger.Log(service.Name, time.Now(), "Starting build of ", service.Dir)
9497
solveStatus, err := buildkitClient.Build(ctx, *buildOpts, "", dockerfile.Build, statusChannel)
9598
if solveStatus != nil {
9699
//TODO if this is null should print a warning that we failed to push
97100
//e.g., when we haven't deployed yet
98101
for k, v := range solveStatus.ExporterResponse {
99-
builder.Logger.Log(serviceName, time.Now(), fmt.Sprintf("exporter: %s=%s", k, v))
102+
builder.Logger.Log(service.Name, time.Now(), fmt.Sprintf("exporter: %s=%s", k, v))
100103
}
101104
}
102105
if err != nil {
103-
builder.Logger.Log(serviceName, time.Now(), "FAILED: ", err.Error())
106+
builder.Logger.Log(service.Name, time.Now(), "FAILED: ", err.Error())
104107
}
105108
return err
106109
},
@@ -113,8 +116,7 @@ func (builder *Builder) BuildService(ctx context.Context, serviceDir string) err
113116
return err
114117
}
115118
err := util.WaitCmdContextually(ctx, cmd)
116-
resultR.CloseWithError(err)
117-
return err
119+
return resultR.CloseWithError(err)
118120
}
119121
return nil
120122
},
@@ -129,10 +131,10 @@ func (builder *Builder) BuildService(ctx context.Context, serviceDir string) err
129131
}
130132
for _, status := range status.Statuses {
131133
if status.ID == "pushing layers" {
132-
builder.Interface.SetPushing(serviceName)
134+
builder.Interface.SetPushing(service.Name)
133135
}
134136
}
135-
logErr := builder.Logger.ProcessStatus(serviceName, status)
137+
logErr := builder.Logger.ProcessStatus(service.Name, status)
136138
if logErr != nil {
137139
fmt.Fprintln(os.Stderr, logErr.Error())
138140
}
@@ -142,11 +144,11 @@ func (builder *Builder) BuildService(ctx context.Context, serviceDir string) err
142144
)
143145

144146
if err == nil {
145-
builder.Interface.SucceedJob(serviceName)
146-
builder.Logger.Log(serviceName, time.Now(), "Build succeeded!")
147+
builder.Interface.SucceedJob(service.Name)
148+
builder.Logger.Log(service.Name, time.Now(), "Build succeeded!")
147149
} else if err != context.Canceled {
148-
builder.Interface.FailJob(serviceName, err)
149-
builder.Logger.Log(serviceName, time.Now(), "Build failed! ", err.Error())
150+
builder.Interface.FailJob(service.Name, err)
151+
builder.Logger.Log(service.Name, time.Now(), "Build failed! ", err.Error())
150152
}
151153
return err
152154
}

commands/build.go

+8-4
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,11 @@ func buildCommandAction(cliContext *cli.Context) error {
8282

8383
buildTag := cliContext.String("tag")
8484
if buildTag == "" {
85-
buildTag, err = git.GetCurrentTreeHash(buildRoot, services...)
85+
var serviceDirs []string
86+
for _, service := range services {
87+
serviceDirs = append(serviceDirs, service.Dir)
88+
}
89+
buildTag, err = git.GetCurrentTreeHash(buildRoot, serviceDirs...)
8690
if err != nil {
8791
return cli.NewExitError(err.Error(), 1)
8892
}
@@ -112,12 +116,12 @@ func buildCommandAction(cliContext *cli.Context) error {
112116
DoPush: cliContext.Bool("push"),
113117
}
114118

115-
for _, serviceDir := range services {
116-
finalServiceDir := serviceDir
119+
for _, service := range services {
120+
finalService := service
117121
jobs = append(jobs, func(ctx context.Context) error {
118122
return builder.BuildService(
119123
ctx,
120-
finalServiceDir,
124+
finalService,
121125
)
122126
})
123127
}

commands/deploy.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,11 @@ func runTemplater(folderIn, folderOut, templaterImage, namespace string) error {
7272
if err != nil {
7373
return err
7474
}
75-
buildTag, err := git.GetCurrentTreeHash(shl.GetSanicRoot(), services...)
75+
var serviceDirectories []string
76+
for _, service := range services {
77+
serviceDirectories = append(serviceDirectories, service.Dir)
78+
}
79+
buildTag, err := git.GetCurrentTreeHash(shl.GetSanicRoot(), serviceDirectories...)
7680
if err != nil {
7781
return err
7882
}

util/services.go

+21-3
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,24 @@ package util
33
import (
44
"os"
55
"path/filepath"
6+
"strings"
67
)
78

9+
type BuildableService struct {
10+
Dir string
11+
Dockerfile string
12+
Name string
13+
}
14+
815
//FindServices finds all of the buildable services in the given directory
916
//(e.g., folders which contain a Dockerfile)
10-
func FindServices(dir string, ignorePaths []string) ([]string, error) {
17+
func FindServices(dir string, ignorePaths []string) ([]BuildableService, error) {
1118
dir, err := filepath.Abs(dir)
1219
if err != nil {
1320
return nil, err
1421
}
1522

16-
var ret []string
23+
var ret []BuildableService
1724

1825
err = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
1926
for _, ignorePath := range ignorePaths {
@@ -23,7 +30,18 @@ func FindServices(dir string, ignorePaths []string) ([]string, error) {
2330
}
2431

2532
if info.Name() == "Dockerfile" {
26-
ret = append(ret, filepath.Dir(path))
33+
ret = append(ret, BuildableService{
34+
Dir: filepath.Dir(path),
35+
Dockerfile: "Dockerfile",
36+
Name: filepath.Base(filepath.Dir(path)),
37+
})
38+
} else if strings.HasSuffix(info.Name(), ".Dockerfile") {
39+
name := filepath.Base(filepath.Dir(path))+"-"+strings.TrimSuffix(info.Name(),".Dockerfile")
40+
ret = append(ret, BuildableService{
41+
Dir: filepath.Dir(path),
42+
Dockerfile: info.Name(),
43+
Name: name,
44+
})
2745
}
2846
return nil
2947
})

0 commit comments

Comments
 (0)