使用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
相关产品推荐
相关产品推荐

