CircleCIでmasterブランチのみカバレッジを測るようにphpunitを実行する

CircleCIでmasterブランチのみカバレッジを測るようにphpunitを実行する

June 28, 2015,
tags: php circleci phpunit


このエントリーをはてなブックマークに追加

テストを書かないなんて・・・ってぐらいテストが浸透してきているような気がします。
昔は僕もテストを書かなかったんですが、最近はちゃんと書くようになりました。 そして、CIツールもつかって開発するようになりました。

今のプロジェクトでは、CircleCIを使ってるんですが、テストが笑えないぐらい遅くて悩まされていました・・・。

遅い原因はなにか?

遅い原因は二つあります。

  • DBが絡むテストが遅すぎる
  • –code-covergeオプションをつけるとクソ重い

どうやら頑張って調査した結果この二つが原因だったようです。

そもそもカバレッジの指標は必要なのか?

たしかに必要です。しかし、毎回カバレッジを計測しなくてもいいのかなぁーって思うんですよね。
まずはテストがこけてない事を保証するのが重要で、カバレッジはその次に重要なんですよね。
つまり、毎回毎回テストするたびにカバレッジ計らなくてもいいんですよ。

今は一人で開発しているからかもしれませんが、masterブランチにmergeするタイミングでカバレッジ計測できればいいなぁーって思うですよね。

masterブランチでテストが実行された場合にカバレッジを計測するテストを実行する

さて、今日の本題なんですが、CircleCIでmasterブランチのみカバレッジを測るようにしてみます。

そもそも、masterブランチだけでテストしたいとかならcircle.ymlに以下のように記述すればいいんですよね。

general:
  branches:
    only:
      - master

しかし今回の場合はテストはすべてのブランチで走らせて、カバレッジ計測だけをmasterブランチで行いたいんですよね。。。

CircleCIにはCIRCLE_BRANCHという環境変数がある!!

どうしようかと悩んでいたんですがCircleCIの環境変数を見ていたら、CIRCLE_BRANCHなんてのがあるじゃないですか!! つまりこの環境変数をみれば、どのブランチを使用してるかわかるんですよね。

ということで、テストを実行するシェルスクリプトを書いてみました。

$ vim ./unittest.sh

#!/bin/sh
if [ $1 = "master" ]; then
  echo "start:master"
  bin/phpunit --configuration app --coverage-clover build/logs/clover.xml src/
  php bin/coveralls -v
else
  echo "start:non-master"
  bin/phpunit --configuration app src/
fi

こんな感じで切り分けるシェルスクリプト書きました。
僕の場合はcorverallsでカバレッジ見てるのでbin/coveralls -vとかも必要なんですが、まあ使ってない人には必要ないですね。。。
あとはcircle.ymlにこいつを実行するように書いてあげます。

test:
  override:
    - ./circle_unittest.sh $CIRCLE_BRANCH

これでCI環境がだいぶ快適になりました。
カバレッジ測るとテストに17分ぐらいかかるんですが、外したら3,4分で終わります。

最後に

もっといい方法あるよ!って人教えてください・・・
おしまい。

comments powered by Disqus