Compare commits

..

2 Commits

Author SHA1 Message Date
ChristopherHX
39509e9ad0 Support Simplified Concurrency (#139)
- update RawConcurrency struct to parse and serialize string-based concurrency notation
- update EvaluateConcurrency to handle new RawConcurrency format

Reviewed-on: https://gitea.com/gitea/act/pulls/139
Reviewed-by: Zettat123 <zettat123@noreply.gitea.com>
Reviewed-by: Lunny Xiao <xiaolunwen@gmail.com>
Co-authored-by: ChristopherHX <christopher.homberger@web.de>
Co-committed-by: ChristopherHX <christopher.homberger@web.de>
2025-07-29 09:14:47 +00:00
badhezi
9924aea786 Evaluate run-name field for workflows (#137)
To support https://github.com/go-gitea/gitea/pull/34301

Reviewed-on: https://gitea.com/gitea/act/pulls/137
Reviewed-by: Lunny Xiao <xiaolunwen@gmail.com>
Co-authored-by: badhezi <zlilaharon@gmail.com>
Co-committed-by: badhezi <zlilaharon@gmail.com>
2025-05-12 17:17:50 +00:00
3 changed files with 40 additions and 3 deletions

View File

@@ -8,6 +8,7 @@ import (
"gopkg.in/yaml.v3" "gopkg.in/yaml.v3"
"github.com/nektos/act/pkg/exprparser"
"github.com/nektos/act/pkg/model" "github.com/nektos/act/pkg/model"
) )
@@ -40,6 +41,10 @@ func Parse(content []byte, options ...ParseOption) ([]*SingleWorkflow, error) {
if err != nil { if err != nil {
return nil, fmt.Errorf("invalid jobs: %w", err) return nil, fmt.Errorf("invalid jobs: %w", err)
} }
evaluator := NewExpressionEvaluator(exprparser.NewInterpeter(&exprparser.EvaluationEnvironment{Github: pc.gitContext, Vars: pc.vars}, exprparser.Config{}))
workflow.RunName = evaluator.Interpolate(workflow.RunName)
for i, id := range ids { for i, id := range ids {
job := jobs[i] job := jobs[i]
matricxes, err := getMatrixes(origin.GetJob(id)) matricxes, err := getMatrixes(origin.GetJob(id))
@@ -65,6 +70,7 @@ func Parse(content []byte, options ...ParseOption) ([]*SingleWorkflow, error) {
Env: workflow.Env, Env: workflow.Env,
Defaults: workflow.Defaults, Defaults: workflow.Defaults,
RawPermissions: workflow.RawPermissions, RawPermissions: workflow.RawPermissions,
RunName: workflow.RunName,
} }
if err := swf.SetJob(id, job); err != nil { if err := swf.SetJob(id, job); err != nil {
return nil, fmt.Errorf("SetJob: %w", err) return nil, fmt.Errorf("SetJob: %w", err)

View File

@@ -16,6 +16,7 @@ type SingleWorkflow struct {
RawJobs yaml.Node `yaml:"jobs,omitempty"` RawJobs yaml.Node `yaml:"jobs,omitempty"`
Defaults Defaults `yaml:"defaults,omitempty"` Defaults Defaults `yaml:"defaults,omitempty"`
RawPermissions yaml.Node `yaml:"permissions,omitempty"` RawPermissions yaml.Node `yaml:"permissions,omitempty"`
RunName string `yaml:"run-name,omitempty"`
} }
func (w *SingleWorkflow) Job() (string, *Job) { func (w *SingleWorkflow) Job() (string, *Job) {
@@ -275,9 +276,21 @@ func EvaluateConcurrency(rc *model.RawConcurrency, jobID string, job *Job, gitCt
} }
evaluator := NewExpressionEvaluator(NewInterpeter(jobID, actJob, matrix, toGitContext(gitCtx), results, vars, inputs)) evaluator := NewExpressionEvaluator(NewInterpeter(jobID, actJob, matrix, toGitContext(gitCtx), results, vars, inputs))
group := evaluator.Interpolate(rc.Group) var node yaml.Node
cancelInProgress := evaluator.Interpolate(rc.CancelInProgress) if err := node.Encode(rc); err != nil {
return group, cancelInProgress == "true", nil return "", false, fmt.Errorf("failed to encode concurrency: %w", err)
}
if err := evaluator.EvaluateYamlNode(&node); err != nil {
return "", false, fmt.Errorf("failed to evaluate concurrency: %w", err)
}
var evaluated model.RawConcurrency
if err := node.Decode(&evaluated); err != nil {
return "", false, fmt.Errorf("failed to unmarshal evaluated concurrency: %w", err)
}
if evaluated.RawExpression != "" {
return evaluated.RawExpression, false, nil
}
return evaluated.Group, evaluated.CancelInProgress == "true", nil
} }
func toGitContext(input map[string]any) *model.GithubContext { func toGitContext(input map[string]any) *model.GithubContext {

View File

@@ -778,4 +778,22 @@ func decodeNode(node yaml.Node, out interface{}) bool {
type RawConcurrency struct { type RawConcurrency struct {
Group string `yaml:"group,omitempty"` Group string `yaml:"group,omitempty"`
CancelInProgress string `yaml:"cancel-in-progress,omitempty"` CancelInProgress string `yaml:"cancel-in-progress,omitempty"`
RawExpression string `yaml:"-,omitempty"`
}
type objectConcurrency RawConcurrency
func (r *RawConcurrency) UnmarshalYAML(n *yaml.Node) error {
if err := n.Decode(&r.RawExpression); err == nil {
return nil
}
return n.Decode((*objectConcurrency)(r))
}
func (r *RawConcurrency) MarshalYAML() (interface{}, error) {
if r.RawExpression != "" {
return r.RawExpression, nil
}
return (*objectConcurrency)(r), nil
} }