GoogleContainerTools/skaffold · error
failed to copy valuesFile from GCS
Error message
failed to copy valuesFile from GCS: %w
What it means
Skaffold's Helm deployer downloads a values file when a helm values entry is a gs:// URI instead of a local path. extractValueFileFromGCS calls gcs.Gsutil.Copy to fetch the object into a temp dir; if that copy fails it wraps the underlying error with this message. It means the values file could not be retrieved from Google Cloud Storage before helm args were constructed.
Solutions
- Verify the gs:// URI exists: `gsutil ls <uri>` (fix typos in bucket/object path)
- Authenticate: `gcloud auth application-default login` (local) or grant the CI service account storage.objectViewer
- Install/verify the Google Cloud SDK (gsutil) is on PATH
- Check network/firewall access to storage.googleapis.com
- If the file is local, remove the gs:// prefix and use a relative or absolute local path
Example fix
// before valuesFiles: - gs://my-bucket/config/prod-values.yaml // after valuesFiles: - ./charts/values/prod-values.yaml
Defensive patterns
Strategy: validation
Validate before calling
// before skaffold deploy gsutil ls gs://my-bucket/config/prod-values.yaml || echo "GCS object missing or no access"
Prevention
- Prefer committing values files locally; use gs:// only when necessary
- Verify bucket access in CI with a `gsutil ls` smoke test step
- Grant the CI service account roles/storage.objectViewer on values buckets
- Keep the Cloud SDK installed in all Skaffold execution environments
When it happens
Trigger: A values.yaml path in helm releases config starts with gs:// and gcs.Copy fails: the GCS object doesn't exist, the bucket/project lacks permission (no Cloud Storage scope or no authenticated account), gsutil/cloud SDK is not installed, network is down, or the URI is malformed.
Common situations: CI service account missing roles/storage.objectViewer on the bucket; running locally without `gcloud auth application-default login`; typo in bucket name or object path; firewall blocking storage.googleapis.com; using a gs:// path where a local file was intended.
Related errors
- downloading from GCS
- error closing GCS writer
- error copying file to GCS
- failed to cache Google Cloud Storage objects from
- failed to copy object to file
AI-assisted analysis of GoogleContainerTools/skaffold@a1189de023 (2026-09-05).
Data as JSON: /api/errors/5301033a868bbca2.
Report an issue: GitHub.
Appendix: source
Thrown at pkg/skaffold/helm/args.go:188
customMap["DIGEST_HEX"] = names[1]
} else {
customMap["DIGEST_HEX"] = digest
}
// IMAGE_DOMAIN and IMAGE_REPO_NO_DOMAIN added for v2beta* 'helm+explicitRegistry' -> v3alpha* and beyond compatibility
customMap["IMAGE_DOMAIN"] = ref.Domain
customMap["IMAGE_REPO_NO_DOMAIN"] = strings.TrimPrefix(ref.BaseName, ref.Domain+"/")
customMap["IMAGE_FULLY_QUALIFIED"] = digest
return customMap
}
// Copy the value file from the GCS bucket if it starts with gs://
func extractValueFileFromGCS(v, tempDir string, gcs gcs.Gsutil) (string, error) {
// get a filename from gcs
tempValueFile := filepath.Join(tempDir, path.Base(v))
if err := gcs.Copy(context.TODO(), v, tempValueFile, false); err != nil {
return "", fmt.Errorf("failed to copy valuesFile from GCS: %w", err)
}
return tempValueFile, nil
}
View on GitHub (pinned to a1189de023)