
Travis CI Matrix 多环境测试终极指南15个版本组合并行构建的秘籍 Matrix 矩阵构建流程图一、核心概念Matrix 的本质是什么二、实战一Node.js 多版本 × 多操作系统的前端测试场景描述三、实战二Python 多版本 × 多数据库的API后端测试场景描述四、实战三使用 jobs.include 和 jobs.exclude 精确控制矩阵场景描述五、实战四多语言项目的混合矩阵Node.js前端 Python后端场景描述六、高级技巧矩阵中的条件判断与动态变量技巧1根据Job环境动态执行不同脚本技巧2使用 TRAVIS_NODE_VERSION 等内置变量技巧3限制并行Job数量 矩阵规模计算器快速参考 常见问题排查 总结The Begin点点关注收藏不迷路⬇ ⬇ 底部 ⬇ ⬇在开源项目维护中你是否遇到过Node.js 14正常16报错或Python 3.9通过3.11失败的兼容性问题手工切换环境逐个测试显然不现实。Travis CI的Matrix功能正是为解决这一痛点而生——它可以**自动组合**多个语言版本、操作系统、环境变量的笛卡尔积一次性覆盖所有场景。 Matrix 矩阵构建流程图先通过一张图理解Travis CI如何将一个.travis.yml展开为多个并行构建任务 解析 .travis.yml识别 Matrix 维度维度1: Node.js版本14 / 16 / 18维度2: 操作系统Ubuntu / macOS维度3: 环境变量DBmysql / DBpostgres⚙️ 笛卡尔积展开生成构建矩阵Job 1: Node14 Ubuntu MySQLJob 2: Node14 Ubuntu PostgreSQLJob 3: Node14 macOS MySQLJob 4: Node14 macOS PostgreSQLJob 5: Node16 Ubuntu MySQLJob 6: Node16 Ubuntu PostgreSQL... 共12个并行任务 并行执行 汇总结果到GitHub核心逻辑Travis CI会计算所有维度的笛卡尔积生成版本数 × 系统数 × 变量数个独立构建任务。一、核心概念Matrix 的本质是什么在.travis.yml中当你写下一个数组配置时实际上已经无意中使用了Matrixlanguage:node_jsnode_js:-14-16-18Travis CI 内部行为上述配置会自动展开为3个并行Job每个Job使用不同的Node.js版本执行相同的构建脚本。这就是隐式Matrix。Matrix的三大组成要素要素说明示例语言版本node_js/python/go等数组node_js: [14, 16, 18]操作系统os字段os: [ubuntu, macos]环境变量env字段env: DBmysql DBpostgres关键规则每个Job只允许使用一个值从每个维度中Travis CI自动完成所有组合。二、实战一Node.js 多版本 × 多操作系统的前端测试场景描述你的前端库需要确保在Node.js 14/16/18三个LTS版本 Ubuntu/macOS两个操作系统上都能正常运行。.travis.yml 完整配置# 全局配置 language:node_jscache:npm# Matrix 维度定义 node_js:-14# 维度13个版本-16-18os:-linux# 维度22个操作系统-osx# macOS# 公共脚本 before_script:-npm install-g codecovscript:-npm test-npm run buildafter_success:-codecov# 构建矩阵微调 jobs:allow_failures:-os:osx# macOS构建偶尔不稳定允许失败不阻断整体fast_finish:true# 只要有失败的确定项立即标记构建结果矩阵展开结果Travis CI 会自动生成3 × 2 6个并行JobJob编号Node.js版本操作系统Job 114Ubuntu (Linux)Job 214macOSJob 316Ubuntu (Linux)Job 416macOSJob 518Ubuntu (Linux)Job 618macOS三、实战二Python 多版本 × 多数据库的API后端测试场景描述Django后端需要测试Python 3.9/3.10/3.11MySQL/PostgreSQL/SQLite共9种组合。.travis.yml 配置language:pythonpython:-3.9-3.10-3.11env:global:-PIP_CACHE_DIR$HOME/.cache/pipjobs:-DJANGO4.1 DBmysql-DJANGO4.1 DBpostgres-DJANGO4.2 DBsqliteservices:-mysql-postgresqlbefore_install:-if[$DB mysql]; then mysql-e CREATE DATABASE testdb;; fi-if[$DB postgres]; then psql-c CREATE DATABASE testdb;-U postgres; fiinstall:-pip install-r requirements.txt-pip install django~$DJANGOscript:-python manage.py test--settingsconfig.settings.$DB矩阵展开结果3 × 3 9个并行Jobenv.global vs env.jobsenv.global所有Job共享的环境变量如缓存路径。env.jobs每个数组项创建一个新的Job参与矩阵乘法。四、实战三使用jobs.include和jobs.exclude精确控制矩阵有时候你不需要完整的笛卡尔积只需添加特定组合或排除无意义组合。场景描述主要测试 Ubuntu Node 16/18但额外需要测试 Node 20仅Ubuntu和 macOS Node 18。.travis.yml 精确控制矩阵language:node_jsos:linux# 默认操作系统node_js:-16-18jobs:include:# 额外添加Ubuntu Node 20 单独测试-node_js:20os:linuxenv:EXPERIMENTALtruename:Node 20 实验性测试# 额外添加macOS Node 18 专项测试-node_js:18os:osxname:macOS 兼容性测试exclude:# 排除Node 16 不需要在 macOS 测试-node_js:16os:osxallow_failures:-env:EXPERIMENTALtrue# 实验性版本允许失败最终矩阵结果JobNode.jsOS来源116Ubuntu原始矩阵218Ubuntu原始矩阵320Ubuntuinclude添加418macOSinclude添加exclude 效果Node 16 × macOS 的组合被移除避免了不必要的macOS构建时间。五、实战四多语言项目的混合矩阵Node.js前端 Python后端场景描述一个全栈项目前端需要测试 Node 16/18后端需要测试 Python 3.10/3.11但不需要交叉组合。.travis.yml 使用jobs.include分离矩阵# 不定义顶层 language改用 jobs.include 分别定义jobs:include:# 前端构建任务 -name:前端 - Node 16language:node_jsnode_js:16before_script:cd frontendscript:-npm install-npm test-name:前端 - Node 18language:node_jsnode_js:18before_script:cd frontendscript:-npm install-npm test# 后端构建任务 -name:后端 - Python 3.10language:pythonpython:3.10before_script:cd backendscript:-pip install-r requirements.txt-pytest-name:后端 - Python 3.11language:pythonpython:3.11before_script:cd backendscript:-pip install-r requirements.txt-pytest# 部署任务仅在前端后端都成功后触发 -name:统一部署language:minimalif:branch mainscript:echo All tests passed,deploying...关键特性使用jobs.include时不会自动生成笛卡尔积每个include项就是一个独立Job。可以给每个Job起一个name在Travis CI面板中清晰区分。最后部署Job可通过if条件控制触发时机。六、高级技巧矩阵中的条件判断与动态变量技巧1根据Job环境动态执行不同脚本script:-|if [ $TRAVIS_OS_NAME linux ]; then npm run test:linux elif [ $TRAVIS_OS_NAME osx ]; then npm run test:mac fi技巧2使用TRAVIS_NODE_VERSION等内置变量Travis CI自动注入的变量让你在脚本中感知当前Job上下文$TRAVIS_NODE_VERSION当前Job的Node.js版本$TRAVIS_OS_NAME当前操作系统linux/osx$TRAVIS_PYTHON_VERSION当前Python版本$TRAVIS_JOB_NUMBER当前Job编号如123.4技巧3限制并行Job数量免费版Travis CI有并发限制通常5个并发。可用travis.yml中的jobs.fast_finish加速反馈jobs:fast_finish:true# 一旦有非allow_failures的Job失败立即标记整个构建失败 矩阵规模计算器快速参考语言维度系统维度环境维度总Job数推荐场景2版本1系统2变量4小型库3版本2系统2变量12中型框架4版本2系统3变量24企业级产品5版本3系统4变量60⚠️需付费并发警告矩阵过大不仅消耗构建时间还可能触及Travis CI的并发限制和月构建时长配额。建议用jobs.exclude剔除无意义组合。 常见问题排查问题原因解决方案矩阵不展开只有一个Job语法错误或未使用数组确保版本号用- 14数组形式预期组合没有生成jobs.include会覆盖默认展开如果需要完整笛卡尔积不要用include某些Job卡住不执行免费并发限制5个等待排队或升级Travis CI计划macOS Job超时macOS构建默认50分钟限制使用travis_wait或拆分为更小的测试环境变量值相同导致Job合并Travis会去重相同的env值确保每个env组合的值有差异 总结通过本文你应当彻底掌握Travis CI Matrix的精髓隐式矩阵node_js: [14, 16, 18]自动展开为3个Job。显式矩阵结合osenv 语言版本实现笛卡尔积式全覆盖。精确控制用jobs.include/exclude裁剪无用组合节省资源。混合语言通过jobs.include将不同语言栈的测试整合在同一个.travis.yml中。合理规划矩阵规模 维度数相乘需平衡覆盖率和构建资源消耗。用好Matrix功能每次git push都能自动在十几种环境下验证代码兼容性问题在PR阶段就能彻底暴露这就是CI自动化的真正价值The End点点关注收藏不迷路⬆ ⬆ 顶部 ⬆ ⬆