2016-05-04 11 views
14

Jak testować różne wersje Pythona z Tox z poziomu Travis-CI?Jak uruchomić Tox z Travis-CI

mam 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 

która biegnie moje unittests Python w kilku wersjach Pythona i działa idealnie.

Chcę konfiguracji kompilacji w Travis-ci do automatycznego uruchamiania tego kiedy wciskam zmiany Github, więc mam .travis.yml:

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

Wydaje się to technicznie do pracy, ale nadmiarowo uruchamia wszystkie moje testy w każdej wersji Pythona ... z każdej wersji Pythona. Budowa trwająca 5 minut zajmuje teraz 45 minut.

Próbowałem usunąć listę python z mojego pliku yaml, więc Travis uruchomi tylko jedną instancję Pythona, ale to spowoduje, że moje testy w Python3.5 zawiodą, ponieważ nie można znaleźć interpretera w wersji 3.5. Najwyraźniej jest to known limitation, ponieważ Travis-CI nie zainstaluje Python3.5, chyba że podasz dokładną wersję w swojej konfiguracji ... ale nie robi to dla innych wersji.

Czy istnieje sposób można obejść to?

Odpowiedz

17

W tym celu rozważałabym zastosowanie toksycznego travisu. Jest to wtyczka pozwalająca na użycie wielu wersji python Travis CI i pełną konfigurowalność Toxa. Aby to zrobić można skonfigurować plik .travis.yml przetestowania Pythona:

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

ten będzie działał odpowiednie testenvs, które są uznane za każdy env z py27 lub py34 jako czynniki nazwą domyślnie. Py27 lub py34 będą używane jako rezerwowe, jeśli żadne środowiska nie pasują do podanego współczynnika.

Further Reading

6

Travis udostępnia wersję Pythona do każdego testu jako TRAVIS_PYTHON_VERSION, ale w formie '3.4', natomiast tox spodziewa 'py34'.

Jeśli nie chcesz polegać na lib zewnętrznego (tox-Travis), aby wykonać tłumaczenie, można to zrobić ręcznie:

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 .) 

Przeszukaj ten wzór w wyszukiwarce i będziesz znajdź wiele projektów, które go używają.

Działa to dla pypy także:

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

Źródło: kolba-mongoengine na .travis.yml.

3

TOXENV zmienną środowiska mogą być stosowane do wyboru podzbioru testów dla każdej wersji Pythona przez określony Matrix

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 

W tox konfiguracji określić pominąć brakujące wersje Pythonie

[tox] 
skip_missing_interpreters=true 
8

uzyskać więcej kontroli i elastyczności możesz ręcznie zdefiniować swoją macierz, tak aby wersja Pythona i toksyczne środowisko pasowały do ​​siebie:

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 

Jeśli nie jest to oczywiste, każdy wpis w macierzy rozpoczyna się na linii zaczynającej się od łącznika (-). Wszystkie elementy następujące po tym wierszu, które są wcięte, są dodatkowymi liniami dla tego pojedynczego elementu.

Na przykład wszystkie wpisy z wyjątkiem ostatniego są dwoma wierszami. ostatni wpis to tylko jedna linia i nie zawiera ustawienia python; dlatego po prostu używa domyślnej wersji Pythona (Python 2.7 zgodnie z dokumentacją Travis). Oczywiście, konkretna wersja Pythona nie jest tak ważna dla tego testu. Jeśli chcesz uruchomić taki test zarówno w Pythonie 2, jak i 3 (raz na raz), zaleca się domyślnie używać wersji Travis installs (2.7 i 3.4), aby testy zakończyły się szybciej, ponieważ nie muszą najpierw zainstaluj niestandardową wersję Pythona. Np

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

samo działa z pypy (sekundy do ostatniej pozycji na matrycy) i pypy3 (nie pokazano) w uzupełnieniu do Python wersji 2.5-3.6.

Podczas gdy różne inne odpowiedzi zapewniają skróty, które dają ten wynik na końcu, czasami pomocne jest zdefiniowanie matrycy ręcznie. Następnie możesz zdefiniować konkretne rzeczy dla poszczególnych środowisk w macierzy. Na przykład można zdefiniować zależności tylko dla jednego środowiska i uniknąć marnowania czasu na instalowanie tej zależności w każdym środowisku.

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

W powyższej macierzy, skrypt install_spellchecker.sh prowadzony jest tylko dla danego środowiska, ale nie innych. Zastosowano ustawienie before_install (zamiast install), ponieważ ustawienie install przesłoniłoby globalne ustawienie install. Jeśli jednak tego właśnie chcesz (zastąpić/zastąpić ustawienie globalne), po prostu zredefiniuj je w wpisie macierzy. Bez wątpienia można również zdefiniować różne inne ustawienia dla poszczególnych środowisk w matrycy.

Ręczne definiowanie matrycy może zapewnić dużą elastyczność. Jeśli jednak nie potrzebujesz dodatkowej elastyczności, jeden z różnych skrótów w innych odpowiedziach sprawi, że Twój plik konfiguracyjny będzie łatwiejszy do odczytania i edycji w późniejszym czasie.

Powiązane problemy