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

使用GitLab resource_groups时就绪任务无法启动的问题求助

GitLab Resource Group 抢占问题解决方案

问题根源

你的配置仅在test阶段添加resource_group,但build阶段耗时极长。GitLab默认会让新提交的流水线任务优先占用资源组,导致旧流水线完成build后,test任务永远被新提交的任务抢占,无法启动。

优化方案

方案1:将Resource Group提前到Build阶段

把resource_group绑定到build阶段,让整个build+test流程串行执行。同一时间只有一条流水线能进入build,新提交的流水线会等待当前流水线完成build+test后再启动,既保证硬件独占,也不会出现旧任务被饿死的情况。

修改后的配置:

stages:
  - pre-build
  - build
  - test

pre-build:
  stage: pre-build
  script:
    - echo "Pre build"
    - sleep 5

build:
  stage: build
  needs: [pre-build]
  script:
    - sleep 100
  resource_group: test-resource  # 资源组移至build阶段

test:
  stage: test
  needs: [pre-build, build]
  script:
    - echo "Test on hardware"
    - sleep 40
  resource_group: test-resource  # test阶段保持同一资源组

方案2:配置Resource Group为"先到先服务"(GitLab 15.10+)

如果希望build阶段可以并行,仅test阶段独占且旧任务不被抢占,可以使用GitLab 15.10及以上版本支持的process_mode参数,将资源组的排队策略从默认的latest_first改为oldest_first。

修改后的test任务配置:

test:
  stage: test
  needs: [pre-build, build]
  script:
    - echo "Test on hardware"
    - sleep 40
  resource_group:
    key: test-resource
    process_mode: oldest_first

注意:此方案会让旧流水线的test先执行,若你更希望优先运行最新提交的测试,该方案可能不适用。

方案3:自动取消旧流水线

如果核心需求是仅运行最新提交的测试,可以在流水线级别配置规则,当同分支有新提交时自动取消旧流水线,从根源上避免资源抢占问题。

添加workflow配置:

workflow:
  rules:
    - if: $CI_COMMIT_BRANCH
      when: always
      variables:
        AUTO_CANCEL_PIPELINES: "true"  # 自动取消同分支的旧流水线

总结

  • 需保留所有流水线测试执行:选择方案1(build+test串行)或方案2(先到先服务)
  • 仅需运行最新提交测试:选择方案3(自动取消旧流水线)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 00:35:20