You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Travis CI多平台构建矩阵后添加部署阶段?

解决Travis CI中Matrix并行构建后触发统一部署的问题

我之前也踩过这个坑!当你用matrix配置多平台并行构建后,直接加stages部署不生效,大概率是因为没有正确把构建任务和部署任务划分到对应的阶段,或者没有让部署任务等待所有构建任务完成。下面是我验证过的可行配置方案:

核心思路

Travis CI的stages是按顺序执行的,我们需要:

  1. 明确声明两个阶段:build(用来跑多平台构建)和deploy(所有构建完成后执行部署)
  2. 把matrix里的两个平台构建任务都归到build阶段
  3. 添加一个单独的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:32:39