{"record":{"id":"92a0962b0f2ea434","repo":"grafana/k6","slug":"invalid-stack-url-w-92a096","errorCode":null,"errorMessage":"invalid stack URL: %w","messagePattern":"invalid stack URL: %w","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/cmd/cloud.go","lineNumber":592,"sourceCode":"\tif projectID > 0 {\n\t\ttmpCloudConfig[\"projectID\"] = projectID\n\n\t\tb, err := json.Marshal(tmpCloudConfig)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tarc.Options.Cloud = b\n\n\t\tcloudConfig.ProjectID = null.IntFrom(projectID)\n\t}\n\treturn nil\n}\n\nfunc resolveCloudTestURL(stackURL string, testID int64) (string, error) {\n\tu, err := url.Parse(stackURL)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"invalid stack URL: %w\", err)\n\t}\n\n\treturn u.JoinPath(\"a\", \"k6-app\", \"tests\", strconv.FormatInt(testID, 10)).String(), nil\n}\n","sourceCodeStart":574,"sourceCodeEnd":597,"githubUrl":"https://github.com/grafana/k6/blob/93accf6570dcd306ca5e99cc44c393ee3797761b/internal/cmd/cloud.go#L574-L597","documentation":"resolveCloudTestURL parses the configured stack URL with url.Parse before joining the test path; if parsing fails this error wraps the url package's parse error. url.Parse almost never fails — only malformed input such as control characters, a bad percent-encoding (e.g. '%zz'), or an invalid port triggers it. The stack URL comes from the login config or K6_CLOUD_STACK_URL.","triggerScenarios":"The stored stack URL or K6_CLOUD_STACK_URL contains control characters, invalid escape sequences, or a malformed port (e.g. 'https://team.grafana.net:80x' or a value copied with an embedded newline).","commonSituations":"Hand-edited config.json; CI variables injected with a trailing newline or carriage return; stack URLs assembled by string concatenation with unescaped characters.","solutions":["Re-run `k6 cloud login` to store a clean, canonical stack URL","Fix or unset K6_CLOUD_STACK_URL; it must be a plain absolute URL like https://team.grafana.net","Strip whitespace/newlines from CI-injected URL variables"],"exampleFix":"# before\nexport K6_CLOUD_STACK_URL=$'https://team.grafana.net\\r'\n# after\nexport K6_CLOUD_STACK_URL=https://team.grafana.net","handlingStrategy":"validation","validationCode":"if raw, ok := os.LookupEnv(\"K6_CLOUD_STACK_URL\"); ok {\n    trimmed := strings.TrimSpace(raw)\n    u, err := url.Parse(trimmed)\n    if err != nil || u.Scheme == \"\" || u.Host == \"\" {\n        log.Fatalf(\"K6_CLOUD_STACK_URL=%q is not an absolute URL\", raw)\n    }\n}","typeGuard":"func isValidStackURL(raw string) bool {\n    u, err := url.Parse(strings.TrimSpace(raw))\n    return err == nil && u.Scheme != \"\" && u.Host != \"\"\n}","tryCatchPattern":null,"preventionTips":["Trim whitespace/newlines from CI-injected URLs","Prefer `k6 cloud login` to store the canonical stack URL","Never assemble stack URLs by string concatenation with unvalidated parts"],"tags":["url","configuration","cloud","validation"],"backgroundTag":null,"analyzedSha":"93accf6570dcd306ca5e99cc44c393ee3797761b","analyzedAt":"2026-08-15T21:23:27.118Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}