TravisCI が Python 3.4 をサポートしたので tox を叩く .travis.yml を更新する

更新

2014-05-05T17:15:00Z

GehirnInc/py3oauth2#1 を頂いて気づいたのですが、 TravisCI がサポートしているすべてのバージョンの Python に PATH が通っているようです。 ぼくがこの記事を執筆した時点では通っていなかったのですが、アップデートがあったようです。 そのためこの記事の寿命は終わりました。 よりシンプルに以下のようにするだけで、執筆時点の .travis.yml と同じようにビルドすることができます。

Python のバージョンを指定していないため、 TravisCI (Ubuntu 12.04) がデフォルトとしている Python 2.7 が使われますが、 tox は Python 2.7 でも動作し、 python3.xPATH が通っているため、これで問題なくビルドできます。

language: python
env:
    matrix:
        - TOXENV="py33"
        - TOXENV="py34"
        - TOXENV="coverage"
install:
    - pip install tox
    - if test "$TOXENV" = "coverage"; then pip install coveralls; fi
script:
    - tox
after_success:
    - if test "$TOXENV" = "coverage"; then coveralls; fi

はじめに

おはようございます、 yosida95 です。

さて、最近の私は Gehirn で人権活動と称して、自分の人権を確保するために進捗を作る毎日を送っています。 以下に私の人権活動の履歴を示します。

これらのプロジェクトの共通点は、 Python 3k 向けのライブラリで GitHub にリポジトリを置き、 TravisCI でテストを行っていることです。

これまで TravisCI は、 Python 3k では Python 3.2 と Python 3.3 しかサポートしておらず、 Python 3.4 でテストするために sudo apt-get install python3.4 python3.4-dev を実行していました。 しかし、昨日 (4 月 30 日 ) の 11 時 (JST) 、ついに Python 3.4 のサポートが入りしました

そこで、ネイティブの Python 3.4 を使ってテストを行うように .travis.yml を更新してみます。

.travis.yml

language: python
python:
    - 3.3
    - 3.4
env:
    matrix:
        - TOXENV="py33"
        - TOXENV="py34"
        - TOXENV="coverage"
matrix:
    exclude:
        # exclude 3.3
        - python: 3.3
          env: TOXENV="py34"
        - python: 3.3
          env: TOXENV="coverage"

        # exclude 3.4
        - python: 3.4
          env: TOXENV="py33"
install:
    - pip install tox
    - if test "$TOXENV" = "coverage"; then pip install coveralls; fi
script:
    - tox
after_success:
    - if test "$TOXENV" = "coverage"; then coveralls; fi

まず前提ですが、テストは tox を使って蹴っています。 tox はそのままでは tox.inienvlist に並べた env を全て実行するのですが、 TOXENV という環境変数をセットしてやると、特定の env のみを実行できます。

python にバージョンのリストを書いていますが、こうするとそれぞれのバージョンについて TravisCI がテストをとってくれます。 この場合では、 3.33.4 のそれぞれでテストが実行されます。

次に、 env.matrixTOXENV を複数並べていますが、こうすることで TravisCI は pythonenv.matrix の全ての組み合わせについてテストを実行してくれます。 つまり、以下の 6 通りのテストが実行されます。

  • python: 3.3, TOXENV="3.3"
  • python: 3.3, TOXENV="3.4"
  • python: 3.3, TOXENV="coverage"
  • python: 3.4, TOXENV="3.3"
  • python: 3.4, TOXENV="3.4"
  • python: 3.4, TOXENV="coverage"

matrix.exclude

これまでの説明の通り 6 通りのテストが実行されるのですが、例えば python: 3.4 の時は python3.3 が見つからず、 python:3.4, TOXENV="3.3" のテストが落ちるという問題があります。

そもそも TravisCI は Python のバージョンごとに用意した virtualenvactivate してからテストを実行しており、 $VIRTHAL_ENV/bin とシステムデフォルトの Python にしか PATH が通っていません。

この問題を解決するために、テストを実行しなくてよい環境の組み合わせを .travis.ymlmatrix.exclude に羅列していきます。 上記の例では TOXENV によるバージョンの指定と python が一致しない場合に加え、 python 3.4 以外での coverage の取得を exclude しています。