GoogleContainerTools/skaffold · error
StatusCode_DEPLOY_CLOUD_RUN_GET_WORKER_POOL_ERR
StatusCode_DEPLOY_CLOUD_RUN_GET_WORKER_POOL_ERR
Error message
error checking Cloud Run State: %w
What it means
deployWorkerPool probes for an existing WorkerPool with crclient.Namespaces.Workerpools.Get(wpName). Any error other than googleapi 404 (which is treated as 'create a new pool') is wrapped as DEPLOY_CLOUD_RUN_GET_WORKER_POOL_ERR, because skaffold cannot establish the WorkerPool's current state.
Source
Thrown at pkg/skaffold/deploy/cloudrun/deploy.go:459
workerpool.Spec.Template.Metadata.Labels["run-id"] = runID
}
}
resName := RunResourceName{
Project: workerpool.Metadata.Namespace,
Region: d.Region,
WorkerPool: workerpool.Metadata.Name,
}
output.Default.Fprintln(out, "Deploying Cloud Run WorkerPool:\n\t", workerpool.Metadata.Name)
parent := fmt.Sprintf("namespaces/%s", workerpool.Metadata.Namespace)
wpName := resName.String()
getCall := crclient.Namespaces.Workerpools.Get(wpName)
_, err := getCall.Do()
if err != nil {
gErr, ok := err.(*googleapi.Error)
if !ok || gErr.Code != http.StatusNotFound {
return nil, sErrors.NewError(fmt.Errorf("error checking Cloud Run State: %w", err), &proto.ActionableErr{
Message: err.Error(),
ErrCode: proto.StatusCode_DEPLOY_CLOUD_RUN_GET_WORKER_POOL_ERR,
})
}
// This is a new workerpool, we need to create it
createCall := crclient.Namespaces.Workerpools.Create(parent, workerpool)
_, err = createCall.Do()
} else {
replaceCall := crclient.Namespaces.Workerpools.ReplaceWorkerPool(wpName, workerpool)
_, err = replaceCall.Do()
}
if err != nil {
return nil, sErrors.NewError(fmt.Errorf("error deploying Cloud Run WorkerPool: %s", err), &proto.ActionableErr{
Message: err.Error(),
ErrCode: proto.StatusCode_DEPLOY_CLOUD_RUN_UPDATE_WORKER_POOL_ERR,
})
}
return &resName, nilView on GitHub (pinned to a1189de023)
Solutions
- Grant the caller the required Cloud Run WorkerPool IAM permissions
- Enable run.googleapis.com on the target project
- Verify the region/endpoint configuration matches where the WorkerPool lives
- Inspect the wrapped googleapi.Error code and retry transient 5xx
Defensive patterns
Strategy: retry
Validate before calling
// verify WorkerPool reachability before deploy
name := fmt.Sprintf("projects/%s/locations/%s/workerpools/%s", project, region, wpName)
if _, err := runSvc.Projects.Locations.Workerpools.Get(name).Do(); err != nil {
var gErr *googleapi.Error
if errors.As(err, &gErr) && gErr.Code != 404 {
return fmt.Errorf("cannot reach WorkerPool API (code %d): %w", gErr.Code, err)
}
} Type guard
func isWorkerPoolNotFound(err error) bool {
gErr, ok := err.(*googleapi.Error)
return ok && gErr.Code == http.StatusNotFound
} Try / catch
err := deployWorkerPool(crclient, manifest, out)
if err != nil {
var gErr *googleapi.Error
if errors.As(err, &gErr) {
if gErr.Code == 403 {
return fmt.Errorf("grant WorkerPool IAM permissions: %w", err)
}
if gErr.Code >= 500 || gErr.Code == 429 {
return retry.WithBackoff(ctx, deploy)
}
}
return err
} Prevention
- Grant roles/run.developer including WorkerPool scopes
- Enable the Cloud Run API (and WorkerPool access if alpha) for the project
- Confirm correct region endpoint in deploy config
- Back off and retry on 429/5xx responses
When it happens
Trigger: Workerpools.Get fails with 403 permission denied, 429 quota exceeded, 5xx server error, or a transport/auth error rather than a clean 404.
Common situations: Missing IAM roles for WorkerPools (roles/run.developer or preview roles for the WorkerPool alpha); Cloud Run API not enabled; wrong region endpoint; network/firewall blocking googleapis.com; transient control-plane errors.
Related errors
- StatusCode_DEPLOY_CLOUD_RUN_UPDATE_WORKER_POOL_ERR
- StatusCode_DEPLOY_CLOUD_RUN_DELETE_WORKER_POOL_ERR
- skaffold apply called with both Cloud Run and Kubernetes dep
- INIT_CLOUD_RUN_LOCATION_ERROR
- PORT_FORWARD_RUN_GCLOUD_NOT_FOUND
AI-assisted analysis of GoogleContainerTools/skaffold@a1189de023 (2026-09-05).
Data as JSON: /api/errors/cc4bb5721cf015b9.
Report an issue: GitHub.