web-dev-qa-db-ja.com

Travis-CIでToxを実行する方法

Travis-CI 内から Tox を使用したさまざまなPythonバージョンをテストするにはどうすればよいですか?

tox.ini

[tox]
envlist = py{27,33,34,35}
recreate = True

[testenv]
basepython =
    py27: python2.7
    py33: python3.3
    py34: python3.4
    py35: python3.5
deps =
    -r{toxinidir}/pip-requirements.txt
    -r{toxinidir}/pip-requirements-test.txt
commands = py.test

私のPythonユニットテストをいくつかのPythonバージョンで実行し、完全に動作します。

Travis-CIでビルドをセットアップして、Githubに変更をプッシュしたときにこれを自動的に実行したいので、.travis.yml

language: python
python:
-   "2.7"
-   "3.3"
-   "3.4"
-   "3.5"
install:
-   pip install tox
script:
-   tox

これは技術的には機能するように見えますが、Pythonの各バージョンからすべてのテストを冗長に実行します... Pythonの各バージョンから。したがって、5分かかるビルドは45分かかります。

私はyamlファイルからpythonリストを削除してみたので、Travisは単一のPython=インスタンスのみを実行しますが、3.5インタープリターが見つかりません。明らかに、それは 既知の制限 です。構成で正確なバージョンを指定しない限り、Travis-CIはPython3.5をインストールしないためです...しかし、それは他のバージョン。

これを回避する方法はありますか?

25
Cerin

このため、私はtox-travisの使用を検討します。これは、Travis CIの複数のpythonバージョンとToxの完全な構成可能性を使用できるようにするプラグインです。これを行うには、Pythonでテストするように.travis.ymlファイルを構成します。

Sudo: false
language: python
python:
    - "2.7"
    - "3.4"
install: pip install tox-travis
script: tox

これにより、デフォルトで名前の要素としてpy27またはpy34を使用して宣言された環境である適切なtestenvが実行されます。指定された要素に一致する環境がない場合、Py27またはpy34がフォールバックとして使用されます。

さらに読む

29
Gabe DeFelippis

より多くの制御と柔軟性のために、マトリックスを手動で定義して、Pythonバージョンとtox環境が一致するようにすることができます。

language: python
matrix:
  include:
    - python: 2.7
      env: TOXENV=py27
    - python: 3.3
      env: TOXENV=py33
    - python: 3.4
      env: TOXENV=py34
    - python: 3.5
      env: TOXENV=py35
    - python: pypy
      env: TOXENV=pypy
    - env: TOXENV=flake8
install:
  - pip install tox
script:
  - tox

はっきりしない場合、マトリックスの各エントリはハイフン(-)で始まる行から始まります。インデントされているその行に続く項目は、その単一の項目の追加の行です。

たとえば、最後のエントリを除くすべてのエントリは2行です。最後のエントリは1行のみで、python設定は含まれていません。したがって、デフォルトのPythonバージョン(TravisドキュメントによるとPython 2.7)を使用します。もちろん、特定のPythonバージョンはそのためそれほど重要ではありません。 test。Python 2 and 3(once one))の両方に対してこのようなテストを実行したい場合は、Travisがデフォルトでインストールするバージョン(2.7および3.4​​)を使用して、非標準のPythonバージョンを最初にインストールする必要がないため、テストはより迅速に完了します。次に例を示します。

- python: 2.7
  env: TOXENV=flake8
- python: 3.4
  env: TOXENV=flake8

Pythonバージョン2.5-3.6に加えて、pypy(マトリックスの最後から2番目のエントリ)およびpypy3(表示されていません)でも同様に機能します。

他のさまざまな答えは、最終的にこの結果をもたらすショートカットを提供しますが、マトリックスを手動で定義すると役立つ場合があります。次に、マトリックス内の個々の環境に特定のものを定義できます。たとえば、単一の環境にのみ依存関係を定義して、その依存関係をすべての環境にインストールする無駄な時間を回避できます。

- python: 3.5
  env: TOXENV=py35
- env: TOXENV=checkspelling
  before_install: install_spellchecker.sh
- env: TOXENV=flake8

上記のマトリックスでは、install_spellchecker.shスクリプトは関連する環境でのみ実行され、他の環境では実行されません。 install設定を使用すると、グローバルinstall設定が上書きされるため、before_install設定が使用されました(installではなく)。ただし、それが(グローバル設定をオーバーライド/置換するために)必要な場合は、マトリックスエントリで再定義するだけです。間違いなく、マトリックス内の個々の環境に対して他のさまざまな設定を定義することもできます。

マトリックスを手動で定義すると、柔軟性が大幅に向上します。ただし、柔軟性を追加する必要がない場合は、他の回答にあるさまざまなショートカットのいずれかを使用すると、構成ファイルがシンプルになり、後で読みやすく、編集しやすくなります。

20
Waylan

Travisは各テストのpythonバージョンをTRAVIS_PYTHON_VERSIONとしてバージョンを提供しますが、'3.4'の形式で提供しますが、tox'py34'を期待します。

翻訳を行うために外部lib(tox-travis)に依存したくない場合は、手動で変換できます。

language: python
python:
-   "2.7"
-   "3.3"
-   "3.4"
-   "3.5"
install:
-   pip install tox
script:
-   tox -e $(echo py$TRAVIS_PYTHON_VERSION | tr -d .)

このパターンを検索エンジンで検索すると、それを使用する多くのプロジェクトが見つかります。

これはpypyでも機能します:

tox -e $(echo py$TRAVIS_PYTHON_VERSION | tr -d . | sed -e 's/pypypy/pypy/')

ソース:Flask-mongoengineの 。travis.yml

7
Jérôme

TOXENV環境変数を使用して、指定したマトリックスを介してPythonの各バージョンのテストのサブセットを選択できます。

language: python
python:
  - "2.7"
  - "3.4"
  - "3.5"
env:
  matrix:
    - TOXENV=py27-Django-19
    - TOXENV=py27-Django-110
    - TOXENV=py27-Django-111
    - TOXENV=py34-Django-19
    - TOXENV=py34-Django-110
    - TOXENV=py34-Django-111
    - TOXENV=py35-Django-19
    - TOXENV=py35-Django-110
    - TOXENV=py35-Django-111
install:
  - pip install tox
script:
  - tox -e $TOXENV

Tox configで、欠落しているバージョンのPythonをスキップするように指定します。

[tox]
skip_missing_interpreters=true
3
Dmitriy Sintsov