自托管GitLab Runner虚拟机中GitLab父子管道运行故障排查与解决方案问询
解决GitLab父子管道Runner匹配及多Runner部署问题
一、子管道Job卡住的核心原因及修复方案
你的子管道Job一直处于等待状态,核心问题是Runner标签不匹配:
- 你注册项目Runner时指定了
--tag-list "my_devops, MY_TOKEN",这意味着这个Runner只会承接带有对应标签的Job; - 但你的子管道所有Job(比如
job-np-queues)都没有配置tags字段,导致Runner无法匹配这些任务,最终Job卡住。
两种修复方式任选其一:
给子管道Job添加匹配标签
在子管道的每个Job中补充tags配置,和Runner的标签对应上:job-np-queues: script: - echo "DO THINGS" timeout: 40m tags: - my_devops # 和你的Runner标签一致后续所有子管道Job都需要添加相同标签(或至少包含Runner的其中一个标签)。
允许Runner处理无标签Job
如果不想给每个Job加标签,可以修改Runner的配置:- 进入项目的
Settings > CI/CD > Runners页面; - 找到你的项目Runner,点击右侧编辑按钮;
- 勾选Run untagged jobs选项并保存。
- 进入项目的
二、组Runner未显示在项目可用列表的排查点
组Runner不出现,通常是以下几个配置问题导致:
项目未启用共享Runner
进入项目Settings > CI/CD > Runners,确认Enable shared runners for this project选项已勾选(这个开关控制是否允许组级共享Runner在当前项目运行)。组Runner的标签或状态限制
- 如果组Runner设置了专属标签,而项目Job没有对应标签,它不会显示在可用列表(或显示但无法承接任务);
- 检查组Runner的状态是否为在线,离线的Runner不会出现在可用列表中。
Runner注册范围错误
确认组Runner是注册到当前项目所属的群组,注册时选错群组会导致Runner无法同步到项目。
三、同一虚拟机部署多个Shell Runner的方法
完全可以在同一台虚拟机部署多个GitLab Runner,操作步骤如下:
重复执行注册命令
使用不同的描述和标签(也可相同,按需调整)再次注册Runner,示例命令:gitlab-runner register \ --non-interactive \ --url "https://gitlab.com/" \ --registration-token "YOUR_GROUP_OR_PROJECT_TOKEN" \ --description "devops secondary runner" \ --tag-list "my_devops_secondary, backup" \ --executor "shell"注意每个Runner要使用对应的注册令牌(项目令牌或组令牌)。
管理多个Runner实例
- 查看所有已注册的Runner:
gitlab-runner list - 启动所有Runner:
gitlab-runner start(GitLab Runner会自动管理多个实例) - 单独启停某个Runner:
gitlab-runner start [RUNNER_NAME]
- 查看所有已注册的Runner:
注意事项
- 由于都是Shell执行器,多个Runner会共享虚拟机资源,可在
/etc/gitlab-runner/config.toml中修改concurrent值调整并发数(默认是1,可根据CPU核心数适当增加); - 不同Runner设置不同标签,能方便在CI Job中指定特定Runner执行任务。
- 由于都是Shell执行器,多个Runner会共享虚拟机资源,可在
内容的提问来源于stack exchange,提问作者TPPZ




