diff --git a/internal/pkg/report/reporter.go b/internal/pkg/report/reporter.go index e49402b..b890e4a 100644 --- a/internal/pkg/report/reporter.go +++ b/internal/pkg/report/reporter.go @@ -93,6 +93,18 @@ func appendIfNotNil[T any](s []*T, v *T) []*T { return s } +// isJobStepEntry is used to not report composite step results incorrectly as step result +// returns true if the logentry is on job level +// returns false for composite action step messages +func isJobStepEntry(entry *log.Entry) bool { + if v, ok := entry.Data["stepID"]; ok { + if v, ok := v.([]string); ok && len(v) > 1 { + return false + } + } + return true +} + func (r *Reporter) Fire(entry *log.Entry) error { r.stateMu.Lock() defer r.stateMu.Unlock() @@ -162,7 +174,7 @@ func (r *Reporter) Fire(entry *log.Entry) error { } else if !r.duringSteps() { r.logRows = appendIfNotNil(r.logRows, r.parseLogRow(entry)) } - if v, ok := entry.Data["stepResult"]; ok { + if v, ok := entry.Data["stepResult"]; ok && isJobStepEntry(entry) { if stepResult, ok := r.parseResult(v); ok { if step.LogLength == 0 { step.LogIndex = int64(r.logOffset + len(r.logRows)) diff --git a/internal/pkg/report/reporter_test.go b/internal/pkg/report/reporter_test.go index c5a5b61..eb26b42 100644 --- a/internal/pkg/report/reporter_test.go +++ b/internal/pkg/report/reporter_test.go @@ -191,7 +191,22 @@ func TestReporter_Fire(t *testing.T) { assert.NoError(t, reporter.Fire(&log.Entry{Message: "::debug::debug log line", Data: dataStep0})) assert.NoError(t, reporter.Fire(&log.Entry{Message: "::debug::debug log line", Data: dataStep0})) assert.NoError(t, reporter.Fire(&log.Entry{Message: "regular log line", Data: dataStep0})) + assert.NoError(t, reporter.Fire(&log.Entry{Message: "composite step result", Data: map[string]interface{}{ + "stage": "Main", + "stepID": []string{"0", "0"}, + "stepNumber": 0, + "raw_output": true, + "stepResult": "failure", + }})) + assert.Equal(t, runnerv1.Result_RESULT_UNSPECIFIED, reporter.state.Steps[0].Result) + assert.NoError(t, reporter.Fire(&log.Entry{Message: "step result", Data: map[string]interface{}{ + "stage": "Main", + "stepNumber": 0, + "raw_output": true, + "stepResult": "success", + }})) + assert.Equal(t, runnerv1.Result_RESULT_SUCCESS, reporter.state.Steps[0].Result) - assert.Equal(t, int64(3), reporter.state.Steps[0].LogLength) + assert.Equal(t, int64(5), reporter.state.Steps[0].LogLength) }) }