Skip to content

Commit ce9e1da

Browse files
authored
[rayci] support select & tag together as a filter (#234)
If both selects and tags are provided as a filter, select nodes based on both filtering. I need this for using select in microcheck, otherwise we will incur costs by saving all microcheck tests on PR. Let me know if there is a better alternative. Test: - CI --------- Signed-off-by: can <[email protected]>
1 parent e7eddf8 commit ce9e1da

File tree

4 files changed

+71
-34
lines changed

4 files changed

+71
-34
lines changed

raycicmd/converter_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -540,7 +540,7 @@ func TestConvertPipelineGroup_priority(t *testing.T) {
540540
{"commands": []string{"default priority"}},
541541
},
542542
}
543-
filter := &stepFilter{tags: []string{}, runAll: true}
543+
filter := &stepFilter{tags: []string{}, runAllTags: true}
544544
bk, err := convertSingleGroup(c, g, filter)
545545
if err != nil {
546546
t.Fatalf("convert: %v", err)
@@ -589,7 +589,7 @@ func TestConvertPipelineGroup_dockerPlugin(t *testing.T) {
589589
"mount_buildkite_agent": false,
590590
}},
591591
}
592-
filter := &stepFilter{tags: []string{}, runAll: true}
592+
filter := &stepFilter{tags: []string{}, runAllTags: true}
593593
bk, err := convertSingleGroup(c, g, filter)
594594
if err != nil {
595595
t.Fatalf("convert: %v", err)

raycicmd/make.go

+7-9
Original file line numberDiff line numberDiff line change
@@ -90,15 +90,13 @@ func makePipeline(repoDir string, config *config, info *buildInfo) (
9090

9191
c := newConverter(config, info)
9292

93-
var filter *stepFilter
94-
if len(info.selects) > 0 {
95-
filter = newSelectStepFilter(config.SkipTags, info.selects)
96-
} else {
97-
f, err := newTagsStepFilter(config.SkipTags, config.TagFilterCommand)
98-
if err != nil {
99-
return nil, fmt.Errorf("run tag filter command: %w", err)
100-
}
101-
filter = f
93+
filter, err := newStepFilter(
94+
config.SkipTags,
95+
info.selects,
96+
config.TagFilterCommand,
97+
)
98+
if err != nil {
99+
return nil, fmt.Errorf("run tag filter command: %w", err)
102100
}
103101

104102
// Build steps for CI.

raycicmd/step_filter.go

+25-13
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,28 @@ type stepFilter struct {
1313
// selecting steps based on ID or key
1414
selects map[string]bool
1515

16-
runAll bool
17-
tags []string
16+
runAllTags bool
17+
tags []string
1818
}
1919

2020
func (f *stepFilter) reject(step *stepNode) bool {
2121
return step.hasTagIn(f.skipTags)
2222
}
2323

2424
func (f *stepFilter) accept(step *stepNode) bool {
25+
return f.acceptSelectHit(step) && f.acceptTagHit(step)
26+
}
27+
28+
func (f *stepFilter) acceptSelectHit(step *stepNode) bool {
2529
if f.selects != nil {
26-
// in key selection mode, hit when the step has any of the keys.
2730
return step.selectHit(f.selects)
2831
}
2932

30-
// in tags filtering mode
31-
if f.runAll {
33+
return true
34+
}
35+
36+
func (f *stepFilter) acceptTagHit(step *stepNode) bool {
37+
if f.runAllTags {
3238
return true
3339
}
3440

@@ -43,18 +49,24 @@ func (f *stepFilter) hit(step *stepNode) bool {
4349
return !f.reject(step) && f.accept(step)
4450
}
4551

46-
func newSelectStepFilter(skipTags []string, selects []string) *stepFilter {
47-
filter := &stepFilter{skipTags: skipTags, selects: make(map[string]bool)}
48-
for _, k := range selects {
49-
filter.selects[k] = true
52+
func newStepFilter(
53+
skipTags []string, selects []string, filterCmd []string,
54+
) (*stepFilter, error) {
55+
filter, err := stepFilterFromCmd(skipTags, filterCmd)
56+
if selects != nil && err == nil {
57+
filter.selects = make(map[string]bool)
58+
for _, k := range selects {
59+
filter.selects[k] = true
60+
}
5061
}
51-
return filter
62+
63+
return filter, err
5264
}
5365

54-
func newTagsStepFilter(skips []string, filterCmd []string) (
66+
func stepFilterFromCmd(skips []string, filterCmd []string) (
5567
*stepFilter, error,
5668
) {
57-
filter := &stepFilter{skipTags: skips, runAll: true}
69+
filter := &stepFilter{skipTags: skips, runAllTags: true}
5870

5971
if len(filterCmd) == 0 {
6072
return filter, nil
@@ -88,7 +100,7 @@ func newTagsStepFilter(skips []string, filterCmd []string) (
88100
if len(tags) == 0 {
89101
tags = nil
90102
}
91-
filter.runAll = false
103+
filter.runAllTags = false
92104
filter.tags = tags
93105

94106
return filter, nil

raycicmd/step_filter_test.go

+37-10
Original file line numberDiff line numberDiff line change
@@ -23,24 +23,24 @@ func TestNewTagsStepFilter(t *testing.T) {
2323
want: &stepFilter{},
2424
}, {
2525
cmd: []string{},
26-
want: &stepFilter{runAll: true},
26+
want: &stepFilter{runAllTags: true},
2727
}, {
2828
cmd: nil,
29-
want: &stepFilter{runAll: true},
29+
want: &stepFilter{runAllTags: true},
3030
}, {
3131
cmd: []string{"echo", "*"},
32-
want: &stepFilter{runAll: true},
32+
want: &stepFilter{runAllTags: true},
3333
}, {
3434
skipTags: []string{"disabled"},
35-
want: &stepFilter{skipTags: []string{"disabled"}, runAll: true},
35+
want: &stepFilter{skipTags: []string{"disabled"}, runAllTags: true},
3636
}, {
3737
cmd: []string{"exit", "1"},
3838
wantErr: true,
3939
}, {
4040
cmd: []string{"./local-not-exist.sh"},
41-
want: &stepFilter{runAll: true},
41+
want: &stepFilter{runAllTags: true},
4242
}} {
43-
got, err := newTagsStepFilter(test.skipTags, test.cmd)
43+
got, err := newStepFilter(test.skipTags, nil, test.cmd)
4444
if test.wantErr {
4545
if err == nil {
4646
t.Errorf("run %q: want error, got nil", test.cmd)
@@ -145,8 +145,8 @@ func TestStepFilter_tagsReject(t *testing.T) {
145145

146146
func TestStepFilter_runAll(t *testing.T) {
147147
filter := &stepFilter{
148-
skipTags: []string{"disabled"},
149-
runAll: true,
148+
skipTags: []string{"disabled"},
149+
runAllTags: true,
150150
}
151151

152152
for _, tags := range [][]string{
@@ -173,7 +173,7 @@ func TestStepFilter_runAll(t *testing.T) {
173173
}
174174

175175
func TestStepFilter_selects(t *testing.T) {
176-
filter := newSelectStepFilter([]string{"disabled"}, []string{"foo", "bar"})
176+
filter, _ := newStepFilter([]string{"disabled"}, []string{"foo", "bar"}, nil)
177177
for _, node := range []*stepNode{
178178
{key: "foo"},
179179
{id: "foo"},
@@ -192,7 +192,7 @@ func TestStepFilter_selects(t *testing.T) {
192192
}
193193
}
194194

195-
filter = newSelectStepFilter([]string{"disabled"}, []string{"foo", "bar"})
195+
filter, _ = newStepFilter([]string{"disabled"}, []string{"foo", "bar"}, nil)
196196
for _, node := range []*stepNode{
197197
{key: "f"},
198198
{id: "f"},
@@ -204,3 +204,30 @@ func TestStepFilter_selects(t *testing.T) {
204204
}
205205
}
206206
}
207+
208+
func TestStepFilter_selectsAndTags(t *testing.T) {
209+
filter, _ := newStepFilter(
210+
[]string{"disabled"},
211+
[]string{"foo", "bar"},
212+
[]string{"echo", "tune"},
213+
)
214+
for _, node := range []*stepNode{
215+
{key: "foo"},
216+
{id: "foo", tags: []string{"tune"}},
217+
{id: "bar"},
218+
} {
219+
if !filter.accept(node) {
220+
t.Errorf("miss %+v", node)
221+
}
222+
}
223+
224+
for _, node := range []*stepNode{
225+
{id: "foo", tags: []string{"not_tune"}},
226+
{id: "bar", tags: []string{"tune_not"}},
227+
{key: "w00t"},
228+
} {
229+
if filter.accept(node) {
230+
t.Errorf("miss %+v", node)
231+
}
232+
}
233+
}

0 commit comments

Comments
 (0)