22

tl;dr:

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

詳細:

テストしようとしているパッケージは python パッケージです。テストをセットアップするために、次の「インフラストラクチャ」を使用しています/使用する予定です。

  • テスト自体はpy.testさまざまです。
  • CI スクリプティングは、いわばtox. これにより、テストをローカルで実行できます。これは私にとってかなり重要です。テストの実行が必要になるたびに github にプッシュする必要はありません。私も自分のパッケージでnumpyandmatplotlibを使用しているので、非常に多くのテスト サイクルを実行するのtravis-ciは非常に無駄に思えます。そのため、捨てて単独でtox使用.travis.ymlするという選択肢はありません。
  • CIサーバーはtravis-ci

関連するテスト スクリプトは次のようになります。

.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

このファイルにより、ローカルでテストを実行できます。ただし、最後の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します。この情報を提供するための travis が存在しない場合、コマンドは失敗するはずです。結果を coveralls.io にプッシュしたくありません。coverallsでテストが行​​われている場合にのみ実行したいと思いtravis-ciます。このコマンドを条件付きで実行したり、同じ効果を達成するビルド構成をセットアップしたりする方法はありますか?

カバーオール部分を に移動しようとしました.travis.ymlが、それを実行すると、送信する適切なファイルをcoveralls見つけることができないようです。この方向でさまざまな試みを行いましたが、上記の組み合わせ.coverageを除いて、どれも成功した送信にはなりませんでした。coveralls.io以下は、toxローカルで実行.coverageすると、ソースツリーのルートフォルダーにあると予想される場所にファイルが作成されることを考えると、うまくいくと思っていたものです。

coveralls.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
4

4 に答える 4

8

私はトラビス、トックス、カバーオールと同様のセットアップをしています. 私の考えは、環境変数が設定されているcoveralls場合にのみ実行することでした。TRAVISただし、tox は引用符とアンパサンドを使用したコマンドの解析に問題があるため、これを行うのはそれほど簡単ではないようです。さらに、これは混乱したトラヴィス私はたくさん

最終的に、単純な python スクリプトを作成しましたrun_coveralls.py

#!/bin/env/python

import os

from subprocess import call


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

で、コマンドをtox.iniに置き換えます。coverallspython {toxinidir}/run_coveralls.py

于 2015-10-08T09:50:46.827 に答える