Skip to content

Commit 2b5a8c6

Browse files
authored
Merge pull request #3280 from crazy-max/bake-target-pattern
bake: add pattern matching for targets input
2 parents 84f6e84 + 7c22db3 commit 2b5a8c6

File tree

2 files changed

+129
-0
lines changed

2 files changed

+129
-0
lines changed

bake/bake.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,16 @@ func ReadTargets(ctx context.Context, files []File, targets, overrides []string,
205205
targets[i] = sanitizeTargetName(t)
206206
}
207207

208+
var tms []string
209+
for _, t := range targets {
210+
names, err := c.matchNames(t)
211+
if err != nil {
212+
return nil, nil, err
213+
}
214+
tms = append(tms, names...)
215+
}
216+
targets = dedupSlice(tms)
217+
208218
o, err := c.newOverrides(overrides)
209219
if err != nil {
210220
return nil, nil, err
@@ -304,6 +314,27 @@ func sliceToMap(env []string) (res map[string]string) {
304314
return
305315
}
306316

317+
func (c Config) matchNames(pattern string) ([]string, error) {
318+
if !strings.ContainsAny(pattern, "*?[]") {
319+
return []string{pattern}, nil
320+
}
321+
var names []string
322+
for _, group := range c.Groups {
323+
if ok, err := path.Match(pattern, group.Name); ok && err == nil {
324+
names = append(names, group.Name)
325+
}
326+
}
327+
for _, target := range c.Targets {
328+
if ok, err := path.Match(pattern, target.Name); ok && err == nil {
329+
names = append(names, target.Name)
330+
}
331+
}
332+
if len(names) == 0 {
333+
return nil, errors.Errorf("could not find any target matching %q", pattern)
334+
}
335+
return names, nil
336+
}
337+
307338
func ParseFiles(files []File, defaults map[string]string) (_ *Config, _ *hclparser.ParseMeta, err error) {
308339
defer func() {
309340
err = formatHCLError(err, files)

bake/bake_test.go

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2300,6 +2300,104 @@ func TestGroupTargetsWithDefault(t *testing.T) {
23002300
})
23012301
}
23022302

2303+
func TestMatchNames(t *testing.T) {
2304+
ctx := context.TODO()
2305+
2306+
f := File{
2307+
Name: "docker-bake.hcl",
2308+
Data: []byte(`
2309+
group "default" {
2310+
targets = ["foo", "foo-bar"]
2311+
}
2312+
group "baz" {
2313+
targets = ["baz-foo", "baz-bar", "baz-fuu"]
2314+
}
2315+
target "foo" {}
2316+
target "foo-bar" {}
2317+
target "foo-baz" {}
2318+
target "foo-fuu" {}
2319+
target "bar-foo" {}
2320+
target "bar-baz" {}
2321+
target "bar-fuu" {}
2322+
target "baz-foo" {}
2323+
target "baz-bar" {}
2324+
target "baz-fuu" {}
2325+
target "mtx" {
2326+
name = "mtx-${foo}-${bar}-${baz}"
2327+
matrix = {
2328+
foo = ["a"]
2329+
bar = ["b", "c"]
2330+
baz = ["d", "e", "f"]
2331+
}
2332+
}
2333+
`),
2334+
}
2335+
2336+
cases := []struct {
2337+
name string
2338+
pattern []string
2339+
expected []string
2340+
wantErr bool
2341+
}{
2342+
{
2343+
name: "single",
2344+
pattern: []string{"foo"},
2345+
expected: []string{"foo"},
2346+
},
2347+
{
2348+
name: "starts with",
2349+
pattern: []string{"foo-*"},
2350+
expected: []string{"foo-bar", "foo-baz", "foo-fuu"},
2351+
},
2352+
{
2353+
name: "starts with group",
2354+
pattern: []string{"baz*"},
2355+
expected: []string{"baz-bar", "baz-foo", "baz-fuu"},
2356+
},
2357+
{
2358+
name: "matrix",
2359+
pattern: []string{"mtx"},
2360+
expected: []string{"mtx-a-b-d", "mtx-a-b-e", "mtx-a-b-f", "mtx-a-c-d", "mtx-a-c-e", "mtx-a-c-f"},
2361+
},
2362+
{
2363+
name: "matrix starts with",
2364+
pattern: []string{"mtx-a-b-*"},
2365+
expected: []string{"mtx-a-b-d", "mtx-a-b-e", "mtx-a-b-f"},
2366+
},
2367+
{
2368+
name: "any",
2369+
pattern: []string{"*"},
2370+
expected: []string{"bar-baz", "bar-foo", "bar-fuu", "baz-bar", "baz-foo", "baz-fuu", "foo", "foo-bar", "foo-baz", "foo-fuu", "mtx-a-b-d", "mtx-a-b-e", "mtx-a-b-f", "mtx-a-c-d", "mtx-a-c-e", "mtx-a-c-f"},
2371+
},
2372+
{
2373+
name: "any with group",
2374+
pattern: []string{"*", "default"},
2375+
expected: []string{"bar-baz", "bar-foo", "bar-fuu", "baz-bar", "baz-foo", "baz-fuu", "foo", "foo-bar", "foo-baz", "foo-fuu", "mtx-a-b-d", "mtx-a-b-e", "mtx-a-b-f", "mtx-a-c-d", "mtx-a-c-e", "mtx-a-c-f"},
2376+
},
2377+
{
2378+
name: "not found",
2379+
pattern: []string{"aaa-*"},
2380+
wantErr: true,
2381+
},
2382+
}
2383+
for _, tt := range cases {
2384+
t.Run(tt.name, func(t *testing.T) {
2385+
m, _, err := ReadTargets(ctx, []File{f}, tt.pattern, nil, nil, &EntitlementConf{})
2386+
if tt.wantErr {
2387+
require.Error(t, err)
2388+
} else {
2389+
require.NoError(t, err)
2390+
keys := make([]string, 0, len(m))
2391+
for k := range m {
2392+
keys = append(keys, k)
2393+
}
2394+
sort.Strings(keys)
2395+
require.Equal(t, tt.expected, keys)
2396+
}
2397+
})
2398+
}
2399+
}
2400+
23032401
func stringify[V fmt.Stringer](values []V) []string {
23042402
s := make([]string, len(values))
23052403
for i, v := range values {

0 commit comments

Comments
 (0)