背景
はじめての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系を使ってもいいのかもしれない。そんなの尊い。