hashicorp/nomad · error
error parsing GitTimeout
Error message
error parsing GitTimeout: %w
What it means
ArtifactConfigFromAgent parses GitTimeout with time.ParseDuration to build the internal ArtifactConfig used for git artifact fetches. An unparseable duration string produces this wrapped error and nil config.
Solutions
- Set git_timeout to a valid Go duration, e.g. "30m" or "1h", in the agent config
- Inspect the rendered config file (nomad agent -config output / logs) to confirm the actual string passed in
- Validate with time.ParseDuration at config-load time in tooling that generates Nomad configs
Example fix
// before git_timeout = "900" // after git_timeout = "900s"
Defensive patterns
Strategy: validation
Validate before calling
if _, err := time.ParseDuration(*c.GitTimeout); err != nil {
return fmt.Errorf("invalid git_timeout %q: %w", *c.GitTimeout, err)
} Type guard
func validDuration(s *string) bool { if s == nil { return false }; _, err := time.ParseDuration(*s); return err == nil } Try / catch
cfg, err := config.ArtifactConfigFromAgent(agentCfg)
if err != nil {
if strings.Contains(err.Error(), "error parsing GitTimeout") {
return fmt.Errorf("git_timeout must be a Go duration like 30m: %w", err)
}
return err
} Prevention
- Use standard Go duration syntax (h/m/s/ms) in git_timeout
- Lint generated Nomad configs before applying them
- Default timeout values explicitly rather than relying on empty strings
When it happens
Trigger: Calling ArtifactConfigFromAgent when GitTimeout is a string time.ParseDuration rejects: "300" (no unit), "5mins", "5 min", empty string, or negative-malformed values like "-5m-".
Common situations: git_timeout in the Nomad client artifact config missing its unit; config generated from scripts/env vars yielding empty or malformed strings; copy-paste of values like "30m s" with stray characters.
Understand the failure class
- Timeouts: ETIMEDOUT, deadlines, and hung requests — what actually expires when a request times out.
Related errors
- error parsing GCSTimeout
- error parsing HgTimeout
- error parsing HTTPMaxSize
- error parsing S3Timeout
- error parsing DecompressionLimitSize
AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04).
Data as JSON: /api/errors/0a4d9e8c77f03504.
Report an issue: GitHub.
Appendix: source
Thrown at client/config/artifact.go:55
func ArtifactConfigFromAgent(c *config.ArtifactConfig) (*ArtifactConfig, error) {
httpReadTimeout, err := time.ParseDuration(*c.HTTPReadTimeout)
if err != nil {
return nil, fmt.Errorf("error parsing HTTPReadTimeout: %w", err)
}
httpMaxSize, err := humanize.ParseBytes(*c.HTTPMaxSize)
if err != nil {
return nil, fmt.Errorf("error parsing HTTPMaxSize: %w", err)
}
gcsTimeout, err := time.ParseDuration(*c.GCSTimeout)
if err != nil {
return nil, fmt.Errorf("error parsing GCSTimeout: %w", err)
}
gitTimeout, err := time.ParseDuration(*c.GitTimeout)
if err != nil {
return nil, fmt.Errorf("error parsing GitTimeout: %w", err)
}
hgTimeout, err := time.ParseDuration(*c.HgTimeout)
if err != nil {
return nil, fmt.Errorf("error parsing HgTimeout: %w", err)
}
s3Timeout, err := time.ParseDuration(*c.S3Timeout)
if err != nil {
return nil, fmt.Errorf("error parsing S3Timeout: %w", err)
}
decompressionSizeLimit, err := humanize.ParseBytes(*c.DecompressionSizeLimit)
if err != nil {
return nil, fmt.Errorf("error parsing DecompressionLimitSize: %w", err)
}
return &ArtifactConfig{View on GitHub (pinned to 482b49bf1a)