hashicorp/nomad · error
error parsing GitTimeout: %w
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.
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)
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 HTTPMaxSize: %w
- error parsing GCSTimeout: %w
- error parsing HgTimeout: %w
- error parsing S3Timeout: %w
- error parsing HTTPReadTimeout: %w
AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04).
Data as JSON: /api/errors/0a4d9e8c77f03504.
Report an issue: GitHub.