Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions ast.go
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,8 @@ type Concurrency struct {
Group *String
// CancelInProgress is a flag that shows if canceling this workflow cancels other jobs in progress.
CancelInProgress *Bool
// Queue is the queue strategy for pending workflow runs. Valid values are "single" (default) and "max".
Queue *String
// Pos is a position in source.
Pos *Pos
}
Expand Down
15 changes: 14 additions & 1 deletion parse.go
Original file line number Diff line number Diff line change
Expand Up @@ -820,13 +820,26 @@ func (p *parser) parseConcurrency(pos *Pos, n *yaml.Node) *Concurrency {
ret.Group = p.parseString(e.val, false)
case "cancel-in-progress":
ret.CancelInProgress = p.parseBool(e.val)
case "queue":
ret.Queue = p.parseString(e.val, false)
if ret.Queue != nil && !ret.Queue.ContainsExpression() {
switch ret.Queue.Value {
case "max", "single":
// ok
default:
p.errorf(e.val, "invalid value %q for \"queue\" in \"concurrency\" section. valid values are \"max\" and \"single\"", ret.Queue.Value)
}
}
default:
p.unexpectedKey(e.key, "concurrency", []string{"group", "cancel-in-progress"})
p.unexpectedKey(e.key, "concurrency", []string{"cancel-in-progress", "group", "queue"})
}
}
if ret.Group == nil {
p.errorAt(pos, "group name is missing in \"concurrency\" section")
}
if ret.Queue != nil && ret.CancelInProgress != nil && !ret.Queue.ContainsExpression() && ret.Queue.Value == "max" && ret.CancelInProgress.Expression == nil && ret.CancelInProgress.Value {
p.errorfAt(ret.Queue.Pos, "\"queue: max\" cannot be combined with \"cancel-in-progress: true\" in \"concurrency\" section")
}
return ret
}

Expand Down
1 change: 1 addition & 0 deletions rule_expression.go
Original file line number Diff line number Diff line change
Expand Up @@ -511,6 +511,7 @@ func (rule *RuleExpression) checkConcurrency(c *Concurrency, workflowKey string)
}
rule.checkString(c.Group, workflowKey)
rule.checkBool(c.CancelInProgress, workflowKey)
rule.checkString(c.Queue, workflowKey)
}

func (rule *RuleExpression) checkDefaults(d *Defaults, workflowKey string) {
Expand Down
4 changes: 2 additions & 2 deletions testdata/err/case_sensitive_keys.out
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ test.yaml:22:9: unexpected key "DESCRIPTION" for outputs at workflow_call event.
test.yaml:25:5: unexpected key "BRANCHES" for "push" section. expected one of "branches", "branches-ignore", "paths", "paths-ignore", "tags", "tags-ignore", "types", "workflows" [syntax-check]
test.yaml:28:3: expected "run" key for "defaults" section but got "RUN" [syntax-check]
test.yaml:30:5: unexpected key "SHELL" for "run" section. expected one of "shell", "working-directory" [syntax-check]
test.yaml:33:3: unexpected key "GROUP" for "concurrency" section. expected one of "cancel-in-progress", "group" [syntax-check]
test.yaml:33:3: unexpected key "GROUP" for "concurrency" section. expected one of "cancel-in-progress", "group", "queue" [syntax-check]
test.yaml:39:5: unexpected key "NAME" for "job" section. expected one of "concurrency", "container", "continue-on-error", "defaults", "env", "environment", "if", "name", "needs", "outputs", "permissions", "runs-on", "secrets", "services", "snapshot", "steps", "strategy", "timeout-minutes", "uses", "with" [syntax-check]
test.yaml:41:7: unexpected key "GROUP" for "concurrency" section. expected one of "cancel-in-progress", "group" [syntax-check]
test.yaml:41:7: unexpected key "GROUP" for "concurrency" section. expected one of "cancel-in-progress", "group", "queue" [syntax-check]
test.yaml:44:7: unexpected key "NAME" for "environment" section. expected one of "deployment", "name", "url" [syntax-check]
test.yaml:47:7: expected "run" key for "defaults" section but got "RUN" [syntax-check]
test.yaml:49:9: unexpected key "SHELL" for "run" section. expected one of "shell", "working-directory" [syntax-check]
Expand Down
2 changes: 2 additions & 0 deletions testdata/err/concurrency_queue.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
test.yaml:5:10: invalid value "invalid" for "queue" in "concurrency" section. valid values are "max" and "single" [syntax-check]
test.yaml:13:14: "queue: max" cannot be combined with "cancel-in-progress: true" in "concurrency" section [syntax-check]
15 changes: 15 additions & 0 deletions testdata/err/concurrency_queue.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
on: push

concurrency:
group: test
queue: invalid

jobs:
test:
runs-on: ubuntu-latest
concurrency:
group: job-test
cancel-in-progress: true
queue: max
steps:
- run: echo
2 changes: 1 addition & 1 deletion testdata/err/unexpected_keys.out
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ test.yaml:22:9: unexpected key "invalid_key" for outputs at workflow_call event.
test.yaml:23:5: unexpected key "invalid_key" for "workflow_call" section. expected one of "inputs", "outputs", "secrets" [syntax-check]
test.yaml:27:5: unexpected key "invalid_key" for "run" section. expected one of "shell", "working-directory" [syntax-check]
test.yaml:28:3: expected "run" key for "defaults" section but got "invalid_key" [syntax-check]
test.yaml:32:3: unexpected key "invalid_key" for "concurrency" section. expected one of "cancel-in-progress", "group" [syntax-check]
test.yaml:32:3: unexpected key "invalid_key" for "concurrency" section. expected one of "cancel-in-progress", "group", "queue" [syntax-check]
test.yaml:38:7: unexpected key "invalid_key" for "environment" section. expected one of "deployment", "name", "url" [syntax-check]
test.yaml:40:7: unexpected key "invalid_key" for "strategy" section. expected one of "fail-fast", "matrix", "max-parallel" [syntax-check]
test.yaml:46:9: unexpected key "invalid_key" for "credentials" section. expected one of "password", "username" [syntax-check]
Expand Down
22 changes: 22 additions & 0 deletions testdata/ok/concurrency_queue.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
on: push

concurrency:
group: deploy-queue
queue: max

jobs:
test:
runs-on: ubuntu-latest
concurrency:
group: job-queue
cancel-in-progress: false
queue: max
steps:
- run: echo "deploy"
test2:
runs-on: ubuntu-latest
concurrency:
group: job-single
queue: single
steps:
- run: echo "single"