diff --git a/pkg/runner/expression.go b/pkg/runner/expression.go index c2257b1..6a621f7 100644 --- a/pkg/runner/expression.go +++ b/pkg/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/pkg/runner/runner_test.go b/pkg/runner/runner_test.go index 812ae32..21b584f 100644 --- a/pkg/runner/runner_test.go +++ b/pkg/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/pkg/runner/step.go b/pkg/runner/step.go index f730ac1..560ba63 100644 --- a/pkg/runner/step.go +++ b/pkg/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/pkg/runner/testdata/inputs-via-env-context/action.yml b/pkg/runner/testdata/inputs-via-env-context/action.yml new file mode 100644 index 0000000..4ea270d --- /dev/null +++ b/pkg/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/pkg/runner/testdata/inputs-via-env-context/push.yml b/pkg/runner/testdata/inputs-via-env-context/push.yml new file mode 100644 index 0000000..07fadeb --- /dev/null +++ b/pkg/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