feat: make global default timeout 0 (infinite) instead of required 30s

DefaultTimeoutSeconds now means "no timeout" when 0/empty, and that is
the new default, rather than an invalid config forcing a positive
value. runner.RunJob avoids context.WithTimeout with a zero duration
(which would expire immediately) and instead runs on a plain
cancelable context when no timeout is configured. Per-job
TimeoutSeconds inherit semantics are unchanged.
This commit is contained in:
mixeme
2026-07-26 13:57:03 +03:00
parent 3992b40eda
commit 33a246cd13
14 changed files with 75 additions and 23 deletions
+11 -2
View File
@@ -18,8 +18,17 @@ func RunJob(ctx context.Context, job *domain.Job, trigger string, logsDir string
started := time.Now()
// Commands can hang forever if a script waits for input or a child process
// stalls. The effective timeout is resolved by the caller (per-job value or
// the global default), keeping the runner ignorant of the global config.
runCtx, cancel := context.WithTimeout(ctx, timeout)
// the global default), keeping the runner ignorant of the global config. A
// non-positive timeout means "no timeout": context.WithTimeout(ctx, 0) would
// expire immediately, so fall back to a plain cancelable context that only
// ever ends via ctx (e.g. app shutdown).
var runCtx context.Context
var cancel context.CancelFunc
if timeout > 0 {
runCtx, cancel = context.WithTimeout(ctx, timeout)
} else {
runCtx, cancel = context.WithCancel(ctx)
}
defer cancel()
var output string