[Travis CI] matrixの設定

つい先日からtravis ci を触り始めて、ようやく.travis.ymlのmatrixの設定の意味がわかったので忘れないようにメモ

Travis CI

Travis CIは、GitHubと連携してコードのビルドやテストを行える、CIサービスです。
オープンソースのプロジェクトであれば無料で、プライベートプロジェクトであればで有料で利用することができます。

.travis.yml

リポジトリのルートの.travis.ymlにyml形式でテストを実行する環境やテストのコマンドを記述します。

matrix

まずはmatrixキーワードを使わない場合の複数のテスト環境の定義の仕方からpythonを例に紹介します。

language: python

python:
  - "3.5"
  - "3.6"
  - "3.7"
env:
  - DJANGO_VERSION=2.2
  - DJANGO_VERSION=3.0
install:
  - "python setup.py install"
  - "pip install -U pip"
  - "pip install django~=$DJANGO_VERSION"
script:
  - "python manage.py test"

languageで言語を指定します。
pythonで利用するPythonのバージョンを指定します。
envで環境変数を設定します。同じ名前の環境変数に別の値を指定することで複数の組み合わせを表現できます。
installでテストに必要な環境のセットアップを行います。
scriptにテストを実行するコマンドを設定します。

上記の例では、pythonenvの組み合わせで全部で6つのテスト環境でテストが実行されます。

PythonDjango
3.52.2
3.63.0
3.72.2
3.53.0
3.62.2
3.73.0

include

さきほどは、可能なすべての組み合わせを実行するようになっていましたが、特定の組み合わせだけで十分な場合は、includeキーワードを使って表現できます。

language: python

install:
  - "python setup.py install"
  - "pip install -U pip"
  - "pip install django~=$DJANGO_VERSION"
script:
  - "python manage.py test"

matrix:
  include:
    - python: "3.5"
      env: DJANGO_VERSION=2.2
    - python: "3.6"
      env: DJANGO_VERSION=2.2
    - python: "3.7"
      env: DJANGO_VERSION=2.2
    - python: "3.6"
      env: DJANGO_VERSION=3.0
    - python: "3.7"
      env: DJANGO_VERSION=3.0

Django3はpython3.5をサポートしていないのでテストの対象から外しました。

exclude

includeはmatrixに含める組み合わせを記述しましたが、特定の組み合わせだけはサポートしないと言った状況の場合は、excludeの方が便利かもしれません。

language: python

python:
  - "3.5"
  - "3.6"
  - "3.7"
env:
  - DJANGO_VERSION=2.2
  - DJANGO_VERSION=3.0
install:
  - "python setup.py install"
  - "pip install -U pip"
  - "pip install django~=$DJANGO_VERSION"
script:
  - "python manage.py test"

matrix:
  exclude:
    - python: "3.5"
      env: DJANGO_VERSION=3.0

先ほどよりだいぶスッキリ書けました。

この時ちょっとだけ注意が必要なのが、excludeには組み合わせの対象になるすべての条件が合致したものを指定しなければいけない、という点です。
今回の場合、具体的には、組み合わせの対象になるpythonenvの両方を指定しなければならないということです。

matrix:
  exclude:
    - python: "3.5"

pythonだけ指定しても、すべての組み合わせが実行されてしまいます。

失敗可能な組み合わせをテストする

テストの実行結果が、必ずしも成功してほしいケースでない時もあるかもしれません。
先ほどまでの書き方では、すべての組み合わせのテストに成功しないと、全体として失敗扱いになってしまいますが、nightlyビルドのバージョンを利用してテストする場合などは、失敗しても失敗扱いにしたくない場合もあります。
そんな時は、テストの失敗を許容する設定を加えることもできます。

language: python

python:
  - "3.5"
  - "3.6"
  - "3.7"
  - "nightly"
env:
  - DJANGO_VERSION=2.2
  - DJANGO_VERSION=3.0
install:
  - "python setup.py install"
  - "pip install -U pip"
  - "pip install django~=$DJANGO_VERSION"
script:
  - "python manage.py test"

matrix:
  exclude:
    - python: "3.5"
      env: DJANGO_VERSION=3.0
  allow_failures:
    - python: "nightly"

allow_failurespython: "nightly"を指定することで、"nightly"のpythonでは、テストの失敗を許容するようにできます。