在多个操作系统上测试您的项目

如果您的代码在多个操作系统上使用,则可能应该在多个操作系统上进行测试。Travis CI 可以在 Linux 和 macOS 上进行测试。

要在多个操作系统上启用测试,请将 os 键添加到您的 .travis.yml 中。

os:
  - linux
  - osx

根据特定构建运行的操作系统,$TRAVIS_OS_NAME 变量的值将设置为 linuxosx,因此您可以使用它来设置构建脚本的条件。

如果您已经使用 构建矩阵 来测试多个版本,则 os 键也会使矩阵相乘。

操作系统差异 #

当您在多个操作系统上测试代码时,请注意可能影响测试的差异。

  • 并非所有工具都可以在 macOS 上使用。

    我们仍在努力在 macOS 环境 上构建工具链。缺少的软件可以通过 Homebrew 获得。

  • 语言可用性。

    并非所有语言都可以在所有操作系统上使用,并且不同版本可能安装在不同的系统上。在开始多操作系统测试之旅之前,请务必查看此 GitHub 问题 详细说明哪些语言可用

  • 文件系统行为不同。

    我们 macOS 工作人员上的 HFS+ 文件系统不区分大小写(这是 macOS 的默认设置),并且目录中的文件按排序顺序返回。在 Linux 上,文件系统区分大小写,并按它们在目录内部出现的顺序返回目录条目。

    您的测试可能会隐式地依赖于这些行为,并且可能会因为它们而失败。

  • 毕竟它们是不同的操作系统。

    命令可能在 Mac 和 Linux 上具有相同的名称,但它们可能具有不同的标志,或者相同的标志可能意味着不同的含义。在某些情况下,执行相同操作的命令可能具有不同的名称。这些需要逐一调查。

允许在一个操作系统上运行的作业失败 #

要忽略一个操作系统上作业的结果,请将以下内容添加到您的 .travis.yml 中。

jobs:
  allow_failures:
    - os: osx

多操作系统构建矩阵示例 #

这是一个使用 if/then 指令自定义 构建生命周期 以在 Linux 和 macOS 中都使用 Graphviz.travis.yml 文件示例。

language: c

os:
  - linux
  - osx

compiler:
  - gcc
  - clang

addons:
  apt:
    packages:
      - graphviz

before_install:
  - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew update          ; fi
  - if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew install graphviz; fi

script:
  - cd src
  - make all

有许多选项可用,并且使用 matrix.include 键对于包含任何特定条目至关重要。例如,此矩阵会将构建路由到 Trusty 构建环境使用 Xcode 7.2 的 macOS 镜像

jobs:
  include:
    -
      os: linux
      dist: trusty
    -
      os: osx
      osx_image: xcode7.2

Python 示例(不受支持的语言) #

例如,此 .travis.yml 使用 matrix.include 键在构建矩阵中包含四个特定条目。它还利用 language: generic 在 macOS 上测试 Python。自定义需求安装在下面的 ./.travis/install.sh 中。

language: python

jobs:
  include:
    - os: linux
      python: 3.2
      env: TOXENV=py32
    - os: linux
      python: 3.3
      env: TOXENV=py33
    - os: osx
      language: generic
      env: TOXENV=py32
    - os: osx
      language: generic
      env: TOXENV=py33
install:
    - ./.travis/install.sh
script: make test

此自定义安装脚本(仅伪代码)使用 $TRAVIS_OS_NAME$TOXENV 变量来安装特定于 macOS、Linux 和每个特定 Python 版本的(Python)先决条件。

#!/bin/bash

if [ $TRAVIS_OS_NAME = 'osx' ]; then

    # Install some custom requirements on macOS
    # e.g. brew install pyenv-virtualenv

    case "${TOXENV}" in
        py32)
            # Install some custom Python 3.2 requirements on macOS
            ;;
        py33)
            # Install some custom Python 3.3 requirements on macOS
            ;;
    esac
else
    # Install some custom requirements on Linux
fi

然后,Travis CI 使用 make test 自动测试四个扩展构建。