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, nil

View on GitHub (pinned to a1189de023)

Solutions

  1. Grant the caller the required Cloud Run WorkerPool IAM permissions
  2. Enable run.googleapis.com on the target project
  3. Verify the region/endpoint configuration matches where the WorkerPool lives
  4. 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

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


AI-assisted analysis of GoogleContainerTools/skaffold@a1189de023 (2026-09-05). Data as JSON: /api/errors/cc4bb5721cf015b9. Report an issue: GitHub.