Commit 33aaa49

Eric Bower  ·  2026-05-06 22:14:53 -0400 EDT
parent f4ac402
fix: runner cannot be in the zmx session prefix
2 files changed,  +24, -7
+22, -5
......@@ -345,15 +345,31 @@ func (eng *JobEngine) Run() error {
345345 }
346346
347347 prefix := fmt.Sprintf("ci.%s.%s.", eng.Ev.Name, eng.JobID)
348+ // Child sessions use ".step." sub-prefix so zmx wait "*" inside pico.sh
349+ // matches ci.<name>.<jobID>.step.* but NOT ci.<name>.<jobID>.runner.
350+ // This avoids a deadlock where the runner waits for itself.
351+ childPrefix := prefix + "step."
348352
349353 log := eng.Logger.With("manifest", manifest, "prefix", prefix)
350354 log.Debug("starting runner session", "session", prefix+"runner")
351355
352356 evStr := fmt.Sprintf("PICO_CI_EVENT=%s", eng.Ev.Type)
353- jobStr := fmt.Sprintf("ZMX_SESSION_PREFIX=%s", prefix)
357+ jobStr := fmt.Sprintf("ZMX_SESSION_PREFIX=%s", childPrefix)
358+
359+ runnerName := prefix + "runner"
360+ // Name the runner explicitly and don't set ZMX_SESSION_PREFIX for this
361+ // outer zmx run call. The prefix is only for child sessions spawned
362+ // inside pico.sh (via the exported env var).
363+ cmdEnv := make([]string, 0, len(os.Environ())+2)
364+ for _, e := range os.Environ() {
365+ if !strings.HasPrefix(e, "ZMX_SESSION_PREFIX=") {
366+ cmdEnv = append(cmdEnv, e)
367+ }
368+ }
369+ cmdEnv = append(cmdEnv, evStr, jobStr)
354370
355- cmd := exec.Command("zmx", "run", "runner", "-d", "bash", manifest)
356- cmd.Env = append(os.Environ(), evStr, jobStr)
371+ cmd := exec.Command("zmx", "run", runnerName, "-d", "bash", manifest)
372+ cmd.Env = cmdEnv
357373 cmd.Dir = eng.Wk.GetDir()
358374
359375 if err := cmd.Run(); err != nil {
......@@ -1105,8 +1121,9 @@ func runGC(cfg *Cfg) error {
11051121 // extractJobPrefix extracts the job prefix from a session name.
11061122 // ci.<name>.<jobID>.<step> -> ci.<name>.<jobID>.
11071123 func extractJobPrefix(sessionName string) string {
1108- // Find the third dot (after ci.<name>.<jobID>)
1109- // ci.name.jobID.step -> ci.name.jobID.
1124+ // Extract the job key ci.<name>.<jobID> from session names:
1125+ // ci.name.jobID.runner (4 parts) → ci.name.jobID.
1126+ // ci.name.jobID.step.lint (5 parts) → ci.name.jobID.
11101127 parts := strings.Split(sessionName, ".")
11111128 if len(parts) < 4 {
11121129 return ""
+2, -2
......@@ -1,12 +1,12 @@
11 #!/usr/bin/env bash
22 set -xeuo pipefail
33
4-export ZMX_SESSION_PREFIX="${ZMX_SESSION_PREFIX:-ci-}"
4+export ZMX_SESSION_PREFIX="${ZMX_SESSION_PREFIX:-ci.}"
55
66 printf "\x1b[33mrunning ci\x1b[0m\n"
77
88 zmx run lint -d docker run -t --rm -v $(pwd):/app -w /app golangci/golangci-lint:v2.11.4 golangci-lint run
99 zmx run test -d docker run -t --rm -v $(pwd):/app -w /app golang:1.26 go test ./...
10-zmx wait lint test
10+zmx wait "*"
1111
1212 printf "\x1b[32msuccess!\x1b[0m\n"