Merge pull request #2863 from crazy-max/bake-fix-missing-default

bake: fix missing default target in group's default targets
This commit is contained in:
Tõnis Tiigi 2025-01-06 09:09:35 -08:00 committed by GitHub
commit 3a0eeeacd5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 68 additions and 13 deletions

View File

@ -9,6 +9,7 @@ import (
"path/filepath" "path/filepath"
"regexp" "regexp"
"slices" "slices"
"sort"
"strconv" "strconv"
"strings" "strings"
"time" "time"
@ -207,8 +208,9 @@ func ReadTargets(ctx context.Context, files []File, targets, overrides []string,
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
m := map[string]*Target{}
n := map[string]*Group{} targetsMap := map[string]*Target{}
groupsMap := map[string]*Group{}
for _, target := range targets { for _, target := range targets {
ts, gs := c.ResolveGroup(target) ts, gs := c.ResolveGroup(target)
for _, tname := range ts { for _, tname := range ts {
@ -217,13 +219,13 @@ func ReadTargets(ctx context.Context, files []File, targets, overrides []string,
return nil, nil, err return nil, nil, err
} }
if t != nil { if t != nil {
m[tname] = t targetsMap[tname] = t
} }
} }
for _, gname := range gs { for _, gname := range gs {
for _, group := range c.Groups { for _, group := range c.Groups {
if group.Name == gname { if group.Name == gname {
n[gname] = group groupsMap[gname] = group
break break
} }
} }
@ -231,25 +233,26 @@ func ReadTargets(ctx context.Context, files []File, targets, overrides []string,
} }
for _, target := range targets { for _, target := range targets {
if target == "default" { if _, ok := groupsMap["default"]; ok && target == "default" {
continue continue
} }
if _, ok := n["default"]; !ok { if _, ok := groupsMap["default"]; !ok {
n["default"] = &Group{Name: "default"} groupsMap["default"] = &Group{Name: "default"}
} }
n["default"].Targets = append(n["default"].Targets, target) groupsMap["default"].Targets = append(groupsMap["default"].Targets, target)
} }
if g, ok := n["default"]; ok { if g, ok := groupsMap["default"]; ok {
g.Targets = dedupSlice(g.Targets) g.Targets = dedupSlice(g.Targets)
sort.Strings(g.Targets)
} }
for name, t := range m { for name, t := range targetsMap {
if err := c.loadLinks(name, t, m, o, nil, ent); err != nil { if err := c.loadLinks(name, t, targetsMap, o, nil, ent); err != nil {
return nil, nil, err return nil, nil, err
} }
} }
return m, n, nil return targetsMap, groupsMap, nil
} }
func dedupSlice(s []string) []string { func dedupSlice(s []string) []string {

View File

@ -948,7 +948,7 @@ target "default" {
m, g, err := ReadTargets(ctx, []File{f}, []string{"default"}, nil, nil, &EntitlementConf{}) m, g, err := ReadTargets(ctx, []File{f}, []string{"default"}, nil, nil, &EntitlementConf{})
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, 0, len(g)) require.Equal(t, 1, len(g))
require.Equal(t, 1, len(m)) require.Equal(t, 1, len(m))
require.Equal(t, "test", *m["default"].Dockerfile) require.Equal(t, "test", *m["default"].Dockerfile)
} }
@ -2079,6 +2079,58 @@ target "app" {
require.Len(t, m["app"].Outputs, 0) require.Len(t, m["app"].Outputs, 0)
} }
// https://github.com/docker/buildx/issues/2859
func TestGroupTargetsWithDefault(t *testing.T) {
t.Run("OnTarget", func(t *testing.T) {
fp := File{
Name: "docker-bake.hcl",
Data: []byte(
`target "default" {
dockerfile = "Dockerfile"
platforms = ["linux/amd64"]
}
target "multiarch" {
dockerfile = "Dockerfile"
platforms = ["linux/amd64","linux/arm64","linux/arm/v7","linux/arm/v6"]
}`),
}
ctx := context.TODO()
_, g, err := ReadTargets(ctx, []File{fp}, []string{"default", "multiarch"}, nil, nil, &EntitlementConf{})
require.NoError(t, err)
require.Equal(t, 1, len(g))
require.Equal(t, 2, len(g["default"].Targets))
require.Equal(t, []string{"default", "multiarch"}, g["default"].Targets)
})
t.Run("OnGroup", func(t *testing.T) {
fp := File{
Name: "docker-bake.hcl",
Data: []byte(
`group "default" {
targets = ["app", "multiarch"]
}
target "app" {
dockerfile = "app.Dockerfile"
}
target "foo" {
dockerfile = "foo.Dockerfile"
}
target "multiarch" {
dockerfile = "Dockerfile"
platforms = ["linux/amd64","linux/arm64","linux/arm/v7","linux/arm/v6"]
}`),
}
ctx := context.TODO()
_, g, err := ReadTargets(ctx, []File{fp}, []string{"default", "foo"}, nil, nil, &EntitlementConf{})
require.NoError(t, err)
require.Equal(t, 1, len(g))
require.Equal(t, 3, len(g["default"].Targets))
require.Equal(t, []string{"app", "foo", "multiarch"}, g["default"].Targets)
})
}
func stringify[V fmt.Stringer](values []V) []string { func stringify[V fmt.Stringer](values []V) []string {
s := make([]string, len(values)) s := make([]string, len(values))
for i, v := range values { for i, v := range values {