Skip to content

Commit 915deb5

Browse files
authored
Merge branch 'main' into billy/fix/claude-code-org-id
2 parents 733ea9d + 826a49c commit 915deb5

File tree

4 files changed

+72
-20
lines changed

4 files changed

+72
-20
lines changed

pkg/buildx/build/build.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1252,7 +1252,12 @@ func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[s
12521252
}
12531253
}
12541254

1255-
dt, desc, err := itpull.Combine(ctx, srcs, nil)
1255+
indexAnnotations, err := extractIndexAnnotations(opt.Exports)
1256+
if err != nil {
1257+
return err
1258+
}
1259+
1260+
dt, desc, err := itpull.Combine(ctx, srcs, indexAnnotations)
12561261
if err != nil {
12571262
return err
12581263
}
@@ -1332,6 +1337,23 @@ func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[s
13321337
return resp, nil
13331338
}
13341339

1340+
// extractIndexAnnotations extracts annotations for the OCI index from export attributes
1341+
func extractIndexAnnotations(exports []client.ExportEntry) ([]string, error) {
1342+
var annotations []string
1343+
for _, exp := range exports {
1344+
for k, v := range exp.Attrs {
1345+
if key, ok := strings.CutPrefix(k, "annotation-index."); ok {
1346+
annotations = append(annotations, fmt.Sprintf("index:%s=%s", key, v))
1347+
} else if key, ok := strings.CutPrefix(k, "annotation-manifest-descriptor."); ok {
1348+
annotations = append(annotations, fmt.Sprintf("manifest-descriptor:%s=%s", key, v))
1349+
} else if key, ok := strings.CutPrefix(k, "annotation."); ok && !strings.Contains(k, "-") {
1350+
annotations = append(annotations, fmt.Sprintf("%s=%s", key, v))
1351+
}
1352+
}
1353+
}
1354+
return annotations, nil
1355+
}
1356+
13351357
func pushWithMoby(ctx context.Context, d driver.Driver, name string, l progress.SubLogger) error {
13361358
api := d.Config().DockerAPI
13371359
if api == nil {

pkg/buildx/commands/bake.go

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ func RunBake(dockerCli command.Cli, in BakeOptions, validator BakeValidator, pri
139139
AdditionalTags: in.additionalTags,
140140
AdditionalCredentials: in.additionalCredentials,
141141
AddTargetSuffix: true,
142+
RequestedTargets: requestedTargets,
142143
}
143144
buildOpts = registry.WithDepotSave(buildOpts, opts)
144145
}
@@ -178,9 +179,12 @@ func RunBake(dockerCli command.Cli, in BakeOptions, validator BakeValidator, pri
178179
metadata[k] = v
179180
}
180181
}
181-
dt[buildRes.Name] = metadata
182+
// Only include targets that have metadata (i.e., were exported)
183+
if len(metadata) > 0 {
184+
dt[buildRes.Name] = metadata
185+
}
182186
}
183-
err = writeMetadataFile(in.metadataFile, in.project, in.buildID, requestedTargets, dt)
187+
err = writeMetadataFile(in.metadataFile, in.project, in.buildID, requestedTargets, dt, true)
184188
if err != nil {
185189
return err
186190
}
@@ -476,20 +480,26 @@ func (t *LocalBakeValidator) Validate(ctx context.Context, _ []builder.Node, _ p
476480
"BAKE_LOCAL_PLATFORM": platforms.DefaultString(),
477481
}
478482

479-
targets, groups, err := bake.ReadTargets(ctx, files, t.bakeTargets.Targets, overrides, defaults)
483+
targets, _, err := bake.ReadTargets(ctx, files, t.bakeTargets.Targets, overrides, defaults)
484+
if err != nil {
485+
t.err = err
486+
return
487+
}
488+
489+
// Parse config to properly resolve groups
490+
c, err := bake.ParseFiles(files, defaults)
480491
if err != nil {
481492
t.err = err
482493
return
483494
}
484495

485496
resolvedTargets := map[string]struct{}{}
486497
for _, target := range t.bakeTargets.Targets {
487-
if _, ok := targets[target]; ok {
488-
resolvedTargets[target] = struct{}{}
489-
}
490-
if _, ok := groups[target]; ok {
491-
for _, t := range groups[target].Targets {
492-
resolvedTargets[t] = struct{}{}
498+
// Use ResolveGroup to recursively resolve groups to their targets
499+
ts, _ := c.ResolveGroup(target)
500+
for _, tname := range ts {
501+
if _, ok := targets[tname]; ok {
502+
resolvedTargets[tname] = struct{}{}
493503
}
494504
}
495505
}
@@ -539,20 +549,25 @@ func (t *RemoteBakeValidator) Validate(ctx context.Context, nodes []builder.Node
539549
"BAKE_LOCAL_PLATFORM": platforms.DefaultString(),
540550
}
541551

542-
targets, groups, err := bake.ReadTargets(ctx, files, t.bakeTargets.Targets, overrides, defaults)
552+
targets, _, err := bake.ReadTargets(ctx, files, t.bakeTargets.Targets, overrides, defaults)
553+
if err != nil {
554+
return nil, nil, err
555+
}
556+
557+
// Parse config to properly resolve groups
558+
c, err := bake.ParseFiles(files, defaults)
543559
if err != nil {
544560
return nil, nil, err
545561
}
546562

547563
requestedTargets := []string{}
548564
uniqueTargets := map[string]struct{}{}
549565
for _, target := range t.bakeTargets.Targets {
550-
if _, ok := targets[target]; ok {
551-
uniqueTargets[target] = struct{}{}
552-
}
553-
if _, ok := groups[target]; ok {
554-
for _, t := range groups[target].Targets {
555-
uniqueTargets[t] = struct{}{}
566+
// Use ResolveGroup to recursively resolve groups to their targets
567+
ts, _ := c.ResolveGroup(target)
568+
for _, tname := range ts {
569+
if _, ok := targets[tname]; ok {
570+
uniqueTargets[tname] = struct{}{}
556571
}
557572
}
558573
}

pkg/buildx/commands/build.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ func buildTargets(ctx context.Context, dockerCli command.Cli, nodes []builder.No
306306
}
307307
}
308308

309-
if err := writeMetadataFile(metadataFile, depotOpts.project, depotOpts.buildID, nil, metadata); err != nil {
309+
if err := writeMetadataFile(metadataFile, depotOpts.project, depotOpts.buildID, nil, metadata, false); err != nil {
310310
return nil, nil, err
311311
}
312312
}
@@ -1001,15 +1001,23 @@ func parsePrintFunc(str string) (*build.PrintFunc, error) {
10011001
return f, nil
10021002
}
10031003

1004-
func writeMetadataFile(filename, projectID, buildID string, targets []string, metadata map[string]interface{}) error {
1004+
func writeMetadataFile(filename, projectID, buildID string, requestedTargets []string, metadata map[string]interface{}, isBake bool) error {
10051005
depotBuild := struct {
10061006
BuildID string `json:"buildID"`
10071007
ProjectID string `json:"projectID"`
10081008
Targets []string `json:"targets,omitempty"`
10091009
}{
10101010
BuildID: buildID,
10111011
ProjectID: projectID,
1012-
Targets: targets,
1012+
}
1013+
1014+
if isBake {
1015+
// If requestedTargets was provided, use that; otherwise use all metadata keys
1016+
if len(requestedTargets) > 0 {
1017+
depotBuild.Targets = requestedTargets
1018+
} else {
1019+
depotBuild.Targets = maps.Keys(metadata)
1020+
}
10131021
}
10141022

10151023
metadata["depot.build"] = depotBuild

pkg/registry/cli.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ type SaveOptions struct {
1515
// AddTargetSuffix adds the target suffix to the additional tags.
1616
// Useful for bake targets.
1717
AddTargetSuffix bool
18+
// RequestedTargets are the targets explicitly requested by the user (not dependencies).
19+
// If set, only these targets will be saved/pushed.
20+
RequestedTargets []string
1821
}
1922

2023
// WithDepotSave adds an output type image with a push to the depot registry.
@@ -25,6 +28,10 @@ func WithDepotSave(buildOpts map[string]buildx.Options, opts SaveOptions) map[st
2528
}
2629

2730
for target, buildOpt := range buildOpts {
31+
// If RequestedTargets is set and this target is not in the list, skip it
32+
if len(opts.RequestedTargets) > 0 && !slices.Contains(opts.RequestedTargets, target) {
33+
continue
34+
}
2835
buildOpt.Session = ReplaceDockerAuth(opts.AdditionalCredentials, buildOpt.Session)
2936

3037
hadPush := false

0 commit comments

Comments
 (0)