From 68e74447c3433d74ea7a2f2f744a3267803bb572 Mon Sep 17 00:00:00 2001 From: ChristopherHX Date: Tue, 6 Dec 2022 17:46:20 +0100 Subject: [PATCH] fix: step env is unavailable in with property expr (#1458) * fix: step env is unavailable in with property expr * don't run the test on windows * fix: composite action add missing shell Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> --- act/runner/expression.go | 6 +++++- act/runner/runner_test.go | 1 + act/runner/step.go | 12 +++++++++++- .../testdata/inputs-via-env-context/action.yml | 8 ++++++++ .../testdata/inputs-via-env-context/push.yml | 15 +++++++++++++++ 5 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 act/runner/testdata/inputs-via-env-context/action.yml create mode 100644 act/runner/testdata/inputs-via-env-context/push.yml diff --git a/act/runner/expression.go b/act/runner/expression.go index c2257b12..6a621f7b 100644 --- a/act/runner/expression.go +++ b/act/runner/expression.go @@ -21,6 +21,10 @@ type ExpressionEvaluator interface { // NewExpressionEvaluator creates a new evaluator func (rc *RunContext) NewExpressionEvaluator(ctx context.Context) ExpressionEvaluator { + return rc.NewExpressionEvaluatorWithEnv(ctx, rc.GetEnv()) +} + +func (rc *RunContext) NewExpressionEvaluatorWithEnv(ctx context.Context, env map[string]string) ExpressionEvaluator { // todo: cleanup EvaluationEnvironment creation using := make(map[string]map[string]map[string]string) strategy := make(map[string]interface{}) @@ -46,7 +50,7 @@ func (rc *RunContext) NewExpressionEvaluator(ctx context.Context) ExpressionEval ee := &exprparser.EvaluationEnvironment{ Github: ghc, - Env: rc.GetEnv(), + Env: env, Job: rc.getJobContext(), // todo: should be unavailable // but required to interpolate/evaluate the step outputs on the job diff --git a/act/runner/runner_test.go b/act/runner/runner_test.go index 812ae322..21b584f0 100644 --- a/act/runner/runner_test.go +++ b/act/runner/runner_test.go @@ -287,6 +287,7 @@ func TestRunEventHostEnvironment(t *testing.T) { tables = append(tables, []TestJobFileInfo{ {workdir, "nix-prepend-path", "push", "", platforms}, + {workdir, "inputs-via-env-context", "push", "", platforms}, }...) } diff --git a/act/runner/step.go b/act/runner/step.go index f730ac1a..560ba632 100644 --- a/act/runner/step.go +++ b/act/runner/step.go @@ -179,7 +179,17 @@ func setupEnv(ctx context.Context, step step) error { exprEval := rc.NewExpressionEvaluator(ctx) for k, v := range *step.getEnv() { - (*step.getEnv())[k] = exprEval.Interpolate(ctx, v) + if !strings.HasPrefix(k, "INPUT_") { + (*step.getEnv())[k] = exprEval.Interpolate(ctx, v) + } + } + // after we have an evaluated step context, update the expresson evaluator with a new env context + // you can use step level env in the with property of a uses construct + exprEval = rc.NewExpressionEvaluatorWithEnv(ctx, *step.getEnv()) + for k, v := range *step.getEnv() { + if strings.HasPrefix(k, "INPUT_") { + (*step.getEnv())[k] = exprEval.Interpolate(ctx, v) + } } common.Logger(ctx).Debugf("setupEnv => %v", *step.getEnv()) diff --git a/act/runner/testdata/inputs-via-env-context/action.yml b/act/runner/testdata/inputs-via-env-context/action.yml new file mode 100644 index 00000000..4ea270d4 --- /dev/null +++ b/act/runner/testdata/inputs-via-env-context/action.yml @@ -0,0 +1,8 @@ +inputs: + test-env-input: {} +runs: + using: composite + steps: + - run: | + exit ${{ inputs.test-env-input == env.test-env-input && '0' || '1'}} + shell: bash diff --git a/act/runner/testdata/inputs-via-env-context/push.yml b/act/runner/testdata/inputs-via-env-context/push.yml new file mode 100644 index 00000000..07fadeb1 --- /dev/null +++ b/act/runner/testdata/inputs-via-env-context/push.yml @@ -0,0 +1,15 @@ +on: push +jobs: + test-inputs-via-env-context: + runs-on: self-hosted + steps: + - uses: actions/checkout@v3 + - uses: ./inputs-via-env-context + with: + test-env-input: ${{ env.test-env-input }} + env: + test-env-input: ${{ github.event_name }}/${{ github.run_id }} + - run: | + exit ${{ env.test-env-input == format('{0}/{1}', github.event_name, github.run_id) && '0' || '1' }} + env: + test-env-input: ${{ github.event_name }}/${{ github.run_id }} \ No newline at end of file