こんにちは、テクマトリックスの村上です。
Redmine6.0へのバージョンアップを検討しており、Redmine5.1で利用できたサードパーティ製プラグインがRedmine6.0でも利用できるかを確認する機会があったので記載します。
※動作検証日:2025年2月14日

きっかけ

Redmine6.0が2024年11月11日にリリースされ、Redmineの新機能が追加されています。新機能では、進捗率を5%単位で入力できるようになる機能や、デフォルトのテーマでサイドバーを表示・非表示できる機能があります。これらを利用するためにバージョンアップを検討しており、サードパーティ製プラグインも引き続き利用できるかを確認する必要がありました。

Redmineの環境情報

検証環境として利用したRedmineの環境情報は以下です。

RedmineのバージョンRedmine6.0.3
Ruby3.3.7
DBの種類とバージョンPostgreSQL 16.3

Redmine6.0に対応されているかをドキュメントで確認

GitHubで公開されているプラグインなどは、READMEやinit.rbファイル等で動作対象のRedmineのバージョンを記載している場合があります。プラグインのREADMEやコミット履歴のコメント等を確認し、Redmine6.0に対応しているかの確認をします。

【View Customize pluginの場合】

READMEのサポートバージョンに4.0.x以上と記載があります。また、Redmine6.0がリリースされた後にコミットもされていたため、対応していそうなことがわかります。

※プラグインによっては、laterと記載されていても対応していない場合がありますので、ご注意ください。

【Redmine Wiki Extensionsの場合】

init.rbに「requires_redmine :version_or_higher => ‘6.0.0’」と記載があるため、Redmine6.0以上にのみ対応していることがわかります。

Redmine::Plugin.register :redmine_wiki_extensions do
  name 'Redmine Wiki Extensions plugin'
  author 'Haruyuki Iida'
  author_url 'http://twitter.com/haru_iida'
  description 'This is a Wiki Extensions plugin for Redmine'
  url 'http://www.r-labs.org/projects/r-labs/wiki/Wiki_Extensions_en'
  version '1.0.1'
  requires_redmine :version_or_higher => '6.0.0'

インストールできるかの確認

インストール方法はプラグインによって異なるため、各プラグインのREADMEを確認し、インストールをします。インストールに問題がなければ、Redmineが起動でき、管理者メニューのプラグイン一覧でインストールしたプラグインが表示されます。


インストールに問題がある場合は、インストール時のコマンド実行時やRedmineの起動に失敗します。
エラー例をご紹介します。

【Redmine Omniauth Samlのインストール時にbundle installコマンドを実行した際のエラー】

Because omniauth >= 1.3.0, < 1.3.1 depends on rack >= 1.0, < 2.0
  and omniauth >= 1.2.1, < 1.3.0 depends on rack ~> 1.0,
  omniauth >= 1.2.1, < 1.3.1 requires rack >= 1.0, < 2.0.
And because omniauth >= 1.3.1, < 1.4.3 depends on rack >= 1.0, < 3
  and omniauth >= 1.4.3, < 2.1.0 depends on rack >= 1.6.2, < 3,
  omniauth >= 1.2.1, < 2.1.0 requires rack >= 1.0, < 3.
And because every version of omniauth-saml-cespi depends on omniauth ~> 1.1
  and Gemfile depends on rack >= 3.1.3,
  every version of omniauth-saml-cespi requires omniauth >= 1.1, < 1.2.1.
So, because Gemfile depends on omniauth >= 1.2.2
  and Gemfile depends on omniauth-saml-cespi ~> 1.3.1,
  version solving has failed.

【Redmine Importerのインストール時にbundle exec rake redmine:plugins:migrateコマンドを実行した際のエラー】

/usr/src/redmine/plugins/redmine_importer/app/controllers/importer_controller.rb:10:in `<class:ImporterController>': undefined local variable or method `unloadable' for class ImporterController (NameError)
  unloadable
  ^^^^^^^^^^
        from /usr/src/redmine/plugins/redmine_importer/app/controllers/importer_controller.rb:9:in `<top (required)>'
        from /usr/local/lib/ruby/3.3.0/bundled_gems.rb:69:in `require'
        from /usr/local/lib/ruby/3.3.0/bundled_gems.rb:69:in `block (2 levels) in replace_require'
        from /usr/local/bundle/gems/zeitwerk-2.7.1/lib/zeitwerk/core_ext/kernel.rb:26:in `require'
        from /usr/local/bundle/gems/zeitwerk-2.7.1/lib/zeitwerk/cref.rb:60:in `const_get'
        from /usr/local/bundle/gems/zeitwerk-2.7.1/lib/zeitwerk/cref.rb:60:in `get'
        from /usr/local/bundle/gems/zeitwerk-2.7.1/lib/zeitwerk/loader/eager_load.rb:173:in `block in actual_eager_load_dir'
        from /usr/local/bundle/gems/zeitwerk-2.7.1/lib/zeitwerk/loader/helpers.rb:47:in `block in ls'
        from /usr/local/bundle/gems/zeitwerk-2.7.1/lib/zeitwerk/loader/helpers.rb:25:in `each'
        from /usr/local/bundle/gems/zeitwerk-2.7.1/lib/zeitwerk/loader/helpers.rb:25:in `ls'
        from /usr/local/bundle/gems/zeitwerk-2.7.1/lib/zeitwerk/loader/eager_load.rb:168:in `actual_eager_load_dir'
        from /usr/local/bundle/gems/zeitwerk-2.7.1/lib/zeitwerk/loader/eager_load.rb:17:in `block (2 levels) in eager_load'
        from /usr/local/bundle/gems/zeitwerk-2.7.1/lib/zeitwerk/loader/eager_load.rb:16:in `each'
        from /usr/local/bundle/gems/zeitwerk-2.7.1/lib/zeitwerk/loader/eager_load.rb:16:in `block in eager_load'
        from /usr/local/bundle/gems/zeitwerk-2.7.1/lib/zeitwerk/loader/eager_load.rb:10:in `synchronize'
        from /usr/local/bundle/gems/zeitwerk-2.7.1/lib/zeitwerk/loader/eager_load.rb:10:in `eager_load'
        from /usr/local/bundle/gems/zeitwerk-2.7.1/lib/zeitwerk/loader.rb:413:in `block in eager_load_all'
        from /usr/local/bundle/gems/zeitwerk-2.7.1/lib/zeitwerk/loader.rb:411:in `each'
        from /usr/local/bundle/gems/zeitwerk-2.7.1/lib/zeitwerk/loader.rb:411:in `eager_load_all'
        from /usr/local/bundle/gems/railties-7.2.2.1/lib/rails/application/finisher.rb:80:in `block in <module:Finisher>'
        from /usr/local/bundle/gems/railties-7.2.2.1/lib/rails/initializable.rb:32:in `instance_exec'
        from /usr/local/bundle/gems/railties-7.2.2.1/lib/rails/initializable.rb:32:in `run'
        from /usr/local/bundle/gems/railties-7.2.2.1/lib/rails/initializable.rb:61:in `block in run_initializers'
        from /usr/local/lib/ruby/3.3.0/tsort.rb:231:in `block in tsort_each'
        from /usr/local/lib/ruby/3.3.0/tsort.rb:353:in `block (2 levels) in each_strongly_connected_component'
        from /usr/local/lib/ruby/3.3.0/tsort.rb:434:in `each_strongly_connected_component_from'
        from /usr/local/lib/ruby/3.3.0/tsort.rb:352:in `block in each_strongly_connected_component'
        from /usr/local/lib/ruby/3.3.0/tsort.rb:350:in `each'
        from /usr/local/lib/ruby/3.3.0/tsort.rb:350:in `call'
        from /usr/local/lib/ruby/3.3.0/tsort.rb:350:in `each_strongly_connected_component'
        from /usr/local/lib/ruby/3.3.0/tsort.rb:229:in `tsort_each'
        from /usr/local/lib/ruby/3.3.0/tsort.rb:208:in `tsort_each'
        from /usr/local/bundle/gems/railties-7.2.2.1/lib/rails/initializable.rb:60:in `run_initializers'
        from /usr/local/bundle/gems/railties-7.2.2.1/lib/rails/application.rb:435:in `initialize!'
        from /usr/src/redmine/config/environment.rb:16:in `<top (required)>'
        from config.ru:3:in `require_relative'
        from config.ru:3:in `block (2 levels) in <top (required)>'
        from /usr/local/bundle/gems/rack-3.1.9/lib/rack/builder.rb:108:in `eval'
        from /usr/local/bundle/gems/rack-3.1.9/lib/rack/builder.rb:108:in `new_from_string'
        from /usr/local/bundle/gems/rack-3.1.9/lib/rack/builder.rb:97:in `load_file'
        from /usr/local/bundle/gems/rack-3.1.9/lib/rack/builder.rb:67:in `parse_file'
        from /usr/local/bundle/gems/rackup-2.2.1/lib/rackup/server.rb:354:in `build_app_and_options_from_config'
        from /usr/local/bundle/gems/rackup-2.2.1/lib/rackup/server.rb:263:in `app'
        from /usr/local/bundle/gems/rackup-2.2.1/lib/rackup/server.rb:424:in `wrapped_app'
        from /usr/local/bundle/gems/rackup-2.2.1/lib/rackup/server.rb:326:in `block in start'
        from /usr/local/bundle/gems/rackup-2.2.1/lib/rackup/server.rb:382:in `handle_profiling'
        from /usr/local/bundle/gems/rackup-2.2.1/lib/rackup/server.rb:325:in `start'
        from /usr/local/bundle/gems/railties-7.2.2.1/lib/rails/commands/server/server_command.rb:38:in `start'
        from /usr/local/bundle/gems/railties-7.2.2.1/lib/rails/commands/server/server_command.rb:145:in `block in perform'
        from <internal:kernel>:90:in `tap'
        from /usr/local/bundle/gems/railties-7.2.2.1/lib/rails/commands/server/server_command.rb:136:in `perform'
        from /usr/local/bundle/gems/thor-1.3.2/lib/thor/command.rb:28:in `run'
        from /usr/local/bundle/gems/thor-1.3.2/lib/thor/invocation.rb:127:in `invoke_command'
        from /usr/local/bundle/gems/railties-7.2.2.1/lib/rails/command/base.rb:178:in `invoke_command'
        from /usr/local/bundle/gems/thor-1.3.2/lib/thor.rb:538:in `dispatch'
        from /usr/local/bundle/gems/railties-7.2.2.1/lib/rails/command/base.rb:73:in `perform'
        from /usr/local/bundle/gems/railties-7.2.2.1/lib/rails/command.rb:71:in `block in invoke'
        from /usr/local/bundle/gems/railties-7.2.2.1/lib/rails/command.rb:149:in `with_argv'
        from /usr/local/bundle/gems/railties-7.2.2.1/lib/rails/command.rb:69:in `invoke'
        from /usr/local/bundle/gems/railties-7.2.2.1/lib/rails/commands.rb:18:in `<top (required)>'
        from /usr/local/lib/ruby/3.3.0/bundled_gems.rb:69:in `require'
        from /usr/local/lib/ruby/3.3.0/bundled_gems.rb:69:in `block (2 levels) in replace_require'
        from bin/rails:4:in `<main>'

プラグインの動作確認

各プラグインのREADMEを参考に、プラグインが問題なく動作するかを確認します。プラグインによってはインストールだけで有効化されず、Redmine画面上で設定や有効化するものもありますので、ご注意ください。

【Redmine Absolute Dates pluginの場合】

インストールのみで有効化されるプラグインで、日付がyyyy/MM/dd形式で表示されているかの確認をしました。

動作したサードパーティ制プラグイン

以下に記載するサードパーティ制プラグインは、Redmine6.0でも利用できました。

プラグイン名バージョン用途
Redmine Auto Done 100% plugin1.0.0チケットが終了ステータスに変更された際、進捗率を自動で100%にする
Redmine Banner plugin0.3.5バナーを表示する
View Customize plugin3.5.2任意の画面にHTML、CSS、Javascriptを埋め込む
Redmine Absolute Dates plugin0.0.4チケットの日付をyyyy/MM/dd形式で表示する
Redmine Theme Changer plugin0.7.0ユーザーごとにテーマを選択できる
Redmine Wiki Extensions1.0.1Wiki画面でマクロを利用できる
Redmine Issue Templates plugin1.1.2Redmineの画面上にHTML、CSS、Javascriptを埋め込む
RedMica UI extension0.4.1検索ボックス、バーンダウンチャート、添付ファイルのプレビューを利用できる
Redmine Issues Panel plugin1.1.2チケットをステータス別に表示し、ドラッグ&ドロップで変更できる機能を利用できる
Redmine message customize plugin1.1.0Redmineの画面上の文言を変更する

動作しなかったサードパーティ制プラグイン

以下に記載するサードパーティ制プラグインは、Redmine6.0では利用できませんでした。

プラグイン名バージョン用途
Issue Importer1.2.2チケットのインポート機能を拡張する
Redmine Issue Trash1.0.2削除したチケットを管理する
Redmine Slack0.2RedmineとSlackを連携する
Redmine Work Time plugin0.4.1工数管理の機能を拡張する
Redmine Omniauth Saml0.0.1SAML認証を利用できる
Redmine Microsoft Teams0.2.2RedmineとTeamsを連携する

まとめ

Redmine6.0で動作するプラグインはありましたが、動作しないプラグインもいくつかありました。検証時点の最新バージョンで確認したため、今後、Redmine6.0に対応したバージョンがリリースされるかもしれません。Redmine6.0の利用を検討している方の参考になれば幸いです。