From 0dfec377d26788d1c729b0a4e69a40a6c124c3ba Mon Sep 17 00:00:00 2001 From: silverwind Date: Wed, 11 Nov 2026 19:31:21 +0000 Subject: [PATCH] fix: keep composite post steps in their own step scope (#1410) Each composite step's post ran its earlier siblings' posts inside its own step-ID scope, so their log records listed siblings as ancestors, e.g. `outer.results.nodepost` instead of `outer.nodepost`. Every post now gets its own scope. Execution order and run-all-posts behavior are unchanged. Prerequisite for https://gitea.com/gitea/runner/issues/809. _Written by Claude (Opus 5.5)._ Reviewed-on: https://gitea.com/gitea/runner/pulls/1410 Reviewed-by: bircni Co-authored-by: silverwind --- act/runner/action_composite.go | 4 ++-- act/runner/action_composite_test.go | 13 +++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/act/runner/action_composite.go b/act/runner/action_composite.go index 507950ee..1dba9f3b 100644 --- a/act/runner/action_composite.go +++ b/act/runner/action_composite.go @@ -217,11 +217,11 @@ func (rc *RunContext) compositeExecutor(action *model.Action) *compositeSteps { steps = append(steps, newCompositeStepLogExecutor(rc.newCompositeCommandExecutor(step.main()), stepID)) // run the post executor in reverse order - stepPost := rc.newCompositeCommandExecutor(step.post()) + stepPost := newCompositeStepLogExecutor(rc.newCompositeCommandExecutor(step.post()), stepID) if postExecutor != nil { stepPost = stepPost.Finally(postExecutor) } - postExecutor = newCompositeStepLogExecutor(stepPost, stepID) + postExecutor = stepPost } steps = append(steps, common.JobError) diff --git a/act/runner/action_composite_test.go b/act/runner/action_composite_test.go index a9408bad..65ca0ad3 100644 --- a/act/runner/action_composite_test.go +++ b/act/runner/action_composite_test.go @@ -99,6 +99,19 @@ func TestCompositeActionParity(t *testing.T) { require.ErrorIs(t, rc.compositeExecutor(&model.Action{Runs: model.ActionRuns{Using: "composite", Steps: []model.Step{{ID: "nested", Uses: "org/action@v1"}}}}).pre(t.Context()), assert.AnError) }) + + t.Run("post steps log under their own step ids", func(t *testing.T) { + hook := logtest.NewWithLevel(logging.LevelDebug) + rc := &RunContext{Config: &Config{}, JobContainer: &jobContainerMock{}} + steps := rc.compositeExecutor(&model.Action{Runs: model.ActionRuns{Using: "composite", Steps: []model.Step{{ID: "first", Uses: "./first"}, {ID: "second", Uses: "./second"}}}}) + require.NoError(t, steps.post(common.WithLogger(t.Context(), logging.New(hook)))) + var stepIDs []any + for _, record := range hook.AllRecords() { + ids, _ := record.Attr("stepID") + stepIDs = append(stepIDs, ids) + } + assert.Equal(t, []any{[]string{"second"}, []string{"first"}}, stepIDs) + }) } func TestAppendUniqueMasks(t *testing.T) {