2016-09-16 3 views
5

Мой текущий рабочий процесс - это github PRs и Builds, протестированные на Travis CI, с тестированием токсинов и освещением в сообществе для кодирования.Команда управления Tox на основе переменной env

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 

Однако, Трэвис не проходит мои переменные окружения для выдвижных запросов, что делает мою отчетность покрытия потерпеть неудачу. Travis документация показывает это как решение:

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' 

Однако в Tox это не работает, как токсикодендрон использует модуль подпроцесса питона и не если в команде (естественно) не признает.

Как запустить codeclimate-test-reporter только для сборок, а не для запросов на тягу на основе переменной TRAVIS_PULL_REQUEST? Должен ли я создать свой собственный скрипт и назвать это? Есть ли более разумное решение?

+1

Файлы 'tox.ini' не понимают управления потоком (что вполне понятно, это файлы' .ini'). Создание пользовательского сценария с использованием логики - один из вариантов. Второй вариант - переместить функциональные возможности, связанные с CI, на '.travis.yml'. В конце дня «tox.ini» должен содержать логику, которая может и должна выполняться на каждой локальной локальной машине. ['pylint'] (https://github.com/PyCQA/pylint/blob/master/tox.ini) делает что-то подобное. 'coveralls' venv объявляется в ядре, но запускается путем входа в' .travis.yml'. –

+1

Я думаю, чтобы заставить поток управления через bash работать, вам нужно, чтобы ток передал 'shell = True' в подпроцесс. Это жестко закодировано и зарыто довольно глубоко: https://github.com/tox-dev/tox/blob/85cce631a1bab5fe056ed2cbbcab49ebaf51b259/tox/session.py#L226 – RecursivelyIronic

+0

Может ли что-то вроде '/ bin/bash -c' работать? – iScrE4m

ответ

0

Мое решение будет через setup.py команда, которая заботится обо всем

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}, 
0

Вы можете иметь два tox.ini файлы и называют, что из travis.yml

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

+0

Это звучит как боль, чтобы поддерживать честность, мое текущее решение (https://github.com/iScrE4m/pyCardDeck/blob/master/setup.py#L34) немного лучше, но мне все еще не нравится – iScrE4m

Смежные вопросы