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

GitLab CI resource groups未生效 master分支流水线并行运行

问题根因
  • 对resource_group的作用粒度理解错误:GitLab CI资源组的锁是Job级别而非流水线级别,当前配置仅给.pre阶段的uninterruptible_job绑定了uninterruptible资源组,仅能保证这个前置Job不会跨流水线并行。该Job执行完成后会立即释放资源锁,后续pre_check/build/deploy等阶段的所有Job都未绑定资源组,不受锁限制,自然会跨流水线并行运行。
  • 资源组默认模式不满足排队需求:GitLab资源组默认处理模式为unordered(无序争抢),不会按流水线触发顺序排队,会出现后触发的流水线先抢到锁执行的情况,不符合顺序执行预期。
  • 全局配置冲突:根配置的default块设置了全局interruptible: true,新流水线触发时,旧流水线中正在运行的可中断Job会被直接取消,就算配置了资源锁,也会导致旧流水线被打断,无法完整按顺序执行。
  • 冗余配置无实际作用:uninterruptible_job中配置的environment: fake和资源组功能无关,不会对串行逻辑产生任何增益。
修复方案

按以下步骤调整配置即可实现master/release分支流水线按触发顺序排队串行执行:

  1. 调整资源组执行模式
    进入项目的 设置 > CI/CD > 资源组,找到名为uninterruptible的资源组,将处理模式从默认的「无序」修改为oldest first(最早创建的流水线优先执行),确保排队顺序符合触发先后。
  2. 抽离公共串行配置复用
    不要仅给单个前置Job绑定资源组,将串行规则抽为公共配置块,让所有master、release分支下运行的Job都继承该配置,保证从流水线第一个Job到最后一个Job执行期间,资源锁始终被当前流水线持有,其他流水线的Job无法抢占运行。示例公共配置如下:
    # 可放在根.gitlab-ci.yml的公共配置块中
    .serial_protected_branch:
      interruptible: false
      resource_group: uninterruptible
    
    之后让所有在master、release分支运行的Job都继承该配置块,比如修改.pre.yml的Job:
    uninterruptible_job:
      extends: .serial_protected_branch
      stage: .pre
      script:
        - echo "$CI_COMMIT_BRANCH is running in serial queue"
      tags:
        - assign_test
      rules:
        - if:  '$CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_BRANCH =~ /^release\/v/'
          when: always
    
    对pre_check.yml/build.yml/deploy.yml等其他文件中、会在master/release分支运行的Job,都加上extends: .serial_protected_branch即可。
  3. 移除冗余配置
    删除uninterruptible_job中无用的environment: fake配置,避免不必要的环境关联逻辑。
验证逻辑

调整完成后,多个合并到master的操作同时触发流水线时,最早触发的流水线会优先获取资源锁执行全流程,后续流水线会处于等待资源状态,直到前一个流水线所有绑定资源组的Job执行完成释放锁,才会按触发顺序依次执行,且不会被新触发的流水线中断。

内容的提问来源于stack exchange,提问作者shapale

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 09:39:19