首页/开发/CI/CD 与发布速查/并行作业与测试分片
流水线设计54 条

并行作业与测试分片

把一套测试切成多片并发执行:GitLab parallel:N 自动分配分片序号,Jest/Pytest 等按分片参数取子集。

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

测试分片是什么

把一套测试切成多片并发执行:每个分片拿到自己的编号与总数,按分片参数只跑子集,总时长近似收敛到最慢分片。parallel 不是矩阵:矩阵是不同参数维度,parallel 是同一作业的并行副本,用来摊薄长测试套件的反馈时间,均衡性决定收益上限。

基本信息

GitLabparallel: N,作业内可用 $CI_NODE_INDEX 与 $CI_NODE_TOTAL
分片工具pytest-split、jest --shard、rspec 等按分片号选用例
收益测试时长近似按分片数收敛,受 Runner 并发上限约束
均衡最慢分片决定总时长,先按历史耗时切分
汇总分片报告需要汇总作业统一合并

典型使用场景

  • 大测试套件:全量跑太慢,切分后并行回收时间。
  • 按文件切分:实现简单,均衡性依赖文件耗时分布。
  • 按历史耗时切分:按上次耗时分配,长尾明显缩短。
  • 按模块切分:集成测试按业务域分开执行。
  • 配合缓存:分片共享依赖缓存减少重复安装。

GitLab 分片

GitLab 分片
test:
  parallel: 4
  script: ./ci/run-tests.sh $CI_NODE_INDEX $CI_NODE_TOTAL

切分方式对照

方式优点缺点
按文件数实现简单耗时不均,长尾明显
按历史耗时均衡较好需要历史数据支撑
按业务模块语义清晰模块大小差异大
分片不均衡(个别分片慢)会让整体等待落伍者,先按耗时分布切分再谈扩容。
分片作业的产物默认同名:按分片号命名或控制上传范围,避免互相覆盖。
并行度受 Runner 并发上限约束:分片数超过可用额度,多出的分片只是排队等待。
分片数不是越多越好:加到一定数量后收益趋缓,先优化最慢分片自身再继续增加。
失败定位:分片作业失败时先看该分片负责的用例集合,编号与列表对应关系要保留在日志里。

易错点

  • parallel 与 artifacts 组合时产物命名冲突:同名产物需按分片号区分。
  • 共享测试资源被并发争用:为分片准备独立资源或串行化关键段。
  • 只切分不均衡:最慢分片决定总时长,先按耗时分布切。
  • 分片数超过 Runner 并发:多出的分片排队,整体收益打折。
  • 汇总被忽略:分片报告需要汇总作业合并,否则统计残缺。
  • 分片内仍跑全量准备:初始化脚本没有分片意识,重复开销吃掉收益。

数据来源与参考

  • GitLab Docs《Parallelize large jobs》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌