Comando de ejecución de toxinas basado en la variable env

5

Mi flujo de trabajo actual es github PR y compilaciones probadas en Travis CI, con pruebas de toxinas pytest y cobertura de informes para codeclimate.

travis.yml

os:
- linux
sudo: false
language: python
python:
- "3.3"
- "3.4"
- "3.5"
- "pypy3"
- "pypy3.3-5.2-alpha1"
- "nightly"
install: pip install tox-travis
script: tox

tox.ini

[tox]
envlist = py33, py34, py35, pypy3, docs, flake8, nightly, pypy3.3-5.2-alpha1

[tox:travis]
3.5 = py35, docs, flake8

[testenv]
deps = -rrequirements.txt
platform =
    win: windows
    linux: linux
commands =
    py.test --cov=pyCardDeck --durations=10 tests

[testenv:py35]
commands =
    py.test --cov=pyCardDeck --durations=10 tests
    codeclimate-test-reporter --file .coverage
passenv =
    CODECLIMATE_REPO_TOKEN
    TRAVIS_BRANCH
    TRAVIS_JOB_ID
    TRAVIS_PULL_REQUEST
    CI_NAME

Sin embargo, Travis no está pasando mis variables ambientales para las solicitudes de extracción, lo que hace que mi informe de cobertura falle. La documentación de Travis muestra esto como solución:

script:
   - 'if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then bash ./travis/run_on_pull_requests; fi'
   - 'if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then bash ./travis/run_on_non_pull_requests; fi'

Sin embargo, en tox, esto no funciona ya que tox está usando el módulo de subproceso de Python y no reconoce si es un comando (naturalmente).

¿Cómo ejecuto codeclimate-test-reporter solo para compilaciones y no para solicitudes de extracción basadas en la variable TRAVIS_PULL_REQUEST? ¿Tengo que crear mi propio script y llamarlo? ¿Existe una solución más inteligente?

3
  • 1
    tox.iniarchivos no entiende el control de flujo (lo cual es comprensible, son .iniarchivos). Crear un script personalizado con lógica es una opción. La segunda opción es mover la funcionalidad relacionada con CI a .travis.yml. Al final del día, tox.inidebe contener lógica que puede y debe ejecutarse en cada máquina local de desarrollo. pylinthace algo así. coverallsvenv se declara en tox, pero se activa al ingresar en .travis.yml. 18 de septiembre de 2016 a las 20:28
  • 1
    Creo que para que el control fluya a través de bash para que funcione, necesitaría que toxina pase shell=Trueal subproceso. Eso está codificado y enterrado bastante profundo: github.com/tox-dev/tox/blob/… 18 de septiembre de 2016 a las 23:46
  • ¿Podría funcionar algo como /bin/bash -c?
    iScrE4m
    19 de septiembre de 2016 a las 14:08
1
+50

Puede tener dos tox.iniarchivos y llamarlos desdetravis.yml

script: if [ $TRAVIS_PULL_REQUEST ]; then tox -c tox_nocodeclimate.ini; else tox -c tox.ini; fi

1
0

Mi solución pasa por el comando setup.py que se encarga de todo

Tox.ini

[testenv:py35]
commands =
    python setup.py testcov
passenv = ...

setup.py

class PyTestCov(Command):
    description = "run tests and report them to codeclimate"
    user_options = []

    def initialize_options(self):
        pass

    def finalize_options(self):
        pass

    def run(self):
        errno = call(["py.test --cov=pyCardDeck --durations=10 tests"], shell=True)
        if os.getenv("TRAVIS_PULL_REQUEST") == "false":
            call(["python -m codeclimate_test_reporter --file .coverage"], shell=True)
        raise SystemExit(errno)

 ...


  cmdclass={'testcov': PyTestCov},