2012-07-14

Redmineのプラグインのポーティングメモ (to Redmine2.0.x)

今回の内容: Redmineのプラグインのポーティング情報、対応したプラグインは少しずつ増えてきているので、今回はテスト、Jenkins利用時にちょっと困った部分と自分なりの対応を書いてみます。ちょっと長いので、まとめを先に書くと、下記のとおりです。
  • 1. ポーティングのための参考URLはここが良いよ!
  • 2. RAILS_ENV=testのエラーの場合は、Redmine本体のGemfileを修正してみよう
  • 3. SimpleCovのレポートがCI上でできないときは、SimpleCov.start だけにしてみよう
ということで、もしポーティングでお悩みの方、これだけで解決できれば幸いです。
以下はこのポイント発見までの顛末です。
* * *

1. はじめに: ひとまずポーティング

必要に迫られて、少しずつ書くようになった、Redmineのプラグイン。これも、Redmine本体のバージョンが上がると、見直しをしないといけなくなります。
なぜなら、

Redmineのバージョンアップによる機能向上 >>>>>> 越えられない壁 >>>> プラグインによる機能追加

なので…。
自分の職場では、諸々の事情でまだRedmine1.3なので、そんなに困ってはいないのですが、いったん公開してしまったプラグインに関しては、ポーティングしないといけなくなります。特に、春先はRedmine1.4 –> Redmine2.0.xと、rubyのベースもRailsのバージョンも上がってさあ大変!

さすがにRedmine2.0のリリース近辺に対応することはできませんでした。
少し落ち着いてから、いろんなBlog上の情報,Redmine本家の情報,先行して対応しているプラグインのソースを頼りに対応開始。とくに下記のサイトは大変お世話になりました。ありがとうございます!
まずは小さいプラグイン (SiteFeedback / とくに公開してない) でポーティングの練習をし、その後 Banner, Issue Templateの順ですすめてみました。

2. RAILS_ENV=test にしてテストしたのだけれど…

ひとまずポーティングが完了したのですが、プラグインの幾つかはr-labsのJenkinsにお世話になっています。(RORもテストコードも良くわかっていないのですが、見よう見まねでテストコードを書き、Jenkinsでテストを通させていただいてます)
このジョブ、当然のことながら、いままでのステップを使ってソースだけ変わっても失敗…。せっかく勉強を兼ねてテストする習慣がついたのに、ここで挫折するのは勿体ない(?)
ということで、コマンドラインでのUnit Testから再度進めてみました。
そこで問題になったのが、ここ。

rake db:migrate RAILS_ENV=test が通らない!!

RAILS_ENV=production, RAILS_ENV=developmentは通るのですが、test の指定をすると、ことごとくrake taskが失敗してしまいます!
/usr/local/lib/ruby/1.9.1/test/unit.rb:167:in `block in non_options': file not found: db:migrate (ArgumentError)….
途中まではうまくいってたのに、上記のように、『そんなrake taskは無いよ(?)』といったメッセージが出てあえなく終了…。(おんなじrake taskはtest以外なら通ります)
こんな状態でどうやってテストしてるんだろう??r-labsのCode Reviewのジョブは通ってるのに??、と悩むこと一週間…。
やっと、Redmine本家で解決につながる情報を見つけました。
Toshi MARUYAMAさんのソースの通り、Gemfileを修正したところ、RAILS_ENV=test が通るようになりました…。(なお、RAILS_ENV=testのmigrationがNGなら、development or production用のDBを、そのままtest用に使うという方法もありなんですね)

3. CI(Jenkins)サーバ上で、SimpleCovのカバレッジレポートが出来ない!

RAILS_ENV=test 問題が解決しても、すぐにはテスト完璧!とは行かず、もちろん諸々直しています。書き方もちゃんと勉強してるわけではないし、RSpecとかって何?Fixturesでがんばります、な状態ですが、とにかく「カバレッジだけは高いパーセントを維持したい!」ということで、怪しいながら、ほぼほぼコードをカバーするようにテストコードを書いてみました。

#プラグインが既存のコントローラーに対するパッチだったりすると、全部カバーするには、テストコードも工夫しないといけないので、Redmine本体のtestディレクトリの中身も参考にするようになりました。

カバレッジについては、Rails3, ruby1.9, JenkinsなどのCIツールを使う場合は、SimpleCovを使うといいよ!という記事がたくさんあります。おかげ様で、その方法に従うと、自分のNotePC内で、コマンドラインでの実行では、綺麗なレポートが出てくれました。(Windows7, Ruby1.9です)
また、同じNotePC内で、Jenkinsを使ってテストを通した場合でも、綺麗なレポートが出てくれました。

ですが、r-labsのJenkinsを使ってみると、テストは通るものの、coverage/rcov 以下には、index.html しか生成されません!(で、テストは100%…)

なぜだろうと思い、ひとまず手近なCentOSで同じように組んでみたのですが、やっぱり、coverage/rcov 以下には、index.html のファイル1つしか出来ず、網羅しているコードについては何もなし。『こんな100%なんて嬉しくないよ~!!』という状態です。

なにかSimpleCovの問題に違いない....と思うこと一週間、ようやく同様の事例を発見!
コメントには『うちもだよー!』という書き込みが多数ありました。
対応としては、SimpleCov.start 'rails' じゃなくて、SimpleCov.start だけでオッケーというものが多く見受けられたので、その通りにすると、あっさり解決!
おかげさまで、サーバ上のJenkinsでもカバレッジレポートの表示が再度できるようになりました。

なお、Jenkinsに合わせた、SimpleCovの出力フォーマットだと、HTMLとしては地味な感じです。一方で、SimpleCovの標準のレポートは、それはそれは洒落ている感じです。

simplecov
わたしはデフォルトのほうがすきなので、JENKINSを使ってる(環境変数での切り替えですが)場合だけ、フォーマットを変えるという設定にしました。
if ENV['JENKINS'] == "true"
  SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
end
ということで、今回はここまで。
最後まで読んで下さった方、ありがとうございます!なにかの参考、ヒントになれば幸いです。

0 件のコメント:

コメントを投稿