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.
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
- Add an if with a status function: if: always() or if: \${{ !cancelled() }}.
- Check upstream outcomes via needs.<job>.result when you only want some paths.
- Be deliberate: always() runs even on failure, so guard accordingly.
deploy:
needs: [build, test]
if: ${{ !cancelled() && needs.build.result == 'success' }}
runs-on: ubuntu-latest
steps:
- run: ./deploy.shHow to prevent it
- Decide intent: skip-on-upstream-skip (default) vs run-anyway (status functions).
- Inspect needs.<job>.result to branch precisely.