如何强制GitLab在启动新流水线前执行完完整流水线?
让GitLab流水线串行执行(等待上一条完整完成再启动新流水线)
你已经把Runner的concurrent设为1了,但这个配置只是限制该Runner同时能跑的单个job数量,并不能控制整个流水线的串行执行——因为GitLab默认还是会为新提交创建新流水线,哪怕上一条还在跑,只是新流水线的job会排队等Runner空闲。
要实现「启动新流水线前必须等当前完整流水线执行完毕」,可以从以下两个方向入手:
1. 启用项目内置的串行化设置(最简单直接)
GitLab自带全局流水线串行功能,一步就能搞定:
- 进入你的项目 → 左侧栏点击「设置」→ 选择「CI/CD」
- 找到「流水线」板块,开启**「串行化流水线」**选项
- 开启后,项目所有流水线会严格按顺序执行:新流水线会进入队列,直到前一条流水线完全结束(无论成功还是失败)才会启动
2. 用CI配置添加资源锁(灵活适配特定场景)
如果不想全局串行,只想针对特定流水线或阶段做限制,可以用GitLab的resource_group功能,给所有流水线job绑定同一个资源组:
before_script: - echo %CI_COMMIT_SHA% - echo %CI_PROJECT_DIR% stages: - createPBLs - build - package # 定义默认模板,绑定资源组 .default_serial_job: resource_group: exclusive_project_pipeline create PBLs: stage: createPBLs extends: .default_serial_job script: - md "C:\HierBauen\%CI_COMMIT_SHA%\" - xcopy /y /s "C:/Bauen" "C:/HierBauen/%CI_COMMIT_SHA%" - xcopy /y /s "%CI_PROJECT_DIR%" "C:\HierBauen\%CI_COMMIT_SHA%" - cd "C:\HierBauen\%CI_COMMIT_SHA%" # 你的后续脚本... build: stage: build extends: .default_serial_job script: # 你的构建脚本... package: stage: package extends: .default_serial_job script: # 你的打包脚本...
绑定同一个资源组后,同一时间只有该组下的一个job能运行,间接实现了整条流水线的串行——上一条流水线的job没跑完,下一条的所有job都会处于排队状态。
验证配置效果
设置完成后,你可以手动触发两次流水线,到「流水线」页面观察:
- 第二条流水线会显示「等待资源」或「排队中」的状态
- 直到第一条流水线的所有阶段都执行完毕,第二条才会正式启动
注意:如果用的是共享Runner,concurrent=1只对该Runner自身有效,共享Runner可能还有其他项目在占用;所以搭配项目串行化设置,或者使用专属Runner,能确保效果更稳定。
内容的提问来源于stack exchange,提问作者Hendouz
相关产品推荐
相关产品推荐

