rcmdnk's blog
Last update

Amazon.co.jp: Million Tears: Groove Coverage: デジタルミュージック

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になります。

Travis CIを使ってみた: GitHubのレポジトリにバッジを貼りたかったから

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

しています。coveragecoverallsが要求して一緒にインストールされます。

従ってこの時にはShebangは

/usr/bin/python

です。実際にTravis CIで見てみるとそうなっていました。

なのでPythonの特定のバージョンを指定したい場合には coverage(またはcoveralls)等をインストールするよりも先に Python自体をインストールする必要があります。

ただ、今回は両方のバージョンを一緒にテストしたい、と思っているので やっぱり途中でPythonを入れたい。

ということで途中でcoverageも再インストールすることでうまくいきました。

.travis.yml
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
language: objective-c
install
  - sudo pip install coveralls >/dev/null
script:
  - python --version
  - ...
  - ... coverage tests with python 2.7.5
  - ...
  - rm -rf /usr/local/lib/python2.7/site-packages
  - rm -rf /usr/local/bin/easy_install
  - rm -rf /usr/local/bin/easy_install-2.7
  - rm -rf /usr/local/bin/pip
  - rm -rf /usr/local/bin/pip2
  - rm -rf /usr/local/bin/pip2.7
  - brew install python
  - sudo pip uninstall -y coveralls
  - sudo pip uninstall -y coverage
  - sudo pip install coveralls
  - hash -r
  - python --version
  - ...
  - ... coverage tests with python 2.7.10
  - ...
after_success:
  - coverage combine
  - coveralls

な感じで最初に2.7.5でテストして、 途中でPythonをインストール、さらに coverageも再インストールしています。

coveralls等は特にバージョンが2.7.5でも構わないので 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
+  - sudo pip uninstall -y coveralls
  - sudo pip uninstall -y coverage
-  - sudo pip install coverage
+  - sudo pip install coveralls

なと変更してcoverallsも再インストールする様にしています。 (coverageは最後のcoverallsのインストールで一緒にインストールされます。)

追記ここまで

途中でpipとかを消していますが、消しておかないと Pythonのインストール時にpipをインストールしようとして出来ないと 文句を言われるのでTravis CI上でやる時にはこれらは一旦消してしまう様にしています。

こんな感じで取り敢えず思った通りの動作に出来る様になりました。

Sponsored Links
Sponsored Links

« Analyticsに現れるスパムなURL達に関して 夏に向けてスムージーを飲むためにT-falのミキサー買った »

}