作成者別アーカイブ: 北村聡士

PHPでもCoverallsできるよ!

先日公開された、クックパッドがChankoを2.0に増量しました、というエントリーを読んでいたら、Travis CIと連携するサービスが2つ紹介されていた。CoverallsCode Climateだ。それぞれ、カバレッジ計測、静的コード解析のサービスとなっている。CoverallsについてはAPIが公開されているので、PHPで書いたライブラリをGitHubに公開してみた。

php-coveralls

これ。

CoverallsはTravis CIとか、他のCIサービスと連携して動くサービスなので、GitHubにpushしたタイミングで、CIサーバーでテストが実行され、そこで計測したカバレッジが登録される、という流れ。

ビルド毎のコードカバレッジ一覧。

タイムライン。

いいテスターとわるいテスターも表示される。

ビルドの詳細。

ファイルの詳細。

Show your badges on GitHub!

Travis CIにもビルド結果を表示するバッジがあるが、Coverallsにもコードカバレッジを表示するバッジがある。

Retinaバッジ欲しいなぁ。

Code coverage

php-coverallsは、これ自体でカバレッジを計測するわけではなくて、計測されたコードカバレッジをAPIに渡している。

PHPUnitでテストコードを書いている場合、取扱説明書の第14章 コードカバレッジ解析の通り、Xdebugの機能を使用して、C0のコードカバレッジが計測できる。計測結果は、標準出力に出したり、htmlレポートにしたり出来る。さらに、coverage cloverという種類のレポートがxmlファイルに出力できる。php-coverallsでは、このxmlファイルを元に、計測されたカバレッジを取得して、Coveralls APIに渡している。この他、PHPUnitが対応しているログは付録C XML 設定ファイル - ログ出力に説明があるので、興味のある方は参照して欲しい。

他のテスティングフレームワークで、このタイプのxmlファイルが出力できるのであれば、php-coverallsは利用可能なんじゃないかと思う。

Supported CI service

今のところ、対応できるように実装したのは3つで、

  • Travis CI
  • CircleCI
  • Jenkins

このうちTravis CIではテストしたが、他の2つはまだ実環境でテストできてない。Rubyで対応しているSemaphoreはRuby向けCIサービスのようなので、PHPでは対応していない。

Got PR for the first time

そろそろブログでも書くかと、このエントリーを書いてるときに、composer.jsonのbinのパス修正し忘れたでしょ!というPRをもらいました。GitHubに公開してからそんなに時間経ってないのに、すでに試してくれた人がいて、しかもフィードバックをもらえた事がとても嬉しい。

知らぬ間にGitHubのページがブックマークされていたり、珍しくスターゲイザーが増えていたりして、公開して良かったなぁと思った。

Contact on Twitter

最初にドキュメントを見た時には、RubyとPythonとNode.jsしか無かったのに、4/19に見てみたら、C++とScalaが増えていた。もしかして連絡したら載せてもらえるのかな?と思って、COVERALLS FOR OTHER LANGUAGESを読んでみると、

We have been working on adding and updated features for Coveralls and we have a backlog of languages that we’d like to support. If there is a language that you, member of the community and glorious comrade in arms, would like to write a plugin for to get support sooner, please go ahead and let us know on twitter or through the contact email. Together as one we move forward into the glorious dawn of a new complete test coverage day!

と書いてあったので、@CoverallsAppにもツイートしてみた。

英語あってるのかな。大丈夫かな。

Conclusion

今までは、Travis CIでテストを実行しても、Travis上のコンソールにしかカバレッジを残せなくて、Jenkinsのプラグインみたいに、表示してくれるサービスないかなーと思っていたので、Coverallsのようなサービスが使えるのは嬉しい。静的コード解析についても、PHPの場合は、Template for Jenkins Jobs for PHP Projectsにあるように、手元に道具は揃っているわけだ。今後、Code Climateや別サービスでもAPIが公開されればいいなーと思ったりした。

また、Johannes Schmittが自動レビューシステム作るよ!と言っていたのが、scrutinizer-ciで動き始めたようなので、ぺちぱーの人達は使ってみるといいんじゃないかと思う。今のところPHP専用。

ぺちぱーもCoveralls使えるよ!やったね!

OctopressでPubSubHubbubを有効にする方法

寄稿:はてなブログのSEOが優れている7つの理由と、さらにSEO効果を高める5つのTIPS - はてなブログ開発ブログを読んでいたら、”PubSubHubbub“という見慣れない単語が出てきたので、ちょっと調べてみた。

Pub? Sub?

まず、PubSubHubbubというのは、2009年頃からGoogleが提案しているプロトコルらしい。ずいぶん前からあるんだな。全然知らなかった。PuSH、と略すそうだ。現在のドラフトはここで見れる。

PubSubHubbubでRSSもTwitter並にリアルタイムに - @ITに解説が書いてあった。ここでWeb hookと言っているのは、GitHubだとService Hooksみたいなものだろうか。要は、ポーリングするのを止めて、コンテンツ供給者であるPubから更新情報をプッシュしてもらおう、という内容のようだ。

ブログでの対応は簡単だと書いてあったので、Octopressでのやり方をググってみた。

Octopressの対応方法

Octopressでの対応方法は、Pubsubhubbub with Octopress - ~/git/blogのエントリーに具体的な方法が書いてあった。

まずは、Hubとなってくれるサービスに、登録しておく必要がある。上記エントリーにならって、Superfeedrに登録してみた。登録が完了すると、satooshi.superfeedr.comのように、ハブとなるURLが取得できる。

次は、atom.xmlにHubのURLを埋め込むように修正する。7行目に追加したのが変更点。

最後は、blog更新時にSuperfeedrにPingするタスクをRakefileに登録しておく。deployタスクとは別に、pubsubタスクを作った。

Octopressでpreviewしていたらregeneration: 1 files changedが終わらない場合の対処方法

Auto-regeneration never stop and exhausts CPU resource!

昨日、Gemfileを見直していたら、古くなっているgemがいくつかあったので、アップデートしてみたら、regeneration: 1 files changedというメッセージが延々と出続けて、CPUの使用率が100%に張り付いてしまう、という現象に遭遇してしまった。結論からいうと、directory_watcher 1.5.1に加えられた変更が良くなかったらしく、1.4.1に戻したら大丈夫だった。

So, how can I fix it?

Jekyll’s “–auto” doesn’t work? - Stack Overflow

Stack Overflowに、Jekyllを使っている人の質問が上がっていた。解決方法はdirectory_watcherを1.4.1に戻す事、と書いてあった。1.5.1では、全面的にリファクタリングされているようで、diffを見ただけだと、問題となったコードがどこなのか、よく分からなかった。

1
sudo gem uninstall directory_watcher && sudo gem install directory_watcher -v 1.4.1

Gemfileを使っている場合は、明示的にdirectory_watcherのバージョンを指定して、bundle updateすればいいはず。

Gemfile
1
gem "directory_watcher", "~> 1.4.1"

The next Octopress and Jekyll version will come

最初に見つかった解決方法はJekyllを1.0.0 beta3に上げる事(rake watch/generate goes wrong with jekyll –auto/serverJekyll auto regeneration loop never stops)だったが、このバージョンでは、jekyll --autoが無くなっており、Otopress masterが対応していないため、Octopress側も2.1にする必要がある(masterではなく、2.1が開発版なのか)。さらに、_config.ymlで定義していたサイトの設定も別の設定方法に変更されているようだった。Octopress 2.1へのマイグレーションは、まだドキュメントになさそうだったので、さらにググっていたら、上記の通り、directory_watcherのバージョン戻せばいいんじゃね?というオチだった。

Octopress 2.1ではguardというgemを使うようになるらしい。READMEには、

Guard is a command line tool to easily handle events on file system modifications.

とある。さらに、

You can configure Guard to make use of the following system notification libraries

と書いてあるので、ファイルシステムの変更を監視して、Growlとか通知センターに通知を送れるようになるのだろうか。そうであれば、rake previewしてるときに、通知されるようになってくれるとすごくうれしい。