diff --git a/services/actions/concurrency.go b/services/actions/concurrency.go index 7a5c24bd5a976..e3cdfff878161 100644 --- a/services/actions/concurrency.go +++ b/services/actions/concurrency.go @@ -7,11 +7,26 @@ import ( "fmt" actions_model "code.gitea.io/gitea/models/actions" + "code.gitea.io/gitea/modules/json" + api "code.gitea.io/gitea/modules/structs" "github.com/nektos/act/pkg/jobparser" act_model "github.com/nektos/act/pkg/model" ) +func EvaluateWorkflowConcurrency(run *actions_model.ActionRun, rc *act_model.RawConcurrency, vars map[string]string) (string, bool, error) { + gitCtx := jobparser.ToGitContext(GenerateGitContext(run, nil)) + inputs, err := getInputsFromRun(run) + if err != nil { + return "", false, fmt.Errorf("get inputs: %w", err) + } + jobResults := map[string]*jobparser.JobResult{"": {}} + + concurrencyGroup, concurrencyCancel := jobparser.EvaluateConcurrency(rc, "", gitCtx, jobResults, vars, inputs) + + return concurrencyGroup, concurrencyCancel, nil +} + func EvaluateJobConcurrency(run *actions_model.ActionRun, actionRunJob *actions_model.ActionRunJob, vars map[string]string, jobResults map[string]*jobparser.JobResult) (string, bool, error) { rawConcurrency := &act_model.RawConcurrency{ Group: actionRunJob.RawConcurrencyGroup, @@ -19,6 +34,10 @@ func EvaluateJobConcurrency(run *actions_model.ActionRun, actionRunJob *actions_ } gitCtx := jobparser.ToGitContext(GenerateGitContext(run, actionRunJob)) + inputs, err := getInputsFromRun(run) + if err != nil { + return "", false, fmt.Errorf("get inputs: %w", err) + } singleWorkflows, err := jobparser.Parse([]byte(actionRunJob.WorkflowPayload)) if err != nil { @@ -34,7 +53,18 @@ func EvaluateJobConcurrency(run *actions_model.ActionRun, actionRunJob *actions_ Needs: actionRunJob.Needs, } - concurrencyGroup, concurrencyCancel := jobparser.EvaluateJobConcurrency(rawConcurrency, actionRunJob.JobID, gitCtx, vars, jobResults) + concurrencyGroup, concurrencyCancel := jobparser.EvaluateConcurrency(rawConcurrency, actionRunJob.JobID, gitCtx, jobResults, vars, inputs) return concurrencyGroup, concurrencyCancel, nil } + +func getInputsFromRun(run *actions_model.ActionRun) (map[string]any, error) { + if run.Event != "workflow_dispatch" { + return map[string]any{}, nil + } + var payload api.WorkflowDispatchPayload + if err := json.Unmarshal([]byte(run.EventPayload), &payload); err != nil { + return nil, err + } + return payload.Inputs, nil +} diff --git a/services/actions/notifier_helper.go b/services/actions/notifier_helper.go index 18f39ab4c878e..b25a6399dfd56 100644 --- a/services/actions/notifier_helper.go +++ b/services/actions/notifier_helper.go @@ -338,8 +338,11 @@ func handleWorkflows( continue } if wfRawConcurrency != nil { - wfGitCtx := jobparser.ToGitContext(GenerateGitContext(run, nil)) - wfConcurrencyGroup, wfConcurrencyCancel := jobparser.EvaluateWorkflowConcurrency(wfRawConcurrency, wfGitCtx, vars) + wfConcurrencyGroup, wfConcurrencyCancel, err := EvaluateWorkflowConcurrency(run, wfRawConcurrency, vars) + if err != nil { + log.Error("EvaluateWorkflowConcurrency: %v", err) + continue + } if len(wfConcurrencyGroup) > 0 { run.ConcurrencyGroup = wfConcurrencyGroup run.ConcurrencyCancel = wfConcurrencyCancel