diff --git a/pkg/runner/expression.go b/pkg/runner/expression.go index cfd5d42f858..90643d09119 100644 --- a/pkg/runner/expression.go +++ b/pkg/runner/expression.go @@ -108,6 +108,19 @@ var hashfiles string // NewStepExpressionEvaluator creates a new evaluator func (rc *RunContext) NewStepExpressionEvaluator(ctx context.Context, step step) ExpressionEvaluator { + return rc.NewStepExpressionEvaluatorExt(ctx, step, false) +} + +// NewStepExpressionEvaluatorExt creates a new evaluator +func (rc *RunContext) NewStepExpressionEvaluatorExt(ctx context.Context, step step, rcInputs bool) ExpressionEvaluator { + ghc := rc.getGithubContext(ctx) + if rcInputs { + return rc.newStepExpressionEvaluator(ctx, step, ghc, getEvaluatorInputs(ctx, rc, nil, ghc)) + } + return rc.newStepExpressionEvaluator(ctx, step, ghc, getEvaluatorInputs(ctx, rc, step, ghc)) +} + +func (rc *RunContext) newStepExpressionEvaluator(ctx context.Context, step step, ghc *model.GithubContext, inputs map[string]interface{}) ExpressionEvaluator { // todo: cleanup EvaluationEnvironment creation job := rc.Run.Job() strategy := make(map[string]interface{}) @@ -127,9 +140,6 @@ func (rc *RunContext) NewStepExpressionEvaluator(ctx context.Context, step step) } } - ghc := rc.getGithubContext(ctx) - inputs := getEvaluatorInputs(ctx, rc, step, ghc) - ee := &exprparser.EvaluationEnvironment{ Github: step.getGithubContext(ctx), Env: *step.getEnv(), diff --git a/pkg/runner/step.go b/pkg/runner/step.go index e1bcf9ecfdc..7b761bac6f2 100644 --- a/pkg/runner/step.go +++ b/pkg/runner/step.go @@ -261,7 +261,7 @@ func isStepEnabled(ctx context.Context, expr string, step step, stage stepStage) defaultStatusCheck = exprparser.DefaultStatusCheckSuccess } - runStep, err := EvalBool(ctx, rc.NewStepExpressionEvaluator(ctx, step), expr, defaultStatusCheck) + runStep, err := EvalBool(ctx, rc.NewStepExpressionEvaluatorExt(ctx, step, stage == stepStageMain), expr, defaultStatusCheck) if err != nil { return false, fmt.Errorf(" \u274C Error in if-expression: \"if: %s\" (%s)", expr, err) } diff --git a/pkg/runner/testdata/uses-composite-check-for-input-in-if-uses/composite_action/action.yml b/pkg/runner/testdata/uses-composite-check-for-input-in-if-uses/composite_action/action.yml new file mode 100644 index 00000000000..f4f87412bc5 --- /dev/null +++ b/pkg/runner/testdata/uses-composite-check-for-input-in-if-uses/composite_action/action.yml @@ -0,0 +1,47 @@ +name: "Test Composite Action" +description: "Test action uses composite" + +inputs: + b: + default: true + b2: {} + +runs: + using: "composite" + steps: + - uses: actions/github-script@v7 + if: inputs.b == 'true' + with: + script: | + console.log(${{ tojson(inputs) }}) + if( ${{ tojson(inputs.b) }} != 'true' ) { + process.exit(-1); + } + github-token: noop + - uses: actions/github-script@v7 + if: inputs.b != 'true' + with: + script: | + console.log(${{ tojson(inputs) }}) + if( ${{ tojson(inputs.b) }} == 'true' ) { + process.exit(-1); + } + github-token: noop + - uses: actions/github-script@v7 + if: inputs.b2 == 'false' + with: + script: | + console.log(${{ tojson(inputs) }}) + if( ${{ tojson(inputs.b2) }} != 'false' ) { + process.exit(-1); + } + github-token: noop + - uses: actions/github-script@v7 + if: inputs.b2 != 'false' + with: + script: | + console.log(${{ tojson(inputs) }}) + if( ${{ tojson(inputs.b2) }} == 'false' ) { + process.exit(-1); + } + github-token: noop diff --git a/pkg/runner/testdata/uses-composite-check-for-input-in-if-uses/push.yml b/pkg/runner/testdata/uses-composite-check-for-input-in-if-uses/push.yml new file mode 100644 index 00000000000..84441dcc893 --- /dev/null +++ b/pkg/runner/testdata/uses-composite-check-for-input-in-if-uses/push.yml @@ -0,0 +1,24 @@ +name: uses-composite-check-for-input-in-if-uses +on: push + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: ./uses-composite-check-for-input-in-if-uses/composite_action + with: + b: true + b2: true + - uses: ./uses-composite-check-for-input-in-if-uses/composite_action + with: + b: false + b2: false + - uses: ./uses-composite-check-for-input-in-if-uses/composite_action + with: + b: true + b2: false + - uses: ./uses-composite-check-for-input-in-if-uses/composite_action + with: + b: false + b2: true \ No newline at end of file