GoogleContainerTools/skaffold · warning

STATUSCHECK_USER_CANCELLED

STATUSCHECK_USER_CANCELLED

Error message

%d/%d deployment(s) status check cancelled

What it means

Skaffold's Kubernetes status check counts deployments whose status checks were cancelled (usually by user interruption via Ctrl-C or context cancellation). When every deployment being watched has been cancelled and at least one existed, getSkaffoldDeployStatus reports STATUSCHECK_USER_CANCELLED with this message. It signals that no deployment actually reached a final health verdict because the wait was aborted.

Source

Thrown at pkg/skaffold/kubernetes/status/status_check.go:446

			// immediately rather than waiting for for statusCheckDeadlineSeconds
			// TODO: https://github.com/GoogleContainerTools/skaffold/pull/4591
			if r.HasEncounteredUnrecoverableError() {
				if cfg.StatusCheckTolerateFailures() {
					// increase poll duration to reduce issues seen with kubectl/cluster becoming unresponsive with frequent requests
					// exponential backoff was considered but seemed to be less effective than one large increase in my testing.
					ticker = time.NewTicker(pollDuration * 10)
					continue
				}
				r.MarkComplete()
				return
			}
		}
	}
}

func getSkaffoldDeployStatus(ctx context.Context, c *counter, sc proto.StatusCode) (proto.StatusCode, error) {
	if c.total == int(c.cancelled) && c.total > 0 {
		err := fmt.Errorf("%d/%d deployment(s) status check cancelled", c.cancelled, c.total)
		return proto.StatusCode_STATUSCHECK_USER_CANCELLED, err
	}
	// return success if no failures find.
	if c.failed == 0 {
		return proto.StatusCode_STATUSCHECK_SUCCESS, nil
	}
	// construct an error message and return appropriate error code
	err := fmt.Errorf("%d/%d deployment(s) failed", c.failed, c.total)
	if sc == proto.StatusCode_STATUSCHECK_SUCCESS || sc == 0 {
		log.Entry(ctx).Debugf("found statuscode %s. setting skaffold deploy status to STATUSCHECK_INTERNAL_ERROR.", sc)
		return proto.StatusCode_STATUSCHECK_INTERNAL_ERROR, err
	}
	log.Entry(ctx).Debugf("setting skaffold deploy status to %s.", sc)
	return sc, err
}

func getDeadline(d int) time.Duration {
	if d > 0 {

View on GitHub (pinned to a1189de023)

Solutions

  1. Re-run the deploy and let the status check complete, or increase deploy.statusCheckDeadlineSeconds if the rollout legitimately needs more time
  2. If the interrupt was intentional, treat this as expected cancellation — check `kubectl rollout status` manually to confirm deployment health
  3. Verify the cluster is reachable and deployments are progressing (kubectl get deployments) so future checks finish before you cancel

Example fix

// before (skaffold.yaml)
deploy:
  statusCheckDeadlineSeconds: 30
// after
deploy:
  statusCheckDeadlineSeconds: 600
Defensive patterns

Strategy: validation

Validate before calling

// before waiting, ensure the deployment is progressing fast enough to finish inside the deadline
out, err := exec.Command("kubectl", "rollout", "status", "deployment/my-app", "--timeout=60s").CombinedOutput()
if err != nil {
    log.Fatalf("deployment not healthy, status check would be cancelled/fail: %s", out)
}

Prevention

When it happens

Trigger: Running `skaffold deploy`/`dev`/`run` with deploy.statusCheckDeadlineSeconds configured, then pressing Ctrl-C (SIGINT) or having the context cancelled while all deployment status checks are still pending, so c.cancelled == c.total > 0.

Common situations: User interrupts a slow rollout; CI job timeout kills skaffold; kubectl context is slow because the cluster's deployments take minutes to become available and the user gives up before any check resolves.

Related errors


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