Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
39509e9ad0 | ||
|
|
9924aea786 | ||
|
|
65c232c4a5 |
@@ -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))
|
||||||
@@ -60,10 +65,12 @@ func Parse(content []byte, options ...ParseOption) ([]*SingleWorkflow, error) {
|
|||||||
}
|
}
|
||||||
job.RawRunsOn = encodeRunsOn(runsOn)
|
job.RawRunsOn = encodeRunsOn(runsOn)
|
||||||
swf := &SingleWorkflow{
|
swf := &SingleWorkflow{
|
||||||
Name: workflow.Name,
|
Name: workflow.Name,
|
||||||
RawOn: workflow.RawOn,
|
RawOn: workflow.RawOn,
|
||||||
Env: workflow.Env,
|
Env: workflow.Env,
|
||||||
Defaults: workflow.Defaults,
|
Defaults: workflow.Defaults,
|
||||||
|
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)
|
||||||
|
|||||||
@@ -10,11 +10,13 @@ import (
|
|||||||
|
|
||||||
// SingleWorkflow is a workflow with single job and single matrix
|
// SingleWorkflow is a workflow with single job and single matrix
|
||||||
type SingleWorkflow struct {
|
type SingleWorkflow struct {
|
||||||
Name string `yaml:"name,omitempty"`
|
Name string `yaml:"name,omitempty"`
|
||||||
RawOn yaml.Node `yaml:"on,omitempty"`
|
RawOn yaml.Node `yaml:"on,omitempty"`
|
||||||
Env map[string]string `yaml:"env,omitempty"`
|
Env map[string]string `yaml:"env,omitempty"`
|
||||||
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"`
|
||||||
|
RunName string `yaml:"run-name,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *SingleWorkflow) Job() (string, *Job) {
|
func (w *SingleWorkflow) Job() (string, *Job) {
|
||||||
@@ -84,6 +86,7 @@ type Job struct {
|
|||||||
With map[string]interface{} `yaml:"with,omitempty"`
|
With map[string]interface{} `yaml:"with,omitempty"`
|
||||||
RawSecrets yaml.Node `yaml:"secrets,omitempty"`
|
RawSecrets yaml.Node `yaml:"secrets,omitempty"`
|
||||||
RawConcurrency *model.RawConcurrency `yaml:"concurrency,omitempty"`
|
RawConcurrency *model.RawConcurrency `yaml:"concurrency,omitempty"`
|
||||||
|
RawPermissions yaml.Node `yaml:"permissions,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (j *Job) Clone() *Job {
|
func (j *Job) Clone() *Job {
|
||||||
@@ -107,6 +110,7 @@ func (j *Job) Clone() *Job {
|
|||||||
With: j.With,
|
With: j.With,
|
||||||
RawSecrets: j.RawSecrets,
|
RawSecrets: j.RawSecrets,
|
||||||
RawConcurrency: j.RawConcurrency,
|
RawConcurrency: j.RawConcurrency,
|
||||||
|
RawPermissions: j.RawPermissions,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -272,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 {
|
||||||
|
|||||||
@@ -17,14 +17,14 @@ import (
|
|||||||
|
|
||||||
// Workflow is the structure of the files in .github/workflows
|
// Workflow is the structure of the files in .github/workflows
|
||||||
type Workflow struct {
|
type Workflow struct {
|
||||||
File string
|
File string
|
||||||
Name string `yaml:"name"`
|
Name string `yaml:"name"`
|
||||||
RawOn yaml.Node `yaml:"on"`
|
RawOn yaml.Node `yaml:"on"`
|
||||||
Env map[string]string `yaml:"env"`
|
Env map[string]string `yaml:"env"`
|
||||||
Jobs map[string]*Job `yaml:"jobs"`
|
Jobs map[string]*Job `yaml:"jobs"`
|
||||||
Defaults Defaults `yaml:"defaults"`
|
Defaults Defaults `yaml:"defaults"`
|
||||||
|
RawConcurrency *RawConcurrency `yaml:"concurrency"`
|
||||||
RawConcurrency *RawConcurrency `yaml:"concurrency"` // For Gitea
|
RawPermissions yaml.Node `yaml:"permissions"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// On events for the workflow
|
// On events for the workflow
|
||||||
@@ -201,6 +201,7 @@ type Job struct {
|
|||||||
Uses string `yaml:"uses"`
|
Uses string `yaml:"uses"`
|
||||||
With map[string]interface{} `yaml:"with"`
|
With map[string]interface{} `yaml:"with"`
|
||||||
RawSecrets yaml.Node `yaml:"secrets"`
|
RawSecrets yaml.Node `yaml:"secrets"`
|
||||||
|
RawPermissions yaml.Node `yaml:"permissions"`
|
||||||
Result string
|
Result string
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -777,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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user