You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何强制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:32:52