Skip to content
Latchkey

GitHub Actions "Job X has been skipped" (needs result)

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.

Related guides

Tired of flaky CI? Latchkey auto-heals failed jobs and retries them for you. Start free →