diff --git a/bake/bake.go b/bake/bake.go index 49a1cf75..d98cd7be 100644 --- a/bake/bake.go +++ b/bake/bake.go @@ -9,6 +9,7 @@ import ( "path/filepath" "regexp" "slices" + "sort" "strconv" "strings" "time" @@ -207,8 +208,9 @@ func ReadTargets(ctx context.Context, files []File, targets, overrides []string, if err != nil { return nil, nil, err } - m := map[string]*Target{} - n := map[string]*Group{} + + targetsMap := map[string]*Target{} + groupsMap := map[string]*Group{} for _, target := range targets { ts, gs := c.ResolveGroup(target) for _, tname := range ts { @@ -217,13 +219,13 @@ func ReadTargets(ctx context.Context, files []File, targets, overrides []string, return nil, nil, err } if t != nil { - m[tname] = t + targetsMap[tname] = t } } for _, gname := range gs { for _, group := range c.Groups { if group.Name == gname { - n[gname] = group + groupsMap[gname] = group break } } @@ -231,25 +233,26 @@ func ReadTargets(ctx context.Context, files []File, targets, overrides []string, } for _, target := range targets { - if target == "default" { + if _, ok := groupsMap["default"]; ok && target == "default" { continue } - if _, ok := n["default"]; !ok { - n["default"] = &Group{Name: "default"} + if _, ok := groupsMap["default"]; !ok { + 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) + sort.Strings(g.Targets) } - for name, t := range m { - if err := c.loadLinks(name, t, m, o, nil, ent); err != nil { + for name, t := range targetsMap { + if err := c.loadLinks(name, t, targetsMap, o, nil, ent); err != nil { return nil, nil, err } } - return m, n, nil + return targetsMap, groupsMap, nil } func dedupSlice(s []string) []string { diff --git a/bake/bake_test.go b/bake/bake_test.go index 114a6932..15a3333d 100644 --- a/bake/bake_test.go +++ b/bake/bake_test.go @@ -948,7 +948,7 @@ target "default" { m, g, err := ReadTargets(ctx, []File{f}, []string{"default"}, nil, nil, &EntitlementConf{}) 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, "test", *m["default"].Dockerfile) } @@ -2079,6 +2079,58 @@ target "app" { 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 { s := make([]string, len(values)) for i, v := range values {