From 904db19eb6e3ba902e6cb7d0566b931740b2dd5b Mon Sep 17 00:00:00 2001 From: "prath.shenoy" Date: Tue, 29 Sep 2026 22:17:28 +0000 Subject: [PATCH] feat(stovepipe): Record terminal build history **What**: - Include the terminal build identity in terminal request history. **Why**: - Retain the build that established each recorded request outcome. --- stovepipe/controller/buildsignal/buildsignal.go | 3 +++ stovepipe/controller/buildsignal/buildsignal_test.go | 12 +++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/stovepipe/controller/buildsignal/buildsignal.go b/stovepipe/controller/buildsignal/buildsignal.go index fdca5a7a..924eafb8 100644 --- a/stovepipe/controller/buildsignal/buildsignal.go +++ b/stovepipe/controller/buildsignal/buildsignal.go @@ -266,6 +266,9 @@ func (c *Controller) persistOutcomeLog(ctx context.Context, store storage.Storag } log := requestlog.NewRequestStateLog(request, reason) + if request.TerminalBuildID != "" { + log.Metadata[requestlog.MetadataKeyBuildID] = request.TerminalBuildID + } if err := c.materializer.PersistLog(ctx, store, log); err != nil { return fmt.Errorf("failed to record %s state for request %s: %w", request.State, request.ID, err) } diff --git a/stovepipe/controller/buildsignal/buildsignal_test.go b/stovepipe/controller/buildsignal/buildsignal_test.go index c52d5659..c82827d4 100644 --- a/stovepipe/controller/buildsignal/buildsignal_test.go +++ b/stovepipe/controller/buildsignal/buildsignal_test.go @@ -211,10 +211,12 @@ func expectOutcomeLog(m buildsignalMocks, state entity.RequestState, version int }[state] request := requestWithState(state) request.Version = version + log := requestlog.NewRequestStateLog(request, reason) + log.Metadata[requestlog.MetadataKeyBuildID] = request.TerminalBuildID return m.materializer.EXPECT().PersistLog( gomock.Any(), m.store, - requestlog.NewRequestStateLog(request, reason), + log, ).Return(nil) } @@ -407,10 +409,12 @@ func TestProcess(t *testing.T) { m.runnerFactory.EXPECT().For(buildrunner.Config{QueueName: testQueue}).Return(m.runner, nil) m.runner.EXPECT().Status(gomock.Any(), entity.BuildID{ID: testBuildID}).Return(entity.BuildStatusSucceeded, nil, nil) eventCall := expectBuildFinished(m) + log := requestlog.NewRequestStateLog(request, entity.RequestOutcomeReasonBuildSucceeded) + log.Metadata[requestlog.MetadataKeyBuildID] = request.TerminalBuildID m.materializer.EXPECT().PersistLog( gomock.Any(), m.store, - requestlog.NewRequestStateLog(request, entity.RequestOutcomeReasonBuildSucceeded), + log, ).Return(errors.New("db down")).After(eventCall) }, }, @@ -493,10 +497,12 @@ func TestProcess(t *testing.T) { updateCall := expectFinishWrites(m, entity.RequestStateSucceeded) request := requestWithState(entity.RequestStateSucceeded) request.Version = 2 + log := requestlog.NewRequestStateLog(request, entity.RequestOutcomeReasonBuildSucceeded) + log.Metadata[requestlog.MetadataKeyBuildID] = request.TerminalBuildID m.materializer.EXPECT().PersistLog( gomock.Any(), m.store, - requestlog.NewRequestStateLog(request, entity.RequestOutcomeReasonBuildSucceeded), + log, ).Return(errors.New("db down")).After(updateCall) }, },