Skip to content

Commit 9df1970

Browse files
committed
bake: use controller to build
With this change we are now passing a list of controller options to run a build and returns a map of responses and result context as bake can handle a list of targets. Signed-off-by: CrazyMax <[email protected]>
1 parent 9387640 commit 9df1970

File tree

8 files changed

+264
-202
lines changed

8 files changed

+264
-202
lines changed

bake/bake.go

+3-8
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import (
1515
composecli "github.com/compose-spec/compose-go/cli"
1616
"github.com/docker/buildx/bake/hclparser"
1717
"github.com/docker/buildx/build"
18-
cbuild "github.com/docker/buildx/controller/build"
1918
controllerapi "github.com/docker/buildx/controller/pb"
2019
"github.com/docker/buildx/util/buildflags"
2120
hcl "github.com/hashicorp/hcl/v2"
@@ -908,18 +907,14 @@ func (t *Target) GetName(ectx *hcl.EvalContext, block *hcl.Block, loadDeps func(
908907
return value.AsString(), nil
909908
}
910909

911-
func TargetsToBuildOpt(m map[string]*Target, inp *Input) (map[string]build.Options, error) {
912-
m2 := make(map[string]build.Options, len(m))
910+
func TargetsToControllerOptions(m map[string]*Target, inp *Input) (map[string]controllerapi.BuildOptions, error) {
911+
m2 := make(map[string]controllerapi.BuildOptions, len(m))
913912
for k, v := range m {
914913
opts, err := toControllerOpt(v, inp)
915914
if err != nil {
916915
return nil, err
917916
}
918-
bo, err := cbuild.ToBuildOpts(*opts, nil)
919-
if err != nil {
920-
return nil, err
921-
}
922-
m2[k] = *bo
917+
m2[k] = *opts
923918
}
924919
return m2, nil
925920
}

bake/bake_test.go

+29-15
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"strings"
88
"testing"
99

10+
"github.com/docker/buildx/controller/pb"
1011
"github.com/stretchr/testify/require"
1112
)
1213

@@ -390,7 +391,7 @@ func TestHCLCwdPrefix(t *testing.T) {
390391
_, ok := m["app"]
391392
require.True(t, ok)
392393

393-
_, err = TargetsToBuildOpt(m, &Input{})
394+
_, err = TargetsToControllerOptions(m, &Input{})
394395
require.NoError(t, err)
395396

396397
require.Equal(t, "test", *m["app"].Dockerfile)
@@ -421,7 +422,7 @@ func TestOverrideMerge(t *testing.T) {
421422
_, ok := m["app"]
422423
require.True(t, ok)
423424

424-
_, err = TargetsToBuildOpt(m, &Input{})
425+
_, err = TargetsToControllerOptions(m, &Input{})
425426
require.NoError(t, err)
426427

427428
require.Equal(t, []string{"linux/arm", "linux/ppc64le"}, m["app"].Platforms)
@@ -456,7 +457,7 @@ func TestReadContexts(t *testing.T) {
456457
_, ok := m["app"]
457458
require.True(t, ok)
458459

459-
bo, err := TargetsToBuildOpt(m, &Input{})
460+
bo, err := TargetsToControllerOptions(m, &Input{})
460461
require.NoError(t, err)
461462

462463
ctxs := bo["app"].Inputs.NamedContexts
@@ -472,7 +473,7 @@ func TestReadContexts(t *testing.T) {
472473
_, ok = m["app"]
473474
require.True(t, ok)
474475

475-
bo, err = TargetsToBuildOpt(m, &Input{})
476+
bo, err = TargetsToControllerOptions(m, &Input{})
476477
require.NoError(t, err)
477478

478479
ctxs = bo["app"].Inputs.NamedContexts
@@ -490,7 +491,7 @@ func TestReadContexts(t *testing.T) {
490491
_, ok = m["app"]
491492
require.True(t, ok)
492493

493-
bo, err = TargetsToBuildOpt(m, &Input{})
494+
bo, err = TargetsToControllerOptions(m, &Input{})
494495
require.NoError(t, err)
495496

496497
ctxs = bo["app"].Inputs.NamedContexts
@@ -1325,7 +1326,7 @@ func TestHCLNullVars(t *testing.T) {
13251326
_, ok := m["default"]
13261327
require.True(t, ok)
13271328

1328-
_, err = TargetsToBuildOpt(m, &Input{})
1329+
_, err = TargetsToControllerOptions(m, &Input{})
13291330
require.NoError(t, err)
13301331
require.Equal(t, map[string]*string{"bar": ptrstr("baz")}, m["default"].Args)
13311332
require.Equal(t, map[string]*string{"com.docker.app.baz": ptrstr("foo")}, m["default"].Labels)
@@ -1360,7 +1361,7 @@ func TestJSONNullVars(t *testing.T) {
13601361
_, ok := m["default"]
13611362
require.True(t, ok)
13621363

1363-
_, err = TargetsToBuildOpt(m, &Input{})
1364+
_, err = TargetsToControllerOptions(m, &Input{})
13641365
require.NoError(t, err)
13651366
require.Equal(t, map[string]*string{"bar": ptrstr("baz")}, m["default"].Args)
13661367
}
@@ -1432,21 +1433,34 @@ func TestAttestDuplicates(t *testing.T) {
14321433
require.Equal(t, []string{"type=sbom,foo=bar", "type=provenance,mode=max"}, m["default"].Attest)
14331434
require.NoError(t, err)
14341435

1435-
opts, err := TargetsToBuildOpt(m, &Input{})
1436+
opts, err := TargetsToControllerOptions(m, &Input{})
14361437
require.NoError(t, err)
1437-
require.Equal(t, map[string]*string{
1438-
"sbom": ptrstr("type=sbom,foo=bar"),
1439-
"provenance": ptrstr("type=provenance,mode=max"),
1438+
require.Equal(t, []*pb.Attest{
1439+
{
1440+
Type: "sbom",
1441+
Attrs: "type=sbom,foo=bar",
1442+
},
1443+
{
1444+
Type: "provenance",
1445+
Attrs: "type=provenance,mode=max",
1446+
},
14401447
}, opts["default"].Attests)
14411448

14421449
m, _, err = ReadTargets(ctx, []File{fp}, []string{"default"}, []string{"*.attest=type=sbom,disabled=true"}, nil)
14431450
require.Equal(t, []string{"type=sbom,disabled=true", "type=provenance,mode=max"}, m["default"].Attest)
14441451
require.NoError(t, err)
14451452

1446-
opts, err = TargetsToBuildOpt(m, &Input{})
1453+
opts, err = TargetsToControllerOptions(m, &Input{})
14471454
require.NoError(t, err)
1448-
require.Equal(t, map[string]*string{
1449-
"sbom": nil,
1450-
"provenance": ptrstr("type=provenance,mode=max"),
1455+
require.Equal(t, []*pb.Attest{
1456+
{
1457+
Type: "sbom",
1458+
Disabled: true,
1459+
Attrs: "type=sbom,disabled=true",
1460+
},
1461+
{
1462+
Type: "provenance",
1463+
Attrs: "type=provenance,mode=max",
1464+
},
14511465
}, opts["default"].Attests)
14521466
}

build/build.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -668,7 +668,7 @@ func Build(ctx context.Context, nodes []builder.Node, opt map[string]Options, do
668668
return BuildWithResultHandler(ctx, nodes, opt, docker, configDir, w, nil)
669669
}
670670

671-
func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[string]Options, docker *dockerutil.Client, configDir string, w progress.Writer, resultHandleFunc func(driverIndex int, rCtx *ResultHandle)) (resp map[string]*client.SolveResponse, err error) {
671+
func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[string]Options, docker *dockerutil.Client, configDir string, w progress.Writer, resultHandleFunc func(target string, rCtx *ResultHandle)) (resp map[string]*client.SolveResponse, err error) {
672672
if len(nodes) == 0 {
673673
return nil, errors.Errorf("driver required for build")
674674
}
@@ -938,7 +938,7 @@ func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[s
938938
if resultHandleFunc != nil {
939939
var resultHandle *ResultHandle
940940
resultHandle, rr, err = NewResultHandle(ctx, cc, so, "buildx", buildFunc, ch)
941-
resultHandleFunc(dp.driverIndex, resultHandle)
941+
resultHandleFunc(k, resultHandle)
942942
} else {
943943
rr, err = c.Build(ctx, so, "buildx", buildFunc, ch)
944944
}

commands/bake.go

+24-18
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ import (
1111
"github.com/docker/buildx/bake"
1212
"github.com/docker/buildx/build"
1313
"github.com/docker/buildx/builder"
14+
cbuild "github.com/docker/buildx/controller/build"
15+
controllerapi "github.com/docker/buildx/controller/pb"
1416
"github.com/docker/buildx/util/buildflags"
1517
"github.com/docker/buildx/util/cobrautil/completion"
16-
"github.com/docker/buildx/util/confutil"
1718
"github.com/docker/buildx/util/desktop"
18-
"github.com/docker/buildx/util/dockerutil"
1919
"github.com/docker/buildx/util/progress"
2020
"github.com/docker/buildx/util/tracing"
2121
"github.com/docker/cli/cli/command"
@@ -31,10 +31,8 @@ type bakeOptions struct {
3131
sbom string
3232
provenance string
3333

34-
builder string
35-
metadataFile string
36-
exportPush bool
37-
exportLoad bool
34+
controllerapi.CommonOptions
35+
//control.ControlOptions
3836
}
3937

4038
func runBake(dockerCli command.Cli, targets []string, in bakeOptions, cFlags commonFlags) (err error) {
@@ -69,12 +67,12 @@ func runBake(dockerCli command.Cli, targets []string, in bakeOptions, cFlags com
6967
}
7068

7169
overrides := in.overrides
72-
if in.exportPush {
73-
if in.exportLoad {
70+
if in.ExportPush {
71+
if in.ExportLoad {
7472
return errors.Errorf("push and load may not be set together at the moment")
7573
}
7674
overrides = append(overrides, "*.push=true")
77-
} else if in.exportLoad {
75+
} else if in.ExportLoad {
7876
overrides = append(overrides, "*.output=type=docker")
7977
}
8078
if cFlags.noCache != nil {
@@ -102,7 +100,7 @@ func runBake(dockerCli command.Cli, targets []string, in bakeOptions, cFlags com
102100
// instance only needed for reading remote bake files or building
103101
if url != "" || !in.printOnly {
104102
b, err := builder.New(dockerCli,
105-
builder.WithName(in.builder),
103+
builder.WithName(in.Builder),
106104
builder.WithContextPathHash(contextPathHash),
107105
)
108106
if err != nil {
@@ -176,11 +174,19 @@ func runBake(dockerCli command.Cli, targets []string, in bakeOptions, cFlags com
176174
}
177175

178176
// this function can update target context string from the input so call before printOnly check
179-
bo, err := bake.TargetsToBuildOpt(tgts, inp)
177+
opts, err := bake.TargetsToControllerOptions(tgts, inp)
180178
if err != nil {
181179
return err
182180
}
183181

182+
// set builder name and context hash for all targets
183+
updatedOpts := make(map[string]controllerapi.BuildOptions, len(opts))
184+
for i, opt := range opts {
185+
opt.Opts.Builder = in.Builder
186+
opt.Inputs.ContextPathHash = contextPathHash
187+
updatedOpts[i] = opt
188+
}
189+
184190
if in.printOnly {
185191
dt, err := json.MarshalIndent(struct {
186192
Group map[string]*bake.Group `json:"group,omitempty"`
@@ -201,17 +207,17 @@ func runBake(dockerCli command.Cli, targets []string, in bakeOptions, cFlags com
201207
return nil
202208
}
203209

204-
resp, err := build.Build(ctx, nodes, bo, dockerutil.NewClient(dockerCli), confutil.ConfigDir(dockerCli), printer)
210+
resp, _, err := cbuild.RunBuilds(ctx, dockerCli, updatedOpts, os.Stdin, printer, false)
205211
if err != nil {
206212
return wrapBuildError(err, true)
207213
}
208214

209-
if len(in.metadataFile) > 0 {
215+
if len(in.MetadataFile) > 0 {
210216
dt := make(map[string]interface{})
211217
for t, r := range resp {
212218
dt[t] = decodeExporterResponse(r.ExporterResponse)
213219
}
214-
if err := writeMetadataFile(in.metadataFile, dt); err != nil {
220+
if err := writeMetadataFile(in.MetadataFile, dt); err != nil {
215221
return err
216222
}
217223
}
@@ -235,8 +241,8 @@ func bakeCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
235241
if !cmd.Flags().Lookup("pull").Changed {
236242
cFlags.pull = nil
237243
}
238-
options.builder = rootOpts.builder
239-
options.metadataFile = cFlags.metadataFile
244+
options.Builder = rootOpts.builder
245+
options.MetadataFile = cFlags.metadataFile
240246
// Other common flags (noCache, pull and progress) are processed in runBake function.
241247
return runBake(dockerCli, args, options, cFlags)
242248
},
@@ -246,9 +252,9 @@ func bakeCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
246252
flags := cmd.Flags()
247253

248254
flags.StringArrayVarP(&options.files, "file", "f", []string{}, "Build definition file")
249-
flags.BoolVar(&options.exportLoad, "load", false, `Shorthand for "--set=*.output=type=docker"`)
255+
flags.BoolVar(&options.ExportLoad, "load", false, `Shorthand for "--set=*.output=type=docker"`)
250256
flags.BoolVar(&options.printOnly, "print", false, "Print the options without building")
251-
flags.BoolVar(&options.exportPush, "push", false, `Shorthand for "--set=*.output=type=registry"`)
257+
flags.BoolVar(&options.ExportPush, "push", false, `Shorthand for "--set=*.output=type=registry"`)
252258
flags.StringVar(&options.sbom, "sbom", "", `Shorthand for "--set=*.attest=type=sbom"`)
253259
flags.StringVar(&options.provenance, "provenance", "", `Shorthand for "--set=*.attest=type=provenance"`)
254260
flags.StringArrayVar(&options.overrides, "set", nil, `Override target value (e.g., "targetpattern.key=value")`)

commands/build.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,12 @@ func (o *buildOptions) toControllerOptions() (*controllerapi.BuildOptions, error
9494
var err error
9595

9696
inputs := controllerapi.Inputs{
97-
ContextPath: o.contextPath,
98-
DockerfileName: o.dockerfileName,
97+
ContextPath: o.contextPath,
98+
ContextPathHash: o.contextPath,
99+
DockerfileName: o.dockerfileName,
100+
}
101+
if absContextPath, err := filepath.Abs(inputs.ContextPathHash); err == nil {
102+
inputs.ContextPathHash = absContextPath
99103
}
100104
inputs.NamedContexts, err = buildflags.ParseContextNames(o.contexts)
101105
if err != nil {
@@ -218,13 +222,9 @@ func runBuild(dockerCli command.Cli, options buildOptions) (err error) {
218222
}
219223
}
220224

221-
contextPathHash := options.contextPath
222-
if absContextPath, err := filepath.Abs(contextPathHash); err == nil {
223-
contextPathHash = absContextPath
224-
}
225225
b, err := builder.New(dockerCli,
226226
builder.WithName(options.Builder),
227-
builder.WithContextPathHash(contextPathHash),
227+
builder.WithContextPathHash(opts.Inputs.ContextPathHash),
228228
)
229229
if err != nil {
230230
return err

0 commit comments

Comments
 (0)