Skip to content
Latchkey

GitHub Actions "Job has been skipped" (needs) - Why & Fix

A job with needs only runs if all needed jobs succeeded, by default. If any needed job is skipped or fails, the dependent job is skipped unless its if uses a status function.

What this error means

A job that should run after others is marked skipped, because an upstream job in needs was skipped or did not succeed.

github-actions
Job 'deploy' has been skipped because a job it depends on did not complete successfully.

Common causes

Upstream job skipped or failed

Default needs semantics require all dependencies to succeed.

Conditional upstream job did not run

A needed job gated by if that evaluated false propagates a skip downstream.

How to fix it

Override the run condition explicitly

  1. Add an if with a status function: if: always() or if: \${{ !cancelled() }}.
  2. Check upstream outcomes via needs.<job>.result when you only want some paths.
  3. Be deliberate: always() runs even on failure, so guard accordingly.
.github/workflows/ci.yml
deploy:
  needs: [build, test]
  if: ${{ !cancelled() && needs.build.result == 'success' }}
  runs-on: ubuntu-latest
  steps:
    - run: ./deploy.sh

How to prevent it

  • Decide intent: skip-on-upstream-skip (default) vs run-anyway (status functions).
  • Inspect needs.<job>.result to branch precisely.

Frequently asked questions

What causes ""Job has been skipped""?
Default needs semantics require all dependencies to succeed.
How do I fix "Job has been skipped"?
Override the run condition explicitly

Related guides

References

Latchkey auto-heals failures like this one - detected, fixed, and retried without you. Start free → 30-day trial · No credit card