Skip to content

Commit f2a51b8

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 a map of responses and result context is returned as bake can handle a list of targets. Signed-off-by: CrazyMax <[email protected]>
1 parent 6fef51d commit f2a51b8

File tree

8 files changed

+107
-63
lines changed

8 files changed

+107
-63
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
@@ -667,7 +667,7 @@ func Build(ctx context.Context, nodes []builder.Node, opt map[string]Options, do
667667
return BuildWithResultHandler(ctx, nodes, opt, docker, configDir, w, nil)
668668
}
669669

670-
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 *ResultContext)) (resp map[string]*client.SolveResponse, err error) {
670+
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 *ResultContext)) (resp map[string]*client.SolveResponse, err error) {
671671
if len(nodes) == 0 {
672672
return nil, errors.Errorf("driver required for build")
673673
}
@@ -932,7 +932,7 @@ func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[s
932932
if resultHandleFunc != nil {
933933
resultCtx, err := NewResultContext(ctx, cc, so, res)
934934
if err == nil {
935-
resultHandleFunc(dp.driverIndex, resultCtx)
935+
resultHandleFunc(k, resultCtx)
936936
} else {
937937
logrus.Warnf("failed to record result: %s", err)
938938
}

commands/bake.go

+16-18
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ import (
1010
"github.com/docker/buildx/bake"
1111
"github.com/docker/buildx/build"
1212
"github.com/docker/buildx/builder"
13+
cbuild "github.com/docker/buildx/controller/build"
14+
controllerapi "github.com/docker/buildx/controller/pb"
1315
"github.com/docker/buildx/util/buildflags"
1416
"github.com/docker/buildx/util/cobrautil/completion"
15-
"github.com/docker/buildx/util/confutil"
16-
"github.com/docker/buildx/util/dockerutil"
1717
"github.com/docker/buildx/util/progress"
1818
"github.com/docker/buildx/util/tracing"
1919
"github.com/docker/cli/cli/command"
@@ -29,10 +29,8 @@ type bakeOptions struct {
2929
sbom string
3030
provenance string
3131

32-
builder string
33-
metadataFile string
34-
exportPush bool
35-
exportLoad bool
32+
controllerapi.CommonOptions
33+
//control.ControlOptions
3634
}
3735

3836
func runBake(dockerCli command.Cli, targets []string, in bakeOptions, cFlags commonFlags) (err error) {
@@ -67,12 +65,12 @@ func runBake(dockerCli command.Cli, targets []string, in bakeOptions, cFlags com
6765
}
6866

6967
overrides := in.overrides
70-
if in.exportPush {
71-
if in.exportLoad {
68+
if in.ExportPush {
69+
if in.ExportLoad {
7270
return errors.Errorf("push and load may not be set together at the moment")
7371
}
7472
overrides = append(overrides, "*.push=true")
75-
} else if in.exportLoad {
73+
} else if in.ExportLoad {
7674
overrides = append(overrides, "*.output=type=docker")
7775
}
7876
if cFlags.noCache != nil {
@@ -100,7 +98,7 @@ func runBake(dockerCli command.Cli, targets []string, in bakeOptions, cFlags com
10098
// instance only needed for reading remote bake files or building
10199
if url != "" || !in.printOnly {
102100
b, err := builder.New(dockerCli,
103-
builder.WithName(in.builder),
101+
builder.WithName(in.Builder),
104102
builder.WithContextPathHash(contextPathHash),
105103
)
106104
if err != nil {
@@ -166,7 +164,7 @@ func runBake(dockerCli command.Cli, targets []string, in bakeOptions, cFlags com
166164
}
167165

168166
// this function can update target context string from the input so call before printOnly check
169-
bo, err := bake.TargetsToBuildOpt(tgts, inp)
167+
opts, err := bake.TargetsToControllerOptions(tgts, inp)
170168
if err != nil {
171169
return err
172170
}
@@ -191,17 +189,17 @@ func runBake(dockerCli command.Cli, targets []string, in bakeOptions, cFlags com
191189
return nil
192190
}
193191

194-
resp, err := build.Build(ctx, nodes, bo, dockerutil.NewClient(dockerCli), confutil.ConfigDir(dockerCli), printer)
192+
resp, _, err := cbuild.RunBuilds(ctx, dockerCli, in.Builder, opts, os.Stdin, printer, false)
195193
if err != nil {
196194
return wrapBuildError(err, true)
197195
}
198196

199-
if len(in.metadataFile) > 0 {
197+
if len(in.MetadataFile) > 0 {
200198
dt := make(map[string]interface{})
201199
for t, r := range resp {
202200
dt[t] = decodeExporterResponse(r.ExporterResponse)
203201
}
204-
if err := writeMetadataFile(in.metadataFile, dt); err != nil {
202+
if err := writeMetadataFile(in.MetadataFile, dt); err != nil {
205203
return err
206204
}
207205
}
@@ -225,8 +223,8 @@ func bakeCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
225223
if !cmd.Flags().Lookup("pull").Changed {
226224
cFlags.pull = nil
227225
}
228-
options.builder = rootOpts.builder
229-
options.metadataFile = cFlags.metadataFile
226+
options.Builder = rootOpts.builder
227+
options.MetadataFile = cFlags.metadataFile
230228
// Other common flags (noCache, pull and progress) are processed in runBake function.
231229
return runBake(dockerCli, args, options, cFlags)
232230
},
@@ -236,9 +234,9 @@ func bakeCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command {
236234
flags := cmd.Flags()
237235

238236
flags.StringArrayVarP(&options.files, "file", "f", []string{}, "Build definition file")
239-
flags.BoolVar(&options.exportLoad, "load", false, `Shorthand for "--set=*.output=type=docker"`)
237+
flags.BoolVar(&options.ExportLoad, "load", false, `Shorthand for "--set=*.output=type=docker"`)
240238
flags.BoolVar(&options.printOnly, "print", false, "Print the options without building")
241-
flags.BoolVar(&options.exportPush, "push", false, `Shorthand for "--set=*.output=type=registry"`)
239+
flags.BoolVar(&options.ExportPush, "push", false, `Shorthand for "--set=*.output=type=registry"`)
242240
flags.StringVar(&options.sbom, "sbom", "", `Shorthand for "--set=*.attest=type=sbom"`)
243241
flags.StringVar(&options.provenance, "provenance", "", `Shorthand for "--set=*.attest=type=provenance"`)
244242
flags.StringArrayVar(&options.overrides, "set", nil, `Override target value (e.g., "targetpattern.key=value")`)

commands/build.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ func getImageID(resp map[string]string) string {
299299
}
300300

301301
func runBasicBuild(ctx context.Context, dockerCli command.Cli, opts *controllerapi.BuildOptions, options buildOptions, printer *progress.Printer) (*client.SolveResponse, error) {
302-
resp, _, err := cbuild.RunBuild(ctx, dockerCli, *opts, os.Stdin, printer, false)
302+
resp, _, err := cbuild.RunBuild(ctx, dockerCli, options.Builder, opts, os.Stdin, printer, false)
303303
return resp, err
304304
}
305305

0 commit comments

Comments
 (0)