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分支流水线按触发顺序排队串行执行:
- 调整资源组执行模式
进入项目的 设置 > CI/CD > 资源组,找到名为uninterruptible的资源组,将处理模式从默认的「无序」修改为oldest first(最早创建的流水线优先执行),确保排队顺序符合触发先后。 - 抽离公共串行配置复用
不要仅给单个前置Job绑定资源组,将串行规则抽为公共配置块,让所有master、release分支下运行的Job都继承该配置,保证从流水线第一个Job到最后一个Job执行期间,资源锁始终被当前流水线持有,其他流水线的Job无法抢占运行。示例公共配置如下:
之后让所有在master、release分支运行的Job都继承该配置块,比如修改# 可放在根.gitlab-ci.yml的公共配置块中 .serial_protected_branch: interruptible: false resource_group: uninterruptible.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: alwayspre_check.yml/build.yml/deploy.yml等其他文件中、会在master/release分支运行的Job,都加上extends: .serial_protected_branch即可。 - 移除冗余配置
删除uninterruptible_job中无用的environment: fake配置,避免不必要的环境关联逻辑。
验证逻辑
调整完成后,多个合并到master的操作同时触发流水线时,最早触发的流水线会优先获取资源锁执行全流程,后续流水线会处于等待资源状态,直到前一个流水线所有绑定资源组的Job执行完成释放锁,才会按触发顺序依次执行,且不会被新触发的流水线中断。
内容的提问来源于stack exchange,提问作者shapale
相关产品推荐
相关产品推荐

