Overview
When multiple pipelines use the same serial-group, CircleCI skips jobs from older pipelines (lower pipeline numbers) if a newer pipeline is already running or waiting in that group.
As of April 2026, superseded serial group start jobs report not_run instead of failed. Because not_run is a non-failure terminal state, the workflow and pipeline can show Success even though critical jobs (deploy, smoke tests, etc.) never ran.
That is expected platform behaviour, not a bug. It keeps newer commits from being blocked by stale pipelines. If you gate CD on pipeline/workflow status, preempted runs can look like “CI passed” when tests or deploys were never executed.
Why this happens
Serial groups use a shared lock keyed by your serial-group value. When an older pipeline reaches the serial group start step while a newer pipeline holds (or is waiting for) the lock, the older job is rejected with job_already_running and marked not_run.
Important details:
- Skipped jobs are removed from the queue - they do not wait and resume later.
- Priority is based on pipeline number (higher = newer = takes precedence).
-
not_runis a job-level status. There is no separate workflow status that means “preempted by serial group.”
For background, see Controlling serial execution across your organisation and the troubleshooting section “Job skipped unexpectedly?”
Solution: add a failure gate on not_run
To fail the workflow when a serial-group job is preempted, add a downstream job that runs only when the protected job ends not_run, and have that job exit with a non-zero code. Here is an example:
jobs:
smoke-tests:
docker:
- image: cimg/base:stable
steps:
- run: ...
fail-if-smoke-not-run:
docker:
- image: cimg/base:stable
steps:
- run:
name: Smoke tests did not run (serial group preempted)
command: |
echo "smoke-tests was skipped (not_run) — likely preempted by a newer pipeline in the same serial group."
exit 1
workflows:
deploy:
jobs:
- build
- smoke-tests:
serial-group: my-project/smoke-tests
requires:
- build
- fail-if-smoke-not-run:
requires:
- smoke-tests: not_runThis creates a dependent job on the serial job which requires it to be not_run. If this dependency is satisfied, the job will execute and immediately exit with an error code causing the entire workflow to show "Failed", allowing preempted workflows to be correctly used for gating other aspects of your deployment pipeline.
Comments
Article is closed for comments.