Skip to content
Latchkey

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.

.github/workflows/ci.yml
- name: Run tests
  run: npm test          # exits 1 (tests failed)
  continue-on-error: true # job still succeeds - failure is hidden

Common 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.

.github/workflows/ci.yml
- name: Run tests
  run: npm test          # no continue-on-error - failure fails the job

If tolerated, inspect the outcome explicitly

  1. Give the step an id and read steps.<id>.outcome in a later step.
  2. Surface a clear annotation or summary when the tolerated step failed.
  3. 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.

Related guides

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