2015-09-24 13 views
13

TL; DR:toxの条件付きコマンド? (TOX、トラヴィス-CI、およびカバーオール)

私は、githubの上でホストされている私のプロジェクトのためのCIを設定toxを使用してtravis-ciています。ビルドの最後に、converallsを実行して、カバレッジレポートをcoveralls.ioにプッシュします。私はこのコマンドを '条件付き'にしたいと思います。テストがtravis上で実行されている場合にのみ実行されます。それらがローカルマシン上で実行されているときではありません。これを実現させる方法はありますか?

詳細:

私がテストしようとしているパッケージは、Pythonパッケージです。私は次の「インフラストラクチャー」を使ってテストを設定しています:

  • テスト自体はpy.testです。
  • CIスクリプティングは、言い換えれば、toxです。これにより、ローカルでテストを実行することができますが、それは私にとって非常に重要です。私は試運転が必要なたびにギブスに行く必要はありません。私もnumpymatplotlibを私のパッケージに入れています。だから、travis-ciのテストサイクルの無限の数を実行するのは、私にとって無駄に思えるかもしれません。そのため、toxを省略し、単に.travis.ymlを単独で使用することは選択できません。

    language: python 
    python: 2.7 
    env: 
        - TOX_ENV=py27 
    install: 
        - pip install tox 
    script: 
        - tox -e $TOX_ENV 
    

    tox.ini

    [tox] 
    envlist = py27 
    
    [testenv] 
    passenv = TRAVIS TRAVIS_JOB_ID TRAVIS_BRANCH 
    deps = 
        pytest 
        coverage 
        pytest-cov 
        coveralls 
    commands = 
        py.test --cov={envsitepackagesdir}/mypackage --cov-report=term --basetemp={envtmpdir} 
        coveralls 
    
    .travis.yml:
  • CIサーバは

関連するテストスクリプトtravis-ciはこのような何かを見ています

このファイルを使用すると、ローカルでテストを実行できます。しかし、最終的coverallsコールに、テストは、原則的に失敗すると:

py27 runtests: commands[1] | coveralls 
You have to provide either repo_token in .coveralls.yml, or launch via Travis 
ERROR: InvocationError: ...coveralls' 

これは予想されるエラーです。 passenvビットは、travisから必要な情報を送信してcoverallsに書き込むことができ、この情報を提供するトラビスがなければ、コマンドは失敗するはずです。私はこれが結果をcoveralls.ioにプッシュすることを望んでいない。テストがtravis-ciで発生している場合にのみcoverallsを実行したいと思います。このコマンドを条件付きで実行する方法はありますか、同じ効果を達成するビルド構成を設定していますか?

私はすでにカバーオール部分を.travis.ymlに移動しようとしましたが、実行時にcoverallsが適切な.coverageファイルを見つけられないと思われます。私はこの方向でさまざまな試みを行いましたが、上記の組み合わせ以外はcoveralls.ioへの提出に成功しませんでした。以下は、私がtoxをローカルに実行したときに、.coverageというファイルを私の元のツリーのルートフォルダに置いてしまうことを考えれば、私はうまくいくと思っていたことでした。

カバーオールには提出しません。io

language: python 
python: 2.7 
env: 
    - TOX_ENV=py27 
install: 
    - pip install tox 
    - pip install python-coveralls 
script: 
    - tox -e $TOX_ENV 
after_success: 
    - coveralls 

答えて

7

私はTravis、toxおよびcoverallsと同様の設定をしています。私の考えは、TRAVIS環境変数が設定されている場合にのみcoverallsを実行することでした。しかし、toxは引用符とアンパサンドでコマンドを解析するのが難しいため、これはあまり簡単ではないようです。さらに、これはconfused Travis me a lotです。 python {toxinidir}/run_coveralls.pyであなたのcoverallsコマンドを置き換える、tox.ini

#!/bin/env/python 

import os 

from subprocess import call 


if __name__ == '__main__': 
    if 'TRAVIS' in os.environ: 
     rc = call('coveralls') 
     raise SystemExit(rc) 

は最終的に私は、簡単なPythonスクリプトrun_coveralls.pyを書きました。

+0

いいね!しかし実際の 'coveralls'パッケージとの名前の衝突を避けるために、スクリプト' run_coveralls.py'の名前を付けるほうが良いでしょう。 – alexanderlukanin13

+0

'run_coveralls.py'がどのようにもっとも便利にインクルード/コールされるべきなのでしょうか?ファイル 'run_coveralls.py'を開くことができませんというエラーメッセージが表示されます:[Errno 2]そのファイルやディレクトリはファイルのように仮想環境にコピーされません。私はそれをパッケージの一部として含めるべきではないと思います。 –

+0

自分で解決策を見つけることができたと思う。 'python {toxinidir}/run_coveralls.py'が動作するようです。 –

7

代替ソリューションはin the documentationが説明したように、その終了コードを無視するようtoxを伝えるためにダッシュ(-)とcoverallsコマンドの前に付けることであろう。このようにしても、coverallsからの失敗は無視され、toxはローカルで実行されたときにテストの実行が成功したものとみなします。上記の設定例を使用して

次のように、それは次のようになります。

[tox] 
envlist = py27 

[testenv] 
passenv = TRAVIS TRAVIS_JOB_ID TRAVIS_BRANCH 
deps = 
    pytest 
    coverage 
    pytest-cov 
    coveralls 
commands = 
    py.test --cov={envsitepackagesdir}/mypackage --cov-report=term --basetemp={envtmpdir} 
    - coveralls 
0

私は追加のコマンドを実行するために、環境変数を使用しています。

language: python 
python: 
    - "3.6" 
install: pip install tox-travis 
script: tox 
env: 
    - POST_COMMAND=codecov -e TOX_ENV 

.travis.yml

tox.ini

commands = 
    coverage run runtests.py 
    {env:POST_COMMAND:python --version} 

今、私の地元のセットアップでは、Pythonのバージョンを印刷します。 Travisから実行すると、codecovが実行されます。