Coverallsを使ってみた: GitHubのレポジトリにバッジを貼りたかったから2 で書いた感じでTravis CI上でPythonのスクリプトをチェックする際、 Coverallsというサービスを使ってスクリプトの中のどれだけの範囲を テスト出来ているか、をチェックしています。
Pythonに関しては coverage というコマンドを使ってチェックしてその結果を送っています。
このコマンドのShebangがちょっと思っても居ないものになってて ちょっと悩んだのでそれについて。
Travis CIのPythonバージョン
Travis CIでは
language: objective-c
と.travis.ymlの中で指定しておくとMacな環境にしてくれますが (objective-cのプロジェクトでなくてもMacな環境にしたい場合は現状 objective-cを指定するしか無い)、 この環境だとPythonのバージョンは2.7.5になります。
homebrew-file
のテストをする際、2.7.6より古いか2.7.7より新しいかで
判断する所があるので、
最初そのままの環境ではじめて、
途中でbrew install python
で2.7系最新の(今だと2.7.10の)Python
をインストールするようにしています。
ですがこれをした後にも古いPythonを使った様な表示になって思った結果になりません。
python --version
としてみると2.7.5のままになってたりしましたが、これは
hash -r
とすることでhashされてた/usr/bin/pythonをクリアして /usr/local/bin/pythonを使える様に出来ます。
ただ、hash -r
してからもやはりスクリプトの中では2.7.5として認識されていました。
実際スクリプトの中では
#!/usr/bin/env python
としていて、この場合、直接コマンドラインから
/usr/bin/env python --version
とすると、hash -r
しようがしまいが、新しいPythonをインストールした場合
新しい方のバージョンが出ます。
coverageのShebang
どうもおかしいな、と思っていましたが、
brew-file
コマンドは実際には
coverage run --parallel-mode $exe brew init -y
の様にcoverage
に渡す形で使っていました。
なので実はbrew-file
自体のShebangは関係なくて、
coverage
コマンドが使うPythonのバージョンで全てが決まってたということです。
で、手元でインストールしたcoverage
を見てみると
$ which coverage
/usr/local/bin/coverage
$ head -n1 /usr/local/bin/coverage
#!/usr/local/opt/python/bin/python2.7
と、brew
でインストールしたPythonの場所を示しています。
この場所に常にPythonがあるわけではないので、 どうもインストールする際に今使っているPythonを判断して Shebangを書いている様です。
pipでインストールした他のものも見た限りでは同じようになっていたので pipでインストールする物はインストールした時点のPythonを使う様に設定される様です。
Travis CIでテストする際は、install
ブロックの所でPythonとかをインストールする前に
sudo pip install coveralls
しています。coverage
はcoveralls
が要求して一緒にインストールされます。
従ってこの時にはShebangは
/usr/bin/python
です。実際にTravis CIで見てみるとそうなっていました。
なのでPythonの特定のバージョンを指定したい場合には
coverage
(またはcoveralls
)等をインストールするよりも先に
Python自体をインストールする必要があります。
ただ、今回は両方のバージョンを一緒にテストしたい、と思っているので やっぱり途中でPythonを入れたい。
ということで途中でcoverage
も再インストールすることでうまくいきました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
な感じで最初に2.7.5でテストして、 途中でPythonをインストール、さらに coverageも再インストールしています。
追記: 2015/06/01
coverageだけ再インストールすると、 最後にcoverallsを使おうとするとき、
$ coveralls
Traceback (most recent call last):
File "/usr/local/bin/coveralls", line 5, in <module>
from pkg_resources import load_entry_point
File "/Library/Python/2.7/site-packages/setuptools-4.0.1-py2.7.egg/pkg_resources.py", line 2837, in <module>
File "/Library/Python/2.7/site-packages/setuptools-4.0.1-py2.7.egg/pkg_resources.py", line 449, in _build_master
File "/Library/Python/2.7/site-packages/setuptools-4.0.1-py2.7.egg/pkg_resources.py", line 742, in require
Any distributions found are added to the environment.
File "/Library/Python/2.7/site-packages/setuptools-4.0.1-py2.7.egg/pkg_resources.py", line 639, in resolve
break # give up on this project, keep going
pkg_resources.DistributionNotFound: coverage>=3.6,<3.999
のようにバージョンが合わなくなってこけるので 上に書いてあるように
1 2 3 4 |
|
なと変更してcoverallsも再インストールする様にしています。 (coverageは最後のcoverallsのインストールで一緒にインストールされます。)
追記ここまで
途中でpipとかを消していますが、消しておかないと Pythonのインストール時にpipをインストールしようとして出来ないと 文句を言われるのでTravis CI上でやる時にはこれらは一旦消してしまう様にしています。
こんな感じで取り敢えず思った通りの動作に出来る様になりました。