首页/开发/CI/CD 与发布速查/并发控制与部署互斥(resource_group / concurrency)
流水线设计54 条

并发控制与部署互斥(resource_group / concurrency)

对同一环境的部署加互斥锁:同一时刻只允许一个流水线操作该环境,避免两个版本相互覆盖。

CI/CD 与发布速查开发更新于 2026-10-13

并发控制是什么

对同一环境的操作加互斥锁:同一时刻只允许一个流水线或作业操作该环境,避免两个版本同时部署相互覆盖。与「自动取消冗余运行」是两种不同策略:互斥是排队,后到者等待;取消是打断,旧运行被终止。选哪种取决于该环境上「旧操作是否必须完成」,部署类操作通常必须完成后才允许下一个。

基本信息

GitLabresource_group 同名作业串行执行,常用于部署作业
GitHubconcurrency 分组加 cancel-in-progress 设置
典型键名production、staging、deploy-环境名
语义区分互斥是排队等待;cancel-in-progress 是打断旧运行
粒度按实际互斥范围命名,避免所有环境共用一个组

GitLab

GitLab
deploy-prod:
  stage: deploy
  resource_group: production
  script: ./ci/deploy.sh prod

GitHub

GitHub
concurrency:
  group: production
  cancel-in-progress: false

典型使用场景

  • 生产部署串行:多个合并请求的部署依次排队执行。
  • 共享环境互斥:测试环境被多分支共用时保证独占。
  • 数据库迁移锁:同一库的结构变更脚本串行执行。
  • 发布窗口:指定时段内仅允许一条发布流水线。
  • 资源排他:部署会重启共享服务,必须单个执行。

两种策略对照

策略行为适用
互斥排队后来者等待前一个完成部署必须完整执行
取消旧运行新运行打断旧运行只关心最新提交结果
组合使用组内互斥加可中断作业取消常见的生产配置
并发组按环境粒度过粗会拖慢无关发布,按实际互斥范围命名。
GitHub 的并发组按仓库计算,同名即可互斥;分支场景使用同一组名时注意作用范围是否如预期。
部署类作业不要开启取消:被中断的部署可能留下半完成环境,需要人工核对后收尾。

易错点

  • 互斥只挡同时执行,不挡排队顺序变化:需要严格顺序时用队列语义。
  • GitHub 并发组作用域按仓库加分支计算,跨分支互斥要在命名上显式对齐。
  • 部署作业可被取消:半完成环境要人工核对,部署组禁用 cancel。
  • 锁颗粒度太粗:所有环境共用一个组名,无关发布互相排队。
  • 手动作业绕过锁:应急手推与流水线并发执行,事故来源。
  • 只给部分作业加锁:迁移上了锁、应用没上,执行顺序依然混乱。

数据来源与参考

  • GitLab Docs《Resource groups》
  • GitHub Docs《Using concurrency》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌