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
M main.go
+22, -5
 1@@ -345,15 +345,31 @@ func (eng *JobEngine) Run() error {
 2 	}
 3 
 4 	prefix := fmt.Sprintf("ci.%s.%s.", eng.Ev.Name, eng.JobID)
 5+	// Child sessions use ".step." sub-prefix so zmx wait "*" inside pico.sh
 6+	// matches ci.<name>.<jobID>.step.* but NOT ci.<name>.<jobID>.runner.
 7+	// This avoids a deadlock where the runner waits for itself.
 8+	childPrefix := prefix + "step."
 9 
10 	log := eng.Logger.With("manifest", manifest, "prefix", prefix)
11 	log.Debug("starting runner session", "session", prefix+"runner")
12 
13 	evStr := fmt.Sprintf("PICO_CI_EVENT=%s", eng.Ev.Type)
14-	jobStr := fmt.Sprintf("ZMX_SESSION_PREFIX=%s", prefix)
15+	jobStr := fmt.Sprintf("ZMX_SESSION_PREFIX=%s", childPrefix)
16+
17+	runnerName := prefix + "runner"
18+	// Name the runner explicitly and don't set ZMX_SESSION_PREFIX for this
19+	// outer zmx run call. The prefix is only for child sessions spawned
20+	// inside pico.sh (via the exported env var).
21+	cmdEnv := make([]string, 0, len(os.Environ())+2)
22+	for _, e := range os.Environ() {
23+		if !strings.HasPrefix(e, "ZMX_SESSION_PREFIX=") {
24+			cmdEnv = append(cmdEnv, e)
25+		}
26+	}
27+	cmdEnv = append(cmdEnv, evStr, jobStr)
28 
29-	cmd := exec.Command("zmx", "run", "runner", "-d", "bash", manifest)
30-	cmd.Env = append(os.Environ(), evStr, jobStr)
31+	cmd := exec.Command("zmx", "run", runnerName, "-d", "bash", manifest)
32+	cmd.Env = cmdEnv
33 	cmd.Dir = eng.Wk.GetDir()
34 
35 	if err := cmd.Run(); err != nil {
36@@ -1105,8 +1121,9 @@ func runGC(cfg *Cfg) error {
37 // extractJobPrefix extracts the job prefix from a session name.
38 // ci.<name>.<jobID>.<step> -> ci.<name>.<jobID>.
39 func extractJobPrefix(sessionName string) string {
40-	// Find the third dot (after ci.<name>.<jobID>)
41-	// ci.name.jobID.step -> ci.name.jobID.
42+	// Extract the job key ci.<name>.<jobID> from session names:
43+	//   ci.name.jobID.runner        (4 parts)  → ci.name.jobID.
44+	//   ci.name.jobID.step.lint     (5 parts)  → ci.name.jobID.
45 	parts := strings.Split(sessionName, ".")
46 	if len(parts) < 4 {
47 		return ""
M pico.sh
+2, -2
 1@@ -1,12 +1,12 @@
 2 #!/usr/bin/env bash
 3 set -xeuo pipefail
 4 
 5-export ZMX_SESSION_PREFIX="${ZMX_SESSION_PREFIX:-ci-}"
 6+export ZMX_SESSION_PREFIX="${ZMX_SESSION_PREFIX:-ci.}"
 7 
 8 printf "\x1b[33mrunning ci\x1b[0m\n"
 9 
10 zmx run lint -d docker run -t --rm -v $(pwd):/app -w /app golangci/golangci-lint:v2.11.4 golangci-lint run
11 zmx run test -d docker run -t --rm -v $(pwd):/app -w /app golang:1.26 go test ./...
12-zmx wait lint test
13+zmx wait "*"
14 
15 printf "\x1b[32msuccess!\x1b[0m\n"