Skip to content

Commit f15d844

Browse files
committed
runner/v3: fix race condition when trapping output of build steps
1 parent 3ebb05d commit f15d844

File tree

1 file changed

+19
-2
lines changed

1 file changed

+19
-2
lines changed

internal/runner/runner.go

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ func (r *Runner) runBuilds(ctx context.Context, fn string) bool {
249249
r.setServiceState(normalizeByEnvVarRules(sv.Name), "building")
250250
wgBuild.Add(1)
251251
go func(sv *ProcessType) {
252-
var buf bytes.Buffer
252+
buf := &safeBuffer{buf: new(bytes.Buffer)}
253253
localOk := true
254254
defer wgBuild.Done()
255255
defer func() {
@@ -262,7 +262,7 @@ func (r *Runner) runBuilds(ctx context.Context, fn string) bool {
262262
}
263263
r.setServiceState(normalizeByEnvVarRules(sv.Name), status)
264264
}()
265-
if !r.startProcess(ctx, sv, -1, -1, fn, &buf) {
265+
if !r.startProcess(ctx, sv, -1, -1, fn, buf) {
266266
mu.Lock()
267267
ok = false
268268
localOk = false
@@ -671,3 +671,20 @@ func command(ctx context.Context, cmd string) *exec.Cmd {
671671
}
672672
return c
673673
}
674+
675+
type safeBuffer struct {
676+
mu sync.Mutex
677+
buf *bytes.Buffer
678+
}
679+
680+
func (s *safeBuffer) Write(p []byte) (n int, err error) {
681+
s.mu.Lock()
682+
defer s.mu.Unlock()
683+
return s.buf.Write(p)
684+
}
685+
686+
func (s *safeBuffer) String() string {
687+
s.mu.Lock()
688+
defer s.mu.Unlock()
689+
return s.buf.String()
690+
}

0 commit comments

Comments
 (0)