Skip to content

Commit f44eff2

Browse files
committed
fix: avoid runner output buffer race
1 parent 87dec9c commit f44eff2

2 files changed

Lines changed: 7 additions & 5 deletions

File tree

‎cmd/github-actions-runner-job/main.go‎

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,8 @@ type runningCommand struct {
363363
path string
364364
cancel context.CancelFunc
365365
cmd *exec.Cmd
366-
output bytes.Buffer
366+
stdout bytes.Buffer
367+
stderr bytes.Buffer
367368
}
368369

369370
func startCommand(ctx context.Context, path, dir string, args ...string) (*runningCommand, error) {
@@ -372,8 +373,8 @@ func startCommand(ctx context.Context, path, dir string, args ...string) (*runni
372373
cmd.Dir = dir
373374
cmd.Env = os.Environ()
374375
running := &runningCommand{path: path, cancel: cancel, cmd: cmd}
375-
cmd.Stdout = &running.output
376-
cmd.Stderr = &running.output
376+
cmd.Stdout = &running.stdout
377+
cmd.Stderr = &running.stderr
377378
if err := cmd.Start(); err != nil {
378379
cancel()
379380
return nil, fmt.Errorf("%s start failed: %w", filepath.Base(path), err)
@@ -385,7 +386,8 @@ func (r *runningCommand) wait() error {
385386
err := r.cmd.Wait()
386387
r.cancel()
387388
if err != nil {
388-
return fmt.Errorf("%s failed: %w: %s", filepath.Base(r.path), err, strings.TrimSpace(r.output.String()))
389+
output := strings.TrimSpace(strings.Join([]string{r.stdout.String(), r.stderr.String()}, "\n"))
390+
return fmt.Errorf("%s failed: %w: %s", filepath.Base(r.path), err, output)
389391
}
390392
return nil
391393
}

‎cmd/github-actions-runner-job/main_test.go‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ func TestT915CommandRunsDynamicProviderEnvelopeThroughSidecarAndRunner(t *testin
8080

8181
runnerDir := t.TempDir()
8282
writeExecutable(t, filepath.Join(runnerDir, "config.sh"), "#!/bin/sh\nprintf '%s\\n' \"$@\" > \"$GITHUB_ACTIONS_RUNNER_JOB_TEST_DIR/config.args\"\nprintf '{\"agentId\":42}\\n' > .runner\n")
83-
writeExecutable(t, filepath.Join(runnerDir, "run.sh"), "#!/bin/sh\nprintf '%s\\n' \"$@\" > \"$GITHUB_ACTIONS_RUNNER_JOB_TEST_DIR/run.args\"\ntouch \"$GITHUB_ACTIONS_RUNNER_JOB_TEST_DIR/run.started\"\nwhile [ ! -f \"$GITHUB_ACTIONS_RUNNER_JOB_TEST_DIR/dispatch.seen\" ]; do sleep 0.1; done\nprintf 'runner executed\\n' > \"$GITHUB_ACTIONS_RUNNER_JOB_TEST_DIR/run.log\"\n")
83+
writeExecutable(t, filepath.Join(runnerDir, "run.sh"), "#!/bin/sh\nprintf '%s\\n' \"$@\" > \"$GITHUB_ACTIONS_RUNNER_JOB_TEST_DIR/run.args\"\ntouch \"$GITHUB_ACTIONS_RUNNER_JOB_TEST_DIR/run.started\"\nwhile [ ! -f \"$GITHUB_ACTIONS_RUNNER_JOB_TEST_DIR/dispatch.seen\" ]; do sleep 0.1; done\n(for i in $(seq 1 50); do printf 'stdout-%s\\n' \"$i\"; done) &\n(for i in $(seq 1 50); do printf 'stderr-%s\\n' \"$i\" >&2; done) &\nwait\nprintf 'runner executed\\n' > \"$GITHUB_ACTIONS_RUNNER_JOB_TEST_DIR/run.log\"\n")
8484
t.Chdir(workspace)
8585
t.Setenv("COMPUTE_GITHUB_RUNNER_PROVIDER_URL", sidecar.URL)
8686
t.Setenv("COMPUTE_GITHUB_RUNNER_PROVIDER_TOKEN", "provider-token")

0 commit comments

Comments
 (0)