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
- 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.
.github/workflows/ci.yml
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.
Related guides
GitHub Actions if: always() still skipped when dependency is canceledFix a GitHub Actions step using if: always() that still skips - a canceled workflow short-circuits most steps…
GitHub Actions needs.<job>.outputs undefined when upstream skippedFix GitHub Actions where needs.<job>.outputs.* is empty - a skipped or failed upstream job produces no output…
GitHub Actions "This job depends on a job that was skipped"Fix a GitHub Actions job that will not run because a job it depends on was skipped - skips propagate through…