python - with - travis ci tutorial
Cómo ejecutar Tox con Travis-CI (4)
¿Cómo pruebas diferentes versiones de Python con Tox desde Travis-CI ?
Tengo un 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
que ejecuta mis pruebas de unidad de Python en varias versiones de Python y funciona perfectamente.
Quiero configurar una compilación en Travis-CI para ejecutar esto automáticamente cuando .travis.yml
cambios a Github, así que tengo un .travis.yml
:
language: python
python:
- "2.7"
- "3.3"
- "3.4"
- "3.5"
install:
- pip install tox
script:
- tox
Esto parece funcionar técnicamente, pero ejecuta de manera redundante todas mis pruebas en cada versión de Python ... desde cada versión de Python. Así que una construcción que toma 5 minutos ahora toma 45 minutos.
Intenté eliminar la lista de python
de mi archivo yaml, por lo que Travis solo ejecutará una única instancia de Python, pero eso hace que mis pruebas de Python3.5 fallen porque no se puede encontrar el intérprete 3.5. Aparentemente, esa es una limitación conocida, ya que Travis-CI no instalará Python3.5 a menos que especifique la versión exacta en su configuración ... pero no lo hace para las otras versiones.
¿Hay alguna manera de solucionar esto?
Para obtener más control y flexibilidad, puede definir manualmente su matriz de modo que la versión de Python y el entorno tox coincidan:
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
En caso de que no sea obvio, cada entrada en la matriz comienza en una línea que comienza con un guión ( -
). Todos los elementos que siguen a esa línea con sangría son líneas adicionales para ese único elemento.
Por ejemplo, todas las entradas, excepto la última, son dos líneas. la última entrada es solo una línea y no contiene una configuración de python
; por lo tanto, simplemente utiliza la versión predeterminada de Python (Python 2.7 según la documentación de Travis). Por supuesto, una versión específica de Python no es tan importante para esa prueba. Si desea ejecutar una prueba de este tipo contra Python 2 y 3 (una vez cada una), se recomienda usar las versiones que Travis instala de forma predeterminada (2.7 y 3.4) para que las pruebas se completen más rápidamente, ya que no es necesario. Instale una versión Python no estándar primero. Por ejemplo:
- python: 2.7
env: TOXENV=flake8
- python: 3.4
env: TOXENV=flake8
Lo mismo funciona con pypy
(segunda a última entrada en la matriz) y pypy3
(no se muestra) además de las versiones 2.5-3.6 de Python.
Si bien las otras respuestas proporcionan accesos directos que le dan este resultado al final, a veces es útil definir la matriz manualmente. Luego puede definir cosas específicas para entornos individuales dentro de la matriz. Por ejemplo, puede definir dependencias para un solo entorno y evitar el tiempo perdido al instalar esa dependencia en cada entorno.
- python: 3.5
env: TOXENV=py35
- env: TOXENV=checkspelling
before_install: install_spellchecker.sh
- env: TOXENV=flake8
En la matriz anterior, el script install_spellchecker.sh
solo se ejecuta para el entorno relevante, pero no para los demás. Se before_install
configuración before_install
(en lugar de install
), ya que el uso de la configuración de install
habría invalidado la configuración de install
global. Sin embargo, si eso es lo que quiere (para anular / reemplazar una configuración global), simplemente vuelva a definirla en la entrada de la matriz. Sin duda, también se podrían definir otras configuraciones para entornos individuales dentro de la matriz.
La definición manual de la matriz puede proporcionar mucha flexibilidad. Sin embargo, si no necesita la flexibilidad adicional, uno de los varios accesos directos en las otras respuestas mantendrá su archivo de configuración más simple y más fácil de leer y editar más adelante.
Por esto consideraría el uso de tox-travis. Este es un complemento que permite el uso de las múltiples versiones de Python de Travis CI y la capacidad de configuración completa de Tox. Para hacer esto, configurará el archivo .travis.yml para probar con Python:
sudo: false
language: python
python:
- "2.7"
- "3.4"
install: pip install tox-travis
script: tox
Esto ejecutará los testenvs apropiados, que son cualquier env declarado con py27 o py34 como factores del nombre por defecto. Py27 o py34 se utilizarán como alternativa si ningún entorno coincide con el factor dado.
Travis proporciona la versión de python para cada prueba como TRAVIS_PYTHON_VERSION
, pero en la forma ''3.4''
, mientras que tox
espera ''py34''
.
Si no quiere confiar en una lib externa (tox-travis) para hacer la traducción, puede hacerlo manualmente:
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 .)
Busca este patrón en un motor de búsqueda y encontrarás muchos proyectos usándolo.
Esto funciona también para pypy:
tox -e $(echo py$TRAVIS_PYTHON_VERSION | tr -d . | sed -e ''s/pypypy/pypy/'')
Fuente: .travis.yml de flask- .travis.yml .
TOXENV
variable de entorno TOXENV
se puede usar para seleccionar un subconjunto de pruebas para cada versión de Python a través de la matriz especificada:
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
En tox config especifique omitir las versiones faltantes de Python:
[tox]
skip_missing_interpreters=true