Redmine
Plugin
Docker
Rails5

[docker/redmine4.0.1]プラグイン"easy gantt"を入れようとすると怒られる


背景

はじめてのDockerではじめてのRedmine(4.0.0)をインストール。

ここまでは無事だった。社内のひとからもアクセスしてもらって一安心。ちゃんと動く。

しかし、新たなハードルとして、デフォルトであの使いづらそうなUIをどうにかして少しでも美しく整えたい。そうだ、Redmineのプラグインだ!!

しかし、人気プラグイン"easy gantt"がすんなり入れられなかったときの話。


環境

Before

- docker

- Redmine 4.0.1 (latest)
- Rails 5.2.2
- easy gantt


道のり

プラグインをplugins/の中に入れてbundle installしたあとに下記を実行し、エラーが発生した。

$ bundle exec rake redmine:plugins:migrate RAILS_ENV=production

rake aborted!
NoMethodError: undefined method `to_prepare' for ActionDispatch::Callbacks:Class
Did you mean? to_param

さっそくググってみると


to_prepareコールバックは、ActiveSupport::Reloaderに移ったみたいですね。たぶんほとんどのプラグインで修正が必要かと。

(該当のコードの修正でいうと ActiveSupport::Callbacks.to_prepare に書き換える、ではダメかもしれません。本体のコード読む限りでは4系でdelegateしてたのがしなくなっているように見えた。ActiveSupport::Reloader.to_prepareかな?ちょっとやってみないとわからないですが。)

あと、4系以前と5系の両対応する必要がありますね。


引用) https://github.com/agileware-jp/redmine_work_days/issues/16

とある。要するにRedmine4.0.0で使われているRails5.2.2では"easy gantt"で使われている関数のバージョンが合わずにエラーが起きてしまうということだろう。では、Rails4.2.11はどうだろうかと思い、Gemfileを書き換えてRailsをダウングレードしたが今度は他の部分で『勝手にダウングレードしないでね』と言わんばかりにエラーが発生。そうですよね・・

本当はGemfileを読み解いたり、Rubyで修正するのが正統派なんだろうけれども、時間もないし、知識も足りない。

ってことで、結局Redmineのバージョンを下げることで解決した


解決法

$ docker rm {{コンテナID}}

$ docker rmi {{イメージ ID}}

混同しないように前もって既存のコンテナ・イメージを消しちゃう。

https://hub.docker.com/_/redmine?tab=tags にアクセスして、良さそうなバージョン(正しくは"タグ")を選ぶ。今回は3.4.8を選びました。

$ docker pull redmine:3.4.8

docker run -p 3000:3000 --name redmine redmine:3.4.8

あとはホスト上にある"easy gantt"のプラグインディレクトリをDocker側に転送。

https://qiita.com/gologo13/items/7e4e404af80377b48fd5

上記を参考に転送しました。

$ docker exec -i -t {{コンテナ名}} bash

$ bundle install
$ bundle exec rake redmine:plugins:migrate RAILS_ENV=production

して、Exitし、docker restartでDockerを再起動したら"easy gantt"が入っていることを確認できると思います。


まとめ

Redmine4系だと"easy gantt"がうまく入らないので、"easy gantt"使いたい方はRedmine3系以下にダウングレードして使おう。

もちろん、ひとつひとつ紐解いて4系を使ってもいいのかもしれない。そんなの尊い。