diff --git a/acid.go b/acid.go index 17ca23b..b206057 100644 --- a/acid.go +++ b/acid.go @@ -81,8 +81,9 @@ type ConfigProject struct { } type ConfigProjectRunner struct { - Setup string `yaml:"setup"` // project setup script (SSH) - Build string `yaml:"build"` // project build script (SSH) + Setup string `yaml:"setup"` // project setup script (SSH) + Build string `yaml:"build"` // project build script (SSH) + Timeout string `yaml:"timeout"` // timeout duration } func parseConfig(path string) error { @@ -937,6 +938,17 @@ func executorRunTask(ctx context.Context, task Task) error { return fmt.Errorf("script: %w", err) } + // Lenient or not, some kind of a time limit is desirable. + timeout := time.Hour + if rt.ProjectRunner.Timeout != "" { + timeout, err = time.ParseDuration(rt.ProjectRunner.Timeout) + if err != nil { + return fmt.Errorf("timeout: %w", err) + } + } + ctx, cancelTimeout := context.WithTimeout(ctx, timeout) + defer cancelTimeout() + privateKey, err := os.ReadFile(rt.Runner.SSH.Identity) if err != nil { return fmt.Errorf( diff --git a/acid.yaml.example b/acid.yaml.example index b34abf0..499366e 100644 --- a/acid.yaml.example +++ b/acid.yaml.example @@ -62,3 +62,7 @@ projects: build: | echo Computing line count... find . -not -path '*/.*' -type f -print0 | xargs -0 cat | wc -l + + # Time limit in time.ParseDuration format. + # The default of one hour should suffice. + timeout: 1h