Redmineのプラグイン導入対応

カバー

はじめに

Redmineは、オープンソースのプロジェクト管理ソフトウェアです。私の部署では、要求に応じて、社内のクラウド環境上にRedmineのサーバーを用意し、社内ユーザー向けに提供するという作業を行っています。また、ユーザーからの要望に応じて様々な運用サポートも行っています。今回は、Redmineに特定のプラグインを導入したいという要望に対応したときのことを紹介します。当時のOSはCentOS Linux 7、使用したRedmineのバージョンは4.1.7で、多数のプラグインに対応しましたが、その中からいくつかのプラグインについて、導入手順と導入中に発生した問題の対処方法について説明します。

Redmineについて

Redmineは、主にプロジェクトの進行をサポートするための課題管理・情報共有などの機能を備えるオープンソースのソフトウェアです。Redmineを実行するサーバーにWebブラウザーで接続・ログインすることで、Redmineを利用できます。

Redmineでは、プロジェクトごとに課題や作業など1つ1つのタスクをチケットという単位で登録して管理していきます。また、その他の情報共有にはWikiやファイル共有の機能が提供されています。

Redmine単体でもプロジェクトの管理ができますが、プラグインを利用することで、さらに機能を拡張することができます。プラグインはさまざまな個人や団体により開発・提供されており、有料/無料のものがあります。GitHubなどに登録されている無料のものであれば、誰でもすぐにダウンロードして試すことができます。

開発・提供されたプラグインは、そのままいつまでも使えるとは限りません。Redmine本体のバージョンが上がり、旧バージョン用に開発されたプラグインが動作しなくなっている可能性があります。更新が続けられているプラグインは新バージョンのRedmine本体に対応すべく修正されるものと思いますが、すでに開発が終了し、更新されなくなっているプラグインについては、そのプラグインが開発終了後にリリースされたRedmineの新バージョンで利用できなくなっているかもしれません。そのため、使いたいプラグインが実際に利用できるかどうか、事前に確認する必要があります。

導入プラグイン

1. Redmine Backlogs (redmine_backlogs)

概要

Redmine Backlogs1は、アジャイル開発におけるスプリント、バックログ、ユーザーストーリーなどをRedmineで管理できるようにするプラグインです。 かんばん画面でユーザーストーリー内のタスクを操作する機能もあります。


導入理由

それまでユーザーはアジャイル開発の管理に「Redmine Agile Plugin (Light版)」を使用していました。しかし、このプラグインは無料のLight版であるため、かんばん画面上で直接チケットを編集できないなどの制限があり、使いにくいと感じていました。そのため、より多くの機能を利用できる「Redmine Backlogs」の導入を希望していました。

「Redmine Backlogs」公式では、Redmine 2.2.xまでの対応しか明記されておらず、Redmine 4では使えないものでした。しかし、ユーザーの要望が特に強かったため、代わりにGitHub上のfork版を採用することにしました。このfork版は「ayapapa版Redmine Backlogsプラグイン」と呼ばれ、Redmine 4対応の修正がされています。


導入方法

「ayapapa版Redmine Backlogs」は、オリジナルの「Redmine Backlogs」と同じ方法では導入できませんでした。色々な問題を解決した結果、最終的に導入できた方法は以下のとおりです。

  1. Redmineの導入ディレクトリーに移動
    # cd /path/to/Redmine
  2. Redmine 4 用のブランチを指定して、プラグインファイルを取得
    # git clone https://github.com/ayapapa/redmine_backlogs.git -b redmine4 plugins/redmine_backlogs
  3. Gemfile内のnokogiriバージョン定義をコメントアウト
    # sed -i.back 's/^\(gem "nokogiri".*\)/#\1/' plugins/redmine_backlogs/Gemfile
    # diff plugins/redmine_backlogs/Gemfile{.back,}
    11c11
    < gem "nokogiri", ">= 1.6.7.2"
    ---
    > #gem "nokogiri", ">= 1.6.7.2"
  4. labels.yaml設定ファイルを配置
    # cp -a plugins/redmine_backlogs/lib/labels/labels.yaml.default plugins/redmine_backlogs/lib/labels/labels.yaml
  5. 導入用コマンドを実施
    # bundle install --without development test
    # bundle exec rake redmine:plugins:migrate NAME=redmine_backlogs RAILS_ENV=production
  6. Redmineを起動しているWebサーバーを再起動
    # systemctl restart httpd.service

導入時発生問題

問題1: nokogiriの必要バージョン定義が重複している

導入用コマンドの実行で以下のエラーが発生しました。

[root@redmine-redmine417-pre redmine]# bundle install --without development test
[DEPRECATED] The `--without` flag is deprecated because it relies on being remembered across bundler invocations, which bundler will no longer do in future versions. Instead please use `bundle config set --local without 'development test'`, and stop using this flag
Don't run Bundler as root. Bundler can ask for sudo if it is needed, and
installing your bundle as root will break this application for all non-root
users on this machine.

[!] There was an error parsing `Gemfile`:
[!] There was an error parsing `Gemfile`: You cannot specify the same gem twice with different version requirements.
You specified: nokogiri (~> 1.11.1) and nokogiri (>= 1.6.7.2). Bundler cannot continue.

 #  from /redmine/redmine/plugins/redmine_backlogs/Gemfile:11
 #  -------------------------------------------
 #  gem "icalendar"
 >  gem "nokogiri", ">= 1.6.7.2"
 #  gem "open-uri-cached"
 #  -------------------------------------------
. Bundler cannot continue.

 #  from /redmine/redmine/Gemfile:103
 #  -------------------------------------------
 #  Dir.glob File.expand_path("../plugins/*/{Gemfile,PluginGemfile}", __FILE__) do |file|
 >    eval_gemfile file
 #  end
 #  -------------------------------------------
[root@redmine-redmine417-pre redmine]#

RedmineはRubyで書かれたプログラムですが、「Redmine Backlogs」が使うRubyライブラリー(gem)のなかで、nokogiriの必要バージョンに関する定義が、「Redmine Backlogs」とは別の場所で定義されているものと重複しており、かつ内容が異なっているというエラーになっていました。

  1. nokogiriのバージョンが1.11.1以上かつ1.12.0未満(~> 1.11.1)であること …(別の定義)
  2. nokogiriのバージョンが1.6.7.2以上(>= 1.6.7.2)であること …(Redmine Backlogsの定義)

バージョンが1.11.1以上かつ1.12.0未満であれば両方の要求を満たせるので、1.6.7.2以上であるというほうの定義を省くことにしました。

gem "nokogiri", ">= 1.6.7.2"

の記述が、Redmine Backlogsプラグイン側のファイルで、 /redmine/redmine/plugins/redmine_backlogs/Gemfile:11 の位置にあるということなので、この行をコメントにして無効化します。

#gem "nokogiri", ">= 1.6.7.2"

この状態で導入手順をやり直して、エラーが解決されました。


問題2: Redmine Backlogs公式とプラグイン導入手順が異なる

導入用コマンドの実行で以下のエラーが発生しました。

[root@redmine-redmine417-pre redmine]# bundle exec rake redmine:backlogs:install
rake aborted!
Don't know how to build task 'redmine:backlogs:install' (See the list of available tasks with `rake --tasks`)
Did you mean?  redmine:plugins
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
(See full trace by running task with --trace)

このコマンドは、オリジナル版Redmine Backlogsの公式サイトにあった導入手順2です。

しかし、Webで検索して調べてみたところ、ayapapa版Redmine Backlogsプラグインを導入されている方は、オリジナル版Redmine Backlogs公式の導入手順ではなく、Redmine公式ページ3にある一般的なプラグイン導入時の手順として紹介されている、以下のコマンドを使っていることがわかりました。

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

そのため、このコマンドに替えて実行したところ、無事にエラー無く実行を完了することができました。

また、調べてわかったことですが、オリジナル版Redmine Backlogs公式のコマンドでは、プラグインの導入に加えて一部データの初期設定も行われているようでしたが、これは、プラグインの設定画面で後から設定できるものであるとわかったため、問題なしと判断しました。


問題3: 他プラグインと動作が競合する

Redmine Backlogsプラグインを導入して、初期設定を実施後、新規プロジェクトを作成して、プロジェクト内で「Backlogs」モジュールを有効化し、プロジェクトの「バックログ」タブに切り替えて「プロダクトバックログ」のメニューから「新しいストーリー」を作成すると、以下の内容のエラーダイアログが表示されました。

PG::SyntaxError: ERROR: "where"またはその近辺で構文エラー LINE 1: update issues set position = where id = 8 ^ : update issues set position = where id = 8

update issues set position = where id = 8 の部分を見ると、SQL文としては position = の値が指定されていないため、明らかに文法エラーです。


この問題を切り分ける過程は、以下のとおりです。

  1. 社内クラウド上に、解析用のRedmineサーバーを作成し、Redmine Backlogsプラグインを導入。

  2. 解析用のRedmineサーバーでは、Redmine Backlogsプラグインの画面から「新しいストーリー」作成時にエラーは発生せず、作成が成功した。

  3. 既存Redmineサーバーと解析用のRedmineサーバーを比較すると、前者はユーザーに提供するプラグインを順次追加で導入し、確認を行っていた環境であるのに対し、後者はRedmine Backlogsプラグインのみを導入している環境であるという違いがあった。そのため、前者は内部でプラグイン同士の競合が発生している可能性が考えられる。

  4. 既存Redmineサーバー上でRedmine Backlogsプラグイン以外をすべて無効化したところ、「新しいストーリー」の作成がエラーなしで実行できるようになった。

  5. 既存Redmineサーバーに導入されていたプラグインを確認し、ユーザーが従来から使用していた、Redmine Backlogsプラグインと同様にアジャイル開発をサポートするプラグインである「Redmine Agile Plugin (Light版)」が入っていたことを確認。同様の機能をもつプラグインであることから、同様のRedmineデータを参照・操作している可能性があり、それにより競合が発生している可能性が高い。

  6. 既存Redmineサーバーで「Redmine Backlogs」と「Redmine Agile Plugin (Light版)」のみを有効化して「新しいストーリー」の作成を行うと再び同じエラーが発生。確かにこの2つで競合していることが判明。

上記結果のとおり、「Redmine Backlogs」と「Redmine Agile Plugin (Light版)」を同時に使用すると不具合が発生することが判明したため、ユーザーが「Redmine Agile Plugin (Light版)」を今後は使用せず、「Redmine Backlogs」のみを使用するという意向を確認の上、「Redmine Agile Plugin (Light版)」を削除しました。


問題4: 必要な設定ファイル(labels.yaml)が存在しない

プロダクトバックログのメニューで「プロダクトバックログカード」を選択すると、ファイル保存用のダイアログが表示される代わりに、

No label stock selected. How did you get here?

の1文だけ書かれたページが表示されました。


Webで検索して調べてみたところ、「Redmine Backlogs」の設定画面で「カード印刷のラベルタイプ」を設定すれば解決する旨の情報が得られたため設定しようとしましたが、この「カード印刷のラベルタイプ」のリストに選択肢が1つも用意されておらず、選択ができませんでした。

そのため、さらにこの情報について調べた結果、プラグインのディレクトリーにlabels.yamlというファイルが用意されていないため、リストを使用できないということがわかりました。

上記の調査結果から、以下の手順を実施しました。

  1. Redmineのディレクトリーに元からあるlabels.yaml.defaultというファイルをlabels.yamlとしてコピー

    # cp -a plugins/redmine_backlogs/lib/labels/labels.yaml.default plugins/redmine_backlogs/lib/labels/labels.yaml
  2. Redmineを起動しているWebサーバー(Apache)を再起動

    # systemctl restart httpd.service

これで、「プロダクトバックログカード」メニュー項目が動作して、PDFファイルを保存するためのファイルダイアログが開くようになり、問題は解決しました。


導入後発生問題

問題1: かんばんタスクの色の設定値が反映されない

ユーザーの個人設定の画面に追加された「バックログ」設定項目で「タスクの色」を変更しても、かんばん画面で表示されるタスクの背景色に反映されない問題が発生しました。


Redmineのログを解析するため、一時的にログレベルを変更しました。

  1. Redmineのディレクトリーで以下のファイルを開く

    # vi config/environments/production.rb
  2. ログレベルを変更

    # frozen_string_literal: true
    
    Rails.application.configure do
    ...
      # ログレベルを変更
      config.log_level = :debug
    end
  3. Redmineを起動しているWebサーバー(Apache)を再起動

    # systemctl restart httpd.service

ログを解析すると、Redmineのデータベース(この環境ではPostgreSQL)に変更後の値ではなく、変更前の値が再度保存されていました。データベースにログインして直接確認してみても、該当のフィールドに新しい値が入っていません。

この問題はプラグインのバグと考えられるため、これ以上調査に時間を費やすことはやめて、データベースのタスクの色の設定値を直接変更するシェルスクリプトを作成して、ユーザーに提供することにしました。

このとき作成したシェルスクリプトを以下に示します。

  • 使用方法

    backlogs_task_color <Redmineのlogin名> <カラーコード([#]RRGGBB 形式)>

  • 使用例

# ./backlogs_task_color admin ADFF2F
[BEFORE]
       | :backlogs_task_color: "#FF4040"+
UPDATE 1
[AFTER]
       | :backlogs_task_color: "#ADFF2F"+
#
  • スクリプトコード
#!/bin/sh


VERBOSE=0


function usage() {
	echo "使い方: `basename $0` <login名> <カラーコード([#]RRGGBB 形式)>"
	exit
}

function sql() {

	PATTERN='backlogs'
	if [ $VERBOSE -ne 0 ]
	then
		PATTERN='.'
	fi


	echo "[BEFORE]"

	sudo -i -u postgres psql -d redmine \
             -c "\pset pager off" \
             -c "SELECT login,others FROM user_preferences, users WHERE users.id=user_preferences.user_id AND users.login='$1'" | grep "$PATTERN"


	sudo -i -u postgres psql -d redmine \
             -c "UPDATE user_preferences p
		 SET others = regexp_replace(p.others, ':backlogs_task_color: \"[^\"]*\"', ':backlogs_task_color: \"$2\"')
		 FROM users
		 WHERE p.user_id=users.id AND users.login='$1';"


	echo "[AFTER]"

	sudo -i -u postgres psql -d redmine \
             -c "\pset pager off" \
             -c "SELECT login,others FROM user_preferences, users WHERE users.id=user_preferences.user_id AND users.login='$1'" | grep "$PATTERN"

}


if [ $# -ne 2 ]
then
	usage
fi

if [ `echo "$2" | sed -e 's/^#//' -e 's/[0-9A-F]/0/g'` != '000000' ]
then
	usage
fi

LOGIN="$1"
RGB="$2"

if [ `echo "$2" | cut -b1` != '#' ]
then
	RGB="#${RGB}"
fi

sql $LOGIN $RGB

概要

UNC Autolink plugin4は、チケットやWikiの文章入力フィールドにUNC形式でWindowsファイル共有へのパスを記載すると、自動的にリンクが生成され、Webブラウザーからのクリックでファイルが開けるようになります。 UNCとは以下の形のパス表記です。

\\servername\folder

また、パスに空白文字を含んでいる場合は、このプラグインでは< >で括って表記します。

<\\servername\folder name1\folder name2>

導入理由

ユーザーがこのプラグインを希望した理由は、Redmineの画面に表示させている、共有ファイルサーバー上のファイルパスを開くのに、パスをコピー&ペーストして開くのが手間となっているため、リンクで直接開けるようにしたいということでした。

もともと redmine_wiki_unc という同等機能の別プラグインを要望されていましたが、Redmine 4で動作することを事前調査で確認できませんでした。そのため、対応が明記されていたこのプラグインを代替としてユーザーに提案し、了承を得ました。


導入方法

このプラグインは、以下の手順により導入できます。

  1. Redmineの導入ディレクトリーに移動
    # cd /path/to/Redmine
  2. プラグインファイルを取得
    # git clone https://github.com/preciousplum/redmine_unc_autolink plugins/redmine_unc_autolink
  3. Redmineを起動しているWebサーバーを再起動
    # systemctl restart httpd.service

導入時発生問題

問題1: Webブラウザー側の制限によりUNCリンクが開けない

UNC Autolink pluginが自動生成したUNCリンクをGoogle Chromeからクリックしても、リンク先のフォルダーを開くことができませんでした。


原因は、現在の主要なWebブラウザーでは、セキュリティ上の理由からUNCリンクを直接開く機能が提供されていないためでした。

この問題に対する対応方法はWebブラウザーによって異なりますが、ユーザーの使用するWebブラウザーはGoogle Chromeであったため、Google Chrome用の対応をサポートしました。

対応内容は以下になります。

  1. Windows上のGoogle Chromeに拡張機能「Open local folder by explorer」をインストールする。
  2. 「Open local folder by explorer」の設定画面の説明のとおり、Node.js LTS版の導入、関連ファイルの配置、レジストリ登録を行ってGoogle Chromeを再起動する。
  3. 「Open local folder by explorer」に対する拡張機能の設定として、以下を確認する。
    • 「以下のサイトで自動的にアクセスを許可する」が有効であること
    • 「ファイルの URL へのアクセスを許可する」が有効であること

この対応により、Google ChromeからUNCリンクが開けるようになりましたが、操作方法に制限がありました。この拡張機能を使っても、Redmine上のUNCリンクを左クリックして直接開くことはできませんでした。代わりに、UNCリンクを右クリックしたときのメニューから、「リンク先をExplorerで開く(ローカルファイルの場合)」を選択することで、UNCのフォルダーまたはファイルのあるフォルダーをエクスプローラーで開くことができました。


おわりに

Redmineのプラグイン導入対応についての説明はいかがだったでしょうか。

便利なプラグインですが、使いたいプラグインがRedmine本体バージョンに対応しておらず、利用できないことがあるかもしれません。しかし、Redmineには多くのプラグインが提供されているため、同等機能のものや、代替となる似た機能のものが代わりに見つかるかもしれません。見つからないと思っても、どのような理由からそのプラグインを使いたいと思ったのかというところ立ち戻り、別の解決方法を考えてみると、目的にかなうプラグインを発見できる可能性があります。これらRedmineのプラグインは、Redmine公式ページに登録されたプラグインの紹介ページや、インターネット上の検索などで探すことができます。

本記事が今後のあらたなRedmine利用の助けとなれれば幸いです。

Footnotes

  1. Redmine Backlogs(ソースリポジトリ(ayapapa版redmine4ブランチ))

  2. オリジナル版Redmine Backlogs導入手順

  3. Redmineプラグインの一般的な導入手順

  4. UNC Autolink plugin(ソースリポジトリ)


TOP
アルファロゴ 株式会社アルファシステムズは、ITサービス事業を展開しています。このブログでは、技術的な取り組みを紹介しています。X(旧Twitter)で更新通知をしています。