{"record":{"id":"691dc0eac88c760b","repo":"hashicorp/packer","slug":"max-retries-must-be-a-valid-integer-s","errorCode":null,"errorMessage":"`max_retries` must be a valid integer: %s","messagePattern":"`max_retries` must be a valid integer: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packer/core.go","lineNumber":300,"sourceCode":"\t\tprovisioner = &PausedProvisioner{\n\t\t\tPauseBefore: rawP.PauseBefore,\n\t\t\tProvisioner: provisioner,\n\t\t}\n\t} else if rawP.Timeout != 0 {\n\t\tprovisioner = &TimeoutProvisioner{\n\t\t\tTimeout:     rawP.Timeout,\n\t\t\tProvisioner: provisioner,\n\t\t}\n\t}\n\tmaxRetries := 0\n\tif rawP.MaxRetries != \"\" {\n\t\trenderedMaxRetries, err := interpolate.Render(rawP.MaxRetries, c.Context())\n\t\tif err != nil {\n\t\t\treturn cbp, fmt.Errorf(\"failed to interpolate `max_retries`: %s\", err.Error())\n\t\t}\n\t\tmaxRetries, err = strconv.Atoi(renderedMaxRetries)\n\t\tif err != nil {\n\t\t\treturn cbp, fmt.Errorf(\"`max_retries` must be a valid integer: %s\", err.Error())\n\t\t}\n\t}\n\tif maxRetries != 0 {\n\t\tprovisioner = &RetriedProvisioner{\n\t\t\tMaxRetries:  maxRetries,\n\t\t\tProvisioner: provisioner,\n\t\t}\n\t}\n\n\tif rawP.Type == \"hcp-sbom\" {\n\t\tprovisioner = &SBOMInternalProvisioner{\n\t\t\tProvisioner: provisioner,\n\t\t}\n\t}\n\n\tcbp = CoreBuildProvisioner{\n\t\tPType:       rawP.Type,\n\t\tProvisioner: provisioner,","sourceCodeStart":282,"sourceCodeEnd":318,"githubUrl":"https://github.com/hashicorp/packer/blob/eb36e3c3e48a036f3e8cc94087636ee72e1303c9/packer/core.go#L282-L318","documentation":"Template validation error in generateCoreBuildProvisionerWithProvisioner: the provisioner's `max_retries` value interpolated successfully but is not an integer string (strconv.Atoi failed), e.g. max_retries = \"three\" or \"2.0\".","triggerScenarios":"generateCoreBuildProvisionerWithProvisioner: renderedMaxRetries (result of interpolate.Render of rawP.MaxRetries) is not parseable by strconv.Atoi — e.g. 'three', '3.5', '' (an env var set to empty string), or text with whitespace/suffixes. Raised during Core.Build and also reachable via GenerateCoreBuildProvisionerFromHCLBody.","commonSituations":"Env/user variable interpolated into max_retries containing a non-integer value ('', 'yes', '3 retries'); user quoting the number with units; locale-formatted numbers; decimal values.","solutions":["Set max_retries to a plain integer such as max_retries = 3","If interpolated, ensure the variable resolves to a numeric string without quotes/whitespace"],"exampleFix":"// before\n\"max_retries\": \"{{env `RETRIES`}}\"   # RETRIES=\"3x\"\n// after\n\"max_retries\": \"{{env `RETRIES`}}\"   # RETRIES=3","handlingStrategy":"validation","validationCode":"// Caller-side numeric check mirroring strconv.Atoi:\nn, err := strconv.Atoi(strings.TrimSpace(renderedMaxRetries))\nif err != nil || n < 0 {\n    return fmt.Errorf(\"max_retries %q must be a non-negative integer\", renderedMaxRetries)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Store max_retries values as plain integer strings without whitespace or units.","Use HCL2 variable validation (can(tonumber(var.x))) to enforce numeric input.","Avoid env-var indirection for numeric settings when possible.","Add CI validation step that renders the template and parses max_retries."],"tags":["provisioner","validation","integer-parsing","template-variables"],"backgroundTag":"schema-validation-failed","analyzedSha":"eb36e3c3e48a036f3e8cc94087636ee72e1303c9","analyzedAt":"2026-09-05T13:20:43.127Z","contentChangedAt":"2026-09-05T13:20:43.127Z","schemaVersion":2},"datasetVersion":"2026-09-12T17:17:11.597Z"}