Commit 33aaa49
Eric Bower
·
2026-05-06 22:14:53 -0400 EDT
parent f4ac402
fix: runner cannot be in the zmx session prefix
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"