Redmine

Redmine4プラグイン開発ハンズオンに参加した

アジャイルウェアさん主催の Redmine4(Rails5)プラグイン開発ハンズオン無料セミナー に参加してきたので、内容やポイントなどを備忘録程度にまとめます。なお、ハンズオンで実施された内容の資料は参加ページのほうにアップロードされているのでそちらも合わせて。

実施内容

Redmine環境の構築後、今回のために用意されたサンプルプラグインとして maimai77/redmine_iine をコミットログどおりにコピペ写経しつつ解説(コードを見ながら口頭で)を聞いていくという流れでした。

ソースを自分で読み解いていけば、今回のハンズオンに参加されていない方でも、コミットログを追って似たようなことはできるかと思います。Redmine公式のPlugin Tutrial も合わせて読むとよいでしょう。

今回のハンズオンでは、まだ開発中のRemine4をターゲットとしてプラグインを作っていくことになっていました。Redmine4ではRails5.1になるので、その影響でいくつか従来とは異なる実装をする必要があります。上記 redmine_iine の実装は、Redmine3以前のプラグインをRedmine4向けにも対応させたい人にも参考になりそうです。(今回の実装はシンプルにRedmine4向けのみで、3には対応してないはずですが)

あと、Rails力もある程度必要でした。私はあまり持ち合わせてないので、都度調べながらソースを読んでいたりもしました。

ハンズオンのポイント

  • プラグインをつくるとき、Redmine公式のPlugin Tutrialではgeneraterを使うようになっているが、アジャイルウェア社のエンジニアはgeneratorは使わずゼロからリソースを作っていくとのこと(Redmineのプラグインgeneratorがあまりいけてないらしい)
  • Redmineのプラグインで何らかの画面に変更を加えるときは Hooks List の中にあるView Hooksを使って実装していく
    • View Hooksでerbを挿入することになるが、表示したい項目のhtmlをそのまま挿入のではなく、Javascriptで要素を差し込むようなパターンにすることが多い。
      • Redmine自体のビューがとても変わりやすく、JavaScriptで埋め込んだほうが柔軟に対応できるので
      • そもそもRedmineで実装されているHooksではちょうどいい位置に挿入できるようなHooksがないこともよくある
        • チケットのジャーナルの下に差し込むHookはあるけど上に差し込むのがなくて困ったりする
        • Hookをwikiからがんばって探すより、汎用的に使える view_layouts_base_content で差し込んじゃうのが楽
    • 今回のコード) をみて
      • Q: プラグインを作るときRedmineの画面を見て、実装したい画面のコントローラとアクション名を探すときはどうするのがいいですか
        • A: 実際にRedmine操作するとログにでるので、そこから追うのが早い。もしくはroutesを読む
  • このへん で既存のRedmineのIssueにパッチをあてることで(includeでMix-inして) 、Issueにiine_count(イイネ数)を追加する
    • (Ruby 2.3のはなしだけど) ぼっち演算子 &. をつかうとスマートに書けるのでよい
    • ActiveSupport::Reloarder はRails5から。従来と変わるポイント。古いプラグインだと違う書き方になるので使っていれば動かなくなるところ
      • Redmine3と4の両対応するには、主に2通りの方法
        • 愚直にバージョン判定してifで分岐する
        • プラグインのリポジトリ/ブランチ自体を別物にして管理しちゃう
  • Railsのバージョンが上がったことにより、 alias_method_chain は非推奨になった。代わりに Prepend をつかう
  • 今回はCloud9(AWS Cloud9)を利用したが、他にもプラグイン開発する環境はいろいろとやりかたがある
    • Dockerで立てる
    • ansibleで立てる
    • Cloud9のオープンソース版を使う
  • Q: プラグインのテストするときに参考になるものはありますか?
    • A: アジャイルウェア社で開発しているプラグインはだいたいRSpecでテストしている。(アジャイルウェア社のGithubリポジトリみるといいかも) 外部には公開されていないテスト用の資材(秘伝のタレ)もあるが、整理すれば一般にも公開できるかも
  • テストコード上、コントローラ周りとかは軽めな物が多い。重点としては、リクエストしてどういう値が返ってくるかとか、画面表示とかを中心にテストを組んでいる。つくりすぎてもメンテコストかかるので

所感

いろいろ思うところがありましたが割愛します