@@ -11,7 +11,6 @@ import (
11
11
"io"
12
12
"os"
13
13
"os/exec"
14
- "path/filepath"
15
14
"time"
16
15
)
17
16
@@ -25,12 +24,17 @@ type Builder struct {
25
24
DoPush bool
26
25
}
27
26
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 {
29
30
solveOpt := & client.SolveOpt {
30
31
LocalDirs : map [string ]string {
31
32
"context" : serviceDir ,
32
33
"dockerfile" : serviceDir ,
33
34
},
35
+ FrontendAttrs : map [string ]string {
36
+ "filename" : dockerfileName ,
37
+ },
34
38
Session : []session.Attachable {authprovider .NewDockerAuthProvider ()},
35
39
}
36
40
@@ -65,42 +69,41 @@ func (builder *Builder) buildkitSolveOpts(serviceDir, fullImageName string, writ
65
69
}
66
70
67
71
//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 )
71
74
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 )
73
76
}
74
- builder .Interface .StartJob (serviceName , fullImageName )
77
+ builder .Interface .StartJob (service . Name , fullImageName )
75
78
statusChannel := make (chan * client.SolveStatus )
76
79
77
80
var resultR * io.PipeReader
78
81
var resultW * io.PipeWriter
79
82
if ! builder .DoPush {
80
83
resultR , resultW = io .Pipe ()
81
84
}
82
- buildOpts := builder .buildkitSolveOpts (serviceDir , fullImageName , resultW )
85
+ buildOpts := builder .buildkitSolveOpts (service . Dir , service . Dockerfile , fullImageName , resultW )
83
86
84
87
err := util .RunContextuallyInParallel (
85
88
ctx ,
86
89
func (ctx context.Context ) error {
87
90
buildkitClient , err := client .New (ctx , BuildkitDaemonAddr , client .WithFailFast ())
88
91
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 ())
91
94
return err
92
95
}
93
- builder .Logger .Log (serviceName , time .Now (), "Starting build of " , serviceDir )
96
+ builder .Logger .Log (service . Name , time .Now (), "Starting build of " , service . Dir )
94
97
solveStatus , err := buildkitClient .Build (ctx , * buildOpts , "" , dockerfile .Build , statusChannel )
95
98
if solveStatus != nil {
96
99
//TODO if this is null should print a warning that we failed to push
97
100
//e.g., when we haven't deployed yet
98
101
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 ))
100
103
}
101
104
}
102
105
if err != nil {
103
- builder .Logger .Log (serviceName , time .Now (), "FAILED: " , err .Error ())
106
+ builder .Logger .Log (service . Name , time .Now (), "FAILED: " , err .Error ())
104
107
}
105
108
return err
106
109
},
@@ -113,8 +116,7 @@ func (builder *Builder) BuildService(ctx context.Context, serviceDir string) err
113
116
return err
114
117
}
115
118
err := util .WaitCmdContextually (ctx , cmd )
116
- resultR .CloseWithError (err )
117
- return err
119
+ return resultR .CloseWithError (err )
118
120
}
119
121
return nil
120
122
},
@@ -129,10 +131,10 @@ func (builder *Builder) BuildService(ctx context.Context, serviceDir string) err
129
131
}
130
132
for _ , status := range status .Statuses {
131
133
if status .ID == "pushing layers" {
132
- builder .Interface .SetPushing (serviceName )
134
+ builder .Interface .SetPushing (service . Name )
133
135
}
134
136
}
135
- logErr := builder .Logger .ProcessStatus (serviceName , status )
137
+ logErr := builder .Logger .ProcessStatus (service . Name , status )
136
138
if logErr != nil {
137
139
fmt .Fprintln (os .Stderr , logErr .Error ())
138
140
}
@@ -142,11 +144,11 @@ func (builder *Builder) BuildService(ctx context.Context, serviceDir string) err
142
144
)
143
145
144
146
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!" )
147
149
} 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 ())
150
152
}
151
153
return err
152
154
}
0 commit comments