GitHub Actions continue-on-error Silently Masks a Failing Step
A job passes even though a step failed because continue-on-error: true tells GitHub to ignore that step’s non-zero exit. Misapplied, it masks real failures and lets broken code merge.
What this error means
A test or build step clearly errored in the logs, yet the step shows a yellow/green outcome and the job succeeds. A required check passes despite the underlying failure.
- name: Run tests
run: npm test # exits 1 (tests failed)
continue-on-error: true # job still succeeds - failure is hiddenCommon causes
continue-on-error applied too broadly
Setting continue-on-error: true on a critical step makes its failure non-fatal. The job conclusion ignores it, so a genuine failure looks like success.
Outcome not re-checked downstream
When you intentionally tolerate a step’s failure, you must inspect steps.<id>.outcome later. Omitting that check means the failure is swallowed entirely.
How to fix it
Remove it from steps that must fail the job
Let critical steps fail normally so the job and any required checks reflect reality.
- name: Run tests
run: npm test # no continue-on-error - failure fails the jobIf tolerated, inspect the outcome explicitly
- Give the step an id and read steps.<id>.outcome in a later step.
- Surface a clear annotation or summary when the tolerated step failed.
- Reserve continue-on-error for genuinely optional steps (e.g. uploading a debug artifact).
How to prevent it
- Never put continue-on-error on tests, builds, or other gating steps.
- When tolerating failure, always check steps.<id>.outcome downstream.
- Audit workflows for continue-on-error that hides real failures.