Skip to content

/codes/github-actions/job-and-step-conclusions

GitHub Actions conclusions: success, failure, cancelled, skipped

The commands on this page have not been executed by our verification runner yet.updated 2026-10-20
tool
GitHub Actions
versions
GitHub Actions
os
any

GitHub Actions turns process exit codes into results. A step whose process exits 0 succeeds; any other code fails it. A failed step fails its job (unless continue-on-error: true), and the run's result is the combination of its jobs.

Conclusions

ConclusionMeaning
successeverything that ran succeeded
failurea step or job failed (non-zero exit, or an action reported failure)
cancelledcancelled by a user, by concurrency, or by fail-fast in a matrix
skippedthe if: condition was false, or a needed job did not succeed
timed_outthe job exceeded timeout-minutes (default 360)

Status check functions

FunctionTrue when
success()no earlier step failed or was cancelled (the implicit default of every if:)
failure()an earlier step, or a needed job, failed
cancelled()the run was cancelled
always()always, even after cancellation
yaml
- run: npm test
- name: Upload logs on failure
  if: failure()
  run: tar czf logs.tgz logs/
- name: Notify
  if: always()
  run: echo "tests finished with ${{ job.status }}"

Step outcome vs conclusion

steps.<id>.outcome is the result before continue-on-error is applied; steps.<id>.conclusion is after. A step that failed with continue-on-error: true has outcome: failure and conclusion: success.

Actions set exit codes too

In a JavaScript action, core.setFailed('message') sets exit code 1; in a Docker or composite action, exiting non-zero fails the step the same way.

Sources