如何在Travis CI多平台构建矩阵后添加部署阶段?
解决Travis CI中Matrix并行构建后触发统一部署的问题
我之前也踩过这个坑!当你用matrix配置多平台并行构建后,直接加stages部署不生效,大概率是因为没有正确把构建任务和部署任务划分到对应的阶段,或者没有让部署任务等待所有构建任务完成。下面是我验证过的可行配置方案:
核心思路
Travis CI的stages是按顺序执行的,我们需要:
- 明确声明两个阶段:
build(用来跑多平台构建)和deploy(所有构建完成后执行部署) - 把
matrix里的两个平台构建任务都归到build阶段 - 添加一个单独的
deploy阶段任务,让它在build阶段所有任务成功后再运行
完整配置示例
language: cpp # 声明阶段顺序:先执行build,再执行deploy stages: - build - deploy matrix: include: # 把macOS构建归到build阶段 - stage: build os: osx osx_image: xcode10.1 script: - "./Travis/build-osx.sh" # 把Linux构建归到build阶段 - stage: build os: linux dist: trusty script: - "./Travis/build-linux.sh" jobs: include: # 添加deploy阶段的任务 - stage: deploy # 部署只需要在一个平台执行即可,这里选Linux os: linux dist: trusty # 限制只在master分支的push事件触发部署,可根据你的需求调整 if: branch = master AND type = push # 跳过默认的script步骤(如果部署不需要额外构建的话) script: skip # 这里填写你的部署配置,比如部署到GitHub Releases、远程服务器等 deploy: provider: releases api_key: $GITHUB_TOKEN # 你需要在Travis后台配置这个环境变量 file: "path/to/your/build产物.zip" skip_cleanup: true # 必须开启,否则Travis会清理构建产物 on: branch: master
关键注意点
- 阶段归属:必须给每个
matrix里的构建任务加上stage: build,否则它们会默认归到test阶段,和你自定义的build阶段冲突,导致部署提前执行。 - 部署触发条件:用
if可以精准控制部署时机,比如只在master分支推送时触发,避免不必要的部署。 - 产物保留:
skip_cleanup: true非常重要,不然Travis在每个job结束后会清理工作目录,部署阶段就找不到构建好的文件了。 - 单平台部署:部署不需要在多个平台重复执行,选一个稳定的平台(比如Linux)即可,节省CI资源。
如果你的部署逻辑比较复杂,不需要用Travis自带的deploy provider,也可以把部署命令写到script里,比如:
- stage: deploy os: linux dist: trusty if: branch = master AND type = push script: - "./Travis/deploy.sh" skip_cleanup: true
这样配置后,Travis会先并行跑完macOS和Linux的构建任务,只有当两个任务都成功时,才会进入deploy阶段执行部署操作。
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

