Skip to content

Commit 04011b6

Browse files
feat: support runs-on labels and group (#2062)
Signed-off-by: Raffael Sahli <[email protected]> Co-authored-by: ChristopherHX <[email protected]>
1 parent c8f847d commit 04011b6

File tree

2 files changed

+61
-2
lines changed

2 files changed

+61
-2
lines changed

pkg/model/workflow.go

+26-2
Original file line numberDiff line numberDiff line change
@@ -275,15 +275,39 @@ func (j *Job) Needs() []string {
275275
// RunsOn list for Job
276276
func (j *Job) RunsOn() []string {
277277
switch j.RawRunsOn.Kind {
278+
case yaml.MappingNode:
279+
var val struct {
280+
Group string
281+
Labels yaml.Node
282+
}
283+
284+
if !decodeNode(j.RawRunsOn, &val) {
285+
return nil
286+
}
287+
288+
labels := nodeAsStringSlice(val.Labels)
289+
290+
if val.Group != "" {
291+
labels = append(labels, val.Group)
292+
}
293+
294+
return labels
295+
default:
296+
return nodeAsStringSlice(j.RawRunsOn)
297+
}
298+
}
299+
300+
func nodeAsStringSlice(node yaml.Node) []string {
301+
switch node.Kind {
278302
case yaml.ScalarNode:
279303
var val string
280-
if !decodeNode(j.RawRunsOn, &val) {
304+
if !decodeNode(node, &val) {
281305
return nil
282306
}
283307
return []string{val}
284308
case yaml.SequenceNode:
285309
var val []string
286-
if !decodeNode(j.RawRunsOn, &val) {
310+
if !decodeNode(node, &val) {
287311
return nil
288312
}
289313
return val

pkg/model/workflow_test.go

+35
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,41 @@ jobs:
7171
assert.Contains(t, workflow.On(), "pull_request")
7272
}
7373

74+
func TestReadWorkflow_RunsOnLabels(t *testing.T) {
75+
yaml := `
76+
name: local-action-docker-url
77+
78+
jobs:
79+
test:
80+
container: nginx:latest
81+
runs-on:
82+
labels: ubuntu-latest
83+
steps:
84+
- uses: ./actions/docker-url`
85+
86+
workflow, err := ReadWorkflow(strings.NewReader(yaml))
87+
assert.NoError(t, err, "read workflow should succeed")
88+
assert.Equal(t, workflow.Jobs["test"].RunsOn(), []string{"ubuntu-latest"})
89+
}
90+
91+
func TestReadWorkflow_RunsOnLabelsWithGroup(t *testing.T) {
92+
yaml := `
93+
name: local-action-docker-url
94+
95+
jobs:
96+
test:
97+
container: nginx:latest
98+
runs-on:
99+
labels: [ubuntu-latest]
100+
group: linux
101+
steps:
102+
- uses: ./actions/docker-url`
103+
104+
workflow, err := ReadWorkflow(strings.NewReader(yaml))
105+
assert.NoError(t, err, "read workflow should succeed")
106+
assert.Equal(t, workflow.Jobs["test"].RunsOn(), []string{"ubuntu-latest", "linux"})
107+
}
108+
74109
func TestReadWorkflow_StringContainer(t *testing.T) {
75110
yaml := `
76111
name: local-action-docker-url

0 commit comments

Comments
 (0)