← 中文资源

简体中文版本

GitLab CI 任务卡住 — 没有匹配标签的 Runner

通过对齐 runner 标签、检查共享 runner 可用性,并移除不匹配的标签要求,修复卡在 “This job is stuck” 的任务。

阅读英文原文

症状

本篇指南处理“GitLab CI 任务卡住 — 没有匹配标签的 Runner”。请从症状出发,按顺序执行诊断,在推进前确认每个假设;随后通过修复与验证步骤闭环。

可观察到的症状包括:

  • 流水线任务显示 “This job is stuck because you don’t have any active runners”
  • 带特定标签的任务从不启动,未加标签的可用
  • 卡住的任务在整个超时期间保持 pending

诊断

先在隔离环境中复现故障,再按顺序执行以下检查,逐步缩小范围。

步骤 1

grep -n "tags:" .gitlab-ci.yml; gitlab-runner list

若无 runner 声明该任务标签,任务就永远不会被拾取。

步骤 2

Admin → Runners → filter by tag and status

即便标签匹配,离线或暂停的 runner 也会导致任务卡住。

常见诱因(按出现频率排序):

  • 任务标签与任何已注册 runner 的标签都不匹配
  • 匹配的 runner 全部离线、暂停或已达容量
  • 项目禁用了共享 runner

根因

GitLab 只会把任务调度到宣告了任务所需的全部标签的 runner 上。某标签无匹配 runner 时,任务会保持 pending 直到超时(“卡住”),因为没有可用的 runner。

修复

让任务与 runner 的标签对齐,注册带所需标签的 runner,确保匹配的 runner 在线且未暂停,并移除任务中不必要的标签。

注意:使用仅存在于临时 runner 上的标签,会在其缩容时使流水线不稳定;应记录 runner 集群要求。

stages: [build]

build:
  stage: build
  tags:
    - docker        # every eligible runner must advertise this tag
    - linux
  script:
    - make build

# check registered runners and their tags
# gitlab-runner list
# gitlab-runner verify

验证

重跑流水线并确认任务被匹配的 runner 拾取并完成;验证该 runner 的最近构建中出现该任务。

修复后补充一条回归测试,复现原始症状,防止问题再次出现。

这类故障通常是环境问题而非纯逻辑错误,因此在缺陷记录中应写明完整命令、环境变量与工作目录。请用最小的脚本复现,待最小用例清楚后再扩大范围。为这类故障准备一份简短的排查清单,能显著减少下次排障时间。