diff --git a/bake/bake.go b/bake/bake.go index 43e77b8a..16b4e37e 100644 --- a/bake/bake.go +++ b/bake/bake.go @@ -378,7 +378,12 @@ func (c Config) group(name string, visited map[string]struct{}) []string { visited[name] = struct{}{} targets := make([]string, 0, len(g.Targets)) for _, t := range g.Targets { - targets = append(targets, c.group(t, visited)...) + tgroup := c.group(t, visited) + if len(tgroup) > 0 { + targets = append(targets, tgroup...) + } else { + targets = append(targets, t) + } } return targets } diff --git a/bake/bake_test.go b/bake/bake_test.go index dc83e963..94355551 100644 --- a/bake/bake_test.go +++ b/bake/bake_test.go @@ -585,3 +585,69 @@ services: require.Equal(t, "./Dockerfile", *m["addon"].Dockerfile) require.Equal(t, "./aws.Dockerfile", *m["aws"].Dockerfile) } + +func TestReadTargetsSameGroupTarget(t *testing.T) { + t.Parallel() + ctx := context.TODO() + + f := File{ + Name: "docker-bake.hcl", + Data: []byte(` +group "foo" { + targets = ["foo"] +} +target "foo" { + dockerfile = "bar" +} +target "image" { + output = ["type=docker"] +}`)} + + m, g, err := ReadTargets(ctx, []File{f}, []string{"foo"}, nil, nil) + require.NoError(t, err) + require.Equal(t, 1, len(g)) + require.Equal(t, []string{"foo"}, g[0].Targets) + require.Equal(t, 1, len(m)) + require.Equal(t, "bar", *m["foo"].Dockerfile) + + m, g, err = ReadTargets(ctx, []File{f}, []string{"foo", "foo"}, nil, nil) + require.NoError(t, err) + require.Equal(t, 1, len(g)) + require.Equal(t, []string{"foo"}, g[0].Targets) + require.Equal(t, 1, len(m)) + require.Equal(t, "bar", *m["foo"].Dockerfile) +} + +func TestReadTargetsSameGroupTargetMulti(t *testing.T) { + t.Parallel() + ctx := context.TODO() + + f := File{ + Name: "docker-bake.hcl", + Data: []byte(` +group "foo" { + targets = ["foo", "image"] +} +target "foo" { + dockerfile = "bar" +} +target "image" { + output = ["type=docker"] +}`)} + + m, g, err := ReadTargets(ctx, []File{f}, []string{"foo"}, nil, nil) + require.NoError(t, err) + require.Equal(t, 1, len(g)) + require.Equal(t, []string{"foo", "image"}, g[0].Targets) + require.Equal(t, 2, len(m)) + require.Equal(t, "bar", *m["foo"].Dockerfile) + require.Equal(t, "type=docker", m["image"].Outputs[0]) + + m, g, err = ReadTargets(ctx, []File{f}, []string{"foo", "image"}, nil, nil) + require.NoError(t, err) + require.Equal(t, 1, len(g)) + require.Equal(t, []string{"foo", "image"}, g[0].Targets) + require.Equal(t, 2, len(m)) + require.Equal(t, "bar", *m["foo"].Dockerfile) + require.Equal(t, "type=docker", m["image"].Outputs[0]) +}