GitLab CI Pipeline Stuck 'Pending': No Runner Available

A GitLab pipeline that sits on 'pending' forever isn't broken — no runner has picked up the job. There are only a few reasons a runner ignores a job, and tags are usually one of them.

BytExplorer 6 min read July 18, 2026

Your pipeline starts and then just… waits:

Stuck; the job is stuck because you don't have any active runners
that can run this job. Go to Runners page.

A pending job means GitLab created the work but no runner has accepted it. GitLab isn't failing — it's waiting for a machine that's allowed to run this specific job to show up. Runners are picky in a few well-defined ways, and one of them is why yours is being skipped.

Step 1: Is a runner online at all?

Go to Settings → CI/CD → Runners (project or group). You need at least one runner with a green status.

  • No runners listed → none are registered. Register one (gitlab-runner register) or, on GitLab.com, enable shared runners.
  • Runner is grey/offline → the gitlab-runner service isn't running or lost contact. On the runner host: sudo gitlab-runner verify and sudo systemctl status gitlab-runner.

Step 2: Do the tags match? (the usual culprit)

A runner only picks a job if the job's tags are a subset of the runner's tags. Mismatch = the job is ignored forever.

# .gitlab-ci.yml
build:
  tags: [docker]        # only a runner tagged 'docker' will take this
  script: ...

If your runner is tagged linux but the job asks for docker, nobody bites. Fix by aligning them: give the job a tag the runner actually has, or add the tag to the runner in its settings.

Step 3: Untagged jobs need an untagged-friendly runner

A job with no tags will only run on a runner configured to "Run untagged jobs." By default, many registered runners are not. Two fixes:

  • Tick "Run untagged jobs" on the runner (Settings → CI/CD → Runners → edit).
  • Or give the job a tag that matches the runner.

Step 4: Is the runner locked or protected-only?

  • A project runner can be locked to a project — it won't serve others.
  • A runner set to "Run on protected branches only" ignores jobs on regular branches. If your pipeline is on a feature branch, either unprotect the requirement or run on a protected branch.

Step 5: Concurrency

If concurrent = 1 in the runner's config.toml and it's already busy with another job, new jobs queue as pending until it frees up. Raise concurrent if the host can handle it.

The checklist

  1. Settings → CI/CD → Runners — at least one runner must be green/online.
  2. Match the job's tags to the runner's tags (the most common cause).
  3. Untagged job? Enable "Run untagged jobs" on the runner.
  4. Check the runner isn't locked or protected-branches-only.
  5. Raise concurrent in config.toml if the runner is simply busy.

Frequently Asked Questions

Why is my GitLab job stuck on pending?

No runner has accepted it. Either there's no online runner, or the runner's tags/settings exclude the job — most often the job's tags don't match any runner, or the job is untagged and no runner is set to run untagged jobs.

What does 'Run untagged jobs' do?

By default a runner may only take jobs whose tags it shares. Enabling "Run untagged jobs" lets it also pick up jobs that specify no tags. Without it, an untagged job can sit pending forever even with an online runner.

How do I check if my GitLab runner is online?

In the project or group, open Settings → CI/CD → Runners and look for a green status dot. On the runner host, run sudo gitlab-runner verify and sudo systemctl status gitlab-runner.

Put it into practice

Stop reading, start building

This pairs with a hands-on BytExplorer course — do it on your own machine and actually keep the skill.

More in Troubleshooting