Redmineプラグインをgem化して使いたい

本記事はRedmine Advent Calendar 2017の12/10の記事です。昨日は@GEROMAXさんのプロジェクト管理ツールを導入させるためのあてつけがましいアプローチでした。

Redmineを利用する側として便利というお話ではなく、管理する側として便利ではないか?というお話です。近頃Redmineのサーバで遊ぶんですが、プラグインのインストール/更新を現状より楽にしたいと思う事があります。

まずRedmineプラグインのインストール方法ですが、plugins以下にプラグインをgit cloneなどで置きます。(以下を参照

プラグインがmigrationを要求する場合はコマンドも実行しないといけないようですがまだ実行した事はありません。

また、以下についてはわかっているのですが、実際にインストール/更新するのは手作業なんですよね。たぶん。

まだわかってない事(解決したい事)

以下の点が悩み所でした。

  1. プラグインのバージョン指定方法のうち、もっともお薦めのやつ
    • 割とgit clone masterしてるREADMEが多い(観測範囲のみ
      • masterは最新の開発コミットが入ってる可能性があってお好きでない
      • 更新のための事前検証環境とか作る時に日によって結果が変わりそう
    • というか実はgit clone(特に--depth=1や-bでバージョン指定)は自分でしたくない
      • とりあえずはリリース済みの最新安定バージョンを指定なしで使いたい
  2. プラグイン脆弱性が万が一あった場合にそれを検知する方法がよくわからない
    • 少なくともbundler-auditは今は使えない(gem化すると使える)

Redmineは何年もありがたく使わせてもらってるんですが、プラグインの更新は bundlerでgemを更新だけするとか、時にはバージョンを固定するとか段々したくなってきたのでそれが実現できないかと思っています。

gem化できるとインストールも更新もし易いですし、バージョンの固定も簡単です。あとruby-advisory-dbに載せれるようになるのでbundler-auditが使えるようになります。(インストール済みのプラグインの一覧を取る必要があると思うのでvulsでもプラグインは現状対応できないんじゃないかと思ってますけどどうなんでしょう。是非試してみたいところ)

個人的にはいい事しかないのですが、Redmineサイドもリソースは有限ですので、もし対応したくても事情があったり、ちょっと厳しかったりするかもしれません。チケットを作ってますので、共感してもらえそうなら、賛成的な反応してもらうとかあると採用してもらう確率が上がったりするかもしれません。ちょうどVote Count Listのお話もありましたし。

と、ここまでが本題です。よかったら+1くださいませ。明日は@yassan168さんです。お楽しみにー。


ここからはおまけです。ちょっとやってみたい人のみ読んでもらう程度でいいかもしれません。自作のプラグインでは強引にgem化してるのですが以降ではその方法などを(ひとさまのgem化方法を真似てもう一手間加えてるだけです)。これでも一旦は僕の希望を満足できますが、使うプラグインが多いと意味ありません。なので標準でgem化されると嬉しいですね。

ファイル構成

重要なのは以下の2つのファイルです。init.rb及び他のファイルは通常のプラグイン同様に作成します。

  • plugin root
    • init.rb
    • lib/.rb
    • ...

README.mdには「Gemfile.localに書くかpluginsディレクトリでgit cloneしたら使えます」と書いておいてください。git cloneはできればmasterじゃないと嬉しいけどバージョン更新のたびに更新するのがしんどければ...まぁ仕方ありませんよね。

仕組み

Gemfile.localにこれから作るgemが書いてあるので、lib/.rbが必ず読まれます(Gemfileにrequire: <パス>を指定していなければ)。それを利用してinit.rbを読み込みます。最低限の作業としてはこれだけです。具体的にはredmine_github_hook gemのようにするといいでしょう。

ただし、これだけだと以下の3つの問題があります。

  1. 他の人がpluginsディレクトリを覗いた時に何もないので混乱する
  2. plugin_assetsを使う場合に自動でコピーされないのでいくつかのアクセスが404になる
  3. redmine:plugins:migrateタスクを呼び出してない

1. の方はpluginsディレクトリの下に道標のファイルを残す程度でいいかと思います。sidebar_hideプラグインにPull Requestを投げてみているのですが、このような形でどこに実体があるかを示しています。gemのインストール先にsymlinkを貼る事も考えましたがGemfileに必ずrequire: falseを指定しないといけなくなるので止めました。

2. の方は強引にRedmine::Plugin#mirror_assetsを呼んでしまっています。このような形なのですが、これはもう少し改善したいところですね。前述のRedmine本体向けのチケットには多少考慮したパッチが付いていますが、TODOとかも書いてあったりします。あんまり頑張っても内部構造知りませんから無意味かもしれませんし。

3. はdb:migrateのタイミングで常に呼び出すようRakefileに細工したらいいと思いますが、タイミングわけないと何か困るのかしら?アンインストールと対称じゃなくなる?

おわりに

一部のプラグインでは解決したかった事はとりあえず解決でき、かつ以下のような状態になりました。

これでRedmineのありがたみを引き続き享受しながら、少々楽になる事ができました。あとはできればRedmine側でなんとかなればと思いますが、それはお茶でも飲みながら待つとします。

では改めて明日は@yassan168さんです。お楽しみにー。