使用Docker执行器的GitLab Runner如何禁用同实例并发任务?
问题原因
- 版本固有缺陷:GitLab Runner 14.4.0存在已知并发控制bug,全局
concurrent参数和单Runner的limit参数在部分场景下会失效,导致Runner实际接收到的任务数超过配置上限。 - 变量缺陷:
CI_CONCURRENT_ID变量在14.4.x版本中存在未修复的问题,无论实际并发数多少,该变量值始终返回0,直接导致自定义克隆路径的隔离方案失效。 - 存储配置冲突:你在Docker executor的
volumes中配置了/builds:/builds:rw,将宿主机的构建目录共享给所有任务容器,一旦出现多任务并发,不同任务会同时操作同一路径下的git仓库,直接触发git锁报错。
可行解决方案
1. 修复单Runner并发控制失效问题
- 优先将GitLab Runner升级至14.4.3及以上的14.4稳定小版本,该版本已修复并发参数不生效的bug,升级后你现有的
concurrent = 1加单Runnerlimit = 1的配置即可正常生效,保证单个Runner最多同时运行1个任务。 - 若暂时无法升级版本,可在
[[runners]]配置段下新增request_concurrency = 1参数,该参数会强制限制单个Runner每次只能向GitLab申请1个任务,从源头避免被分配多个并发任务。 - 检查Runner的进程运行状态,确保同一台宿主机上只有1个Runner进程读取对应配置文件,避免多Runner进程叠加导致的任务并发。
2. 兜底解决git锁冲突问题
- 移除
volumes配置中的"/builds:/builds:rw"挂载项,默认情况下Docker executor会为每个任务创建独立的容器存储层,不会共享构建目录,从根源避免不同任务的git目录冲突。 - 若业务必须共享宿主机的
/builds目录,可放弃失效的CI_CONCURRENT_ID变量,改用全局唯一的CI_JOB_ID作为目录区分字段,修改.gitlab-ci.yml的变量配置如下:
variables: GIT_CLONE_PATH: ${CI_BUILDS_DIR}/${CI_JOB_ID}/${CI_PROJECT_NAME}
CI_JOB_ID为每个任务的唯一标识,不会出现重复,可完美实现不同任务的构建目录隔离。
3. 多Runner场景适配方案
若需要部署多个Runner,只需保证每个Runner的配置都设置limit = 1,同时将全局concurrent参数设置为Runner的总数量,即可实现每个Runner最多同时运行1个任务,总并发数等于Runner数量的效果,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者Laurent Michel
相关产品推荐
相关产品推荐

