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

  1. Set git_timeout to a valid Go duration, e.g. "30m" or "1h", in the agent config
  2. Inspect the rendered config file (nomad agent -config output / logs) to confirm the actual string passed in
  3. 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

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

Related errors


AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04). Data as JSON: /api/errors/0a4d9e8c77f03504. Report an issue: GitHub.