本文目录导读:

开源项目的CI测试矩阵配置通常需要覆盖多版本、多操作系统、多依赖组合以及不同硬件架构,具体配置方式取决于你使用的 CI 平台(GitHub Actions、GitLab CI、Jenkins 等)。
以下以最流行的 GitHub Actions 和 GitLab CI 为例,给出典型的测试矩阵配置方法。
GitHub Actions 配置(最常用)
GitHub Actions 通过 strategy.matrix 来实现矩阵构建,以下是一个针对 Python 项目的完整示例:
基础矩阵:多版本 + 多操作系统
name: CI
on:
push:
branches: [ main, dev ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest] # 操作系统矩阵
python-version: ['3.9', '3.10', '3.11', '3.12'] # 版本矩阵
include: # 额外添加特定组合(可选)
- os: ubuntu-latest
python-version: '3.8' # 额外测试旧版
exclude: # 排除已知不兼容组合(可选)
- os: windows-latest
python-version: '3.8'
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
pip install -r requirements.txt
pip install pytest
- name: Run tests
run: pytest
依赖组合矩阵(例如不同数据库版本、不同库版本)
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
# 版本与数据库两个维度组合
python-version: ['3.10', '3.11']
database: ['postgres:13', 'postgres:14', 'mysql:8.0']
services:
# 根据矩阵动态启动数据库容器
db:
image: ${{ matrix.database }}
env:
POSTGRES_PASSWORD: testpass
MYSQL_ROOT_PASSWORD: testpass
ports:
- 5432:5432
- 3306:3306
并行限制与失败处理
strategy:
fail-fast: false # 某个 Job 失败时,不要停止其他 Job(推荐用于开源项目)
max-parallel: 8 # 同时最多运行 8 个 Job(防止免费额度超限)
matrix:
node-version: [14, 16, 18, 20]
GitLab CI 配置
GitLab CI 使用 parallel 和 matrix 关键字(需要 GitLab 13.3+)。
使用 parallel:matrix
stages:
- test
test:
stage: test
image: python:${PYTHON_VERSION}
parallel:
matrix:
- PYTHON_VERSION: ['3.9', '3.10', '3.11']
OS: ['ubuntu', 'windows'] # 注意:Windows Runner 需要单独配置 tag
script:
- pip install -r requirements.txt
- pytest
tags:
- $OS # 根据矩阵变量动态选择 Runner
使用 extends 实现更复杂的矩阵
.test-template: stage: test script: pytest test-python3.9: extends: .test-template image: python:3.9 test-python3.10: extends: .test-template image: python:3.10 test-python3.11: extends: .test-template image: python:3.11
关键设计原则
| 原则 | 说明 | 示例 |
|---|---|---|
| 最小化冗余 | 避免重复测试逻辑相同的组合(如 ubuntu + python 3.10 已覆盖,可不加 macos + 3.10 除非有特定问题) | 使用 exclude 去掉已知稳定组合 |
| 合理限制并行 | 开源项目免费额度有限,避免几十个 Job 同时跑,导致排队超时或流量超限 | max-parallel: 8 |
| 失败不阻塞 | 设置 fail-fast: false,让其他组合继续测试,定位问题范围 |
一个版本失败不影响其他版本结果 |
| 包含边界版本 | 测试最早支持的版本和最晚的版本,以及 LTS 版本 | Python 3.8(旧) + 3.13(最新) |
| 添加快速失败检查 | 另设一个仅跑最新版本的快速 Job,用于快速反馈合并冲突问题 | 单独 quick-test job |
典型矩阵推荐(根据语言)
| 语言/框架 | 推荐矩阵维度 | 示例 |
|---|---|---|
| Python | Python 3.8~3.13 + Ubuntu/Mac | 4 个版本 × 2 个系统 = 8 个 Job |
| Node.js | Node 16/18/20 + Ubuntu/macOS/Windows | 3 × 3 = 9个 |
| Go | Go 1.21/1.22 + Linux/macOS/Windows | 2 × 3 = 6个 |
| Java | JDK 11/17/21 + 不同 OS | 3 × 2 = 6个 |
| Rust | Stable/Nightly + Linux/Windows/Mac | 2 × 3 = 6个 |
实用技巧
-
使用环境变量传递矩阵信息
在env中引用${{ matrix.os }}或${{ matrix.version }},方便日志输出和分支处理。 -
缓存依赖以加速
GitHub Actions 示例:- uses: actions/cache@v4 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }} -
标记矩阵 Job 名称
使用name字段让日志更清晰:name: Test (${{ matrix.os }}, Python ${{ matrix.python-version }}) -
条件跳过某些 Job
if: matrix.os != 'windows-latest' # 跳过 Windows 上的某些耗时测试
最终检查清单
- [ ] 是否覆盖了你的目标用户的主流操作系统和版本?
- [ ] 是否包含了
fail-fast: false? - [ ] 是否使用了
include/exclude精准控制组合? - [ ] 是否设置了合理的
max-parallel(建议 5~10)? - [ ] 是否有快速检查 Job(仅最新版本 + 最常用 OS)用于快速反馈?
如果你给一下具体语言/框架,我可以帮你生成可直接粘贴的 YAML 配置。