From de529139af299abfefc70ee0de6bc1ec9611c7da Mon Sep 17 00:00:00 2001 From: sillyguodong Date: Wed, 19 Apr 2023 15:22:56 +0800 Subject: [PATCH] Support `configuration variables` (#43) related to: https://gitea.com/gitea/act_runner/issues/127 This PR make `act` support the expression like `${{ vars.YOUR_CUSTOM_VARIABLES }}`. Reviewed-on: https://gitea.com/gitea/act/pulls/43 Reviewed-by: Jason Song Co-authored-by: sillyguodong Co-committed-by: sillyguodong --- pkg/exprparser/interpreter.go | 4 ++++ pkg/jobparser/interpeter.go | 2 ++ pkg/runner/expression.go | 4 ++++ pkg/runner/run_context.go | 4 ++++ pkg/runner/runner.go | 1 + 5 files changed, 15 insertions(+) diff --git a/pkg/exprparser/interpreter.go b/pkg/exprparser/interpreter.go index 3f7e9b6..5a6d48f 100644 --- a/pkg/exprparser/interpreter.go +++ b/pkg/exprparser/interpreter.go @@ -23,6 +23,8 @@ type EvaluationEnvironment struct { Matrix map[string]interface{} Needs map[string]Needs Inputs map[string]interface{} + + Vars map[string]string } type Needs struct { @@ -181,6 +183,8 @@ func (impl *interperterImpl) evaluateVariable(variableNode *actionlint.VariableN return math.Inf(1), nil case "nan": return math.NaN(), nil + case "vars": + return impl.env.Vars, nil default: return nil, fmt.Errorf("Unavailable context: %s", variableNode.Name) } diff --git a/pkg/jobparser/interpeter.go b/pkg/jobparser/interpeter.go index 750f964..a29a4ee 100644 --- a/pkg/jobparser/interpeter.go +++ b/pkg/jobparser/interpeter.go @@ -62,6 +62,8 @@ func NewInterpeter( Matrix: matrix, Needs: using, Inputs: nil, // not supported yet + + Vars: nil, } config := exprparser.Config{ diff --git a/pkg/runner/expression.go b/pkg/runner/expression.go index ca40e95..ce4f748 100644 --- a/pkg/runner/expression.go +++ b/pkg/runner/expression.go @@ -81,6 +81,8 @@ func (rc *RunContext) NewExpressionEvaluatorWithEnv(ctx context.Context, env map Matrix: rc.Matrix, Needs: using, Inputs: inputs, + + Vars: rc.getVarsContext(), } if rc.JobContainer != nil { ee.Runner = rc.JobContainer.GetRunnerContext(ctx) @@ -130,6 +132,8 @@ func (rc *RunContext) NewStepExpressionEvaluator(ctx context.Context, step step) // todo: should be unavailable // but required to interpolate/evaluate the inputs in actions/composite Inputs: inputs, + + Vars: rc.getVarsContext(), } if rc.JobContainer != nil { ee.Runner = rc.JobContainer.GetRunnerContext(ctx) diff --git a/pkg/runner/run_context.go b/pkg/runner/run_context.go index 398d3ae..b8c3265 100644 --- a/pkg/runner/run_context.go +++ b/pkg/runner/run_context.go @@ -683,6 +683,10 @@ func (rc *RunContext) getStepsContext() map[string]*model.StepResult { return rc.StepResults } +func (rc *RunContext) getVarsContext() map[string]string { + return rc.Config.Vars +} + func (rc *RunContext) getGithubContext(ctx context.Context) *model.GithubContext { logger := common.Logger(ctx) ghc := &model.GithubContext{ diff --git a/pkg/runner/runner.go b/pkg/runner/runner.go index 651d03e..6d2c060 100644 --- a/pkg/runner/runner.go +++ b/pkg/runner/runner.go @@ -64,6 +64,7 @@ type Config struct { DefaultActionInstance string // the default actions web site PlatformPicker func(labels []string) string // platform picker, it will take precedence over Platforms if isn't nil JobLoggerLevel *log.Level // the level of job logger + Vars map[string]string // the list of variables set at the repository, environment, or organization levels. } func (c Config) GetToken() string {