2016-09-16 30 views
5

我目前的工作流程是在Travis CI上測試的github PRs和Builds,用tox測試pytest並報告codeclimate的覆蓋率。基於env變量的Tox運行命令

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 

然而,特拉維斯沒有經過我的環境變量引入請求,這讓我覆蓋率報告會失敗。特拉維斯文檔示出了該解決方案爲:

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這並不作爲TOX是使用子蟒模塊和不承認,如果作爲一個命令(天然地)工作。

如何針對構建運行codeclimate-test-reporter而不是基於TRAVIS_PULL_REQUEST變量的pull請求運行?我是否必須創建自己的腳本並調用它?有更聰明的解決方案嗎?

+1

'tox.ini'文件不理解流量控制(這是可以理解的,它們是'.ini'文件)。使用邏輯創建自定義腳本是一種選擇。第二種選擇是將與CI相關的功能移至'.travis.yml'。在一天結束時,'tox.ini'應該包含可能且應該在每個開發本地機器上運行的邏輯。 ['pylint'](https://github.com/PyCQA/pylint/blob/master/tox.ini)就是這樣做的。 'coveralls' venv在tox中聲明,但是由'.travis.yml'中的條目觸發。 –

+1

我想通過bash來控制流程,您需要tox將'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