はじめに
RedmineはRuby on Railsで実装されたプロジェクト管理ツールです。競合のツールとしてTracが有名ですが,Tracと比較して開発速度が早く,ここ数年で急激にユーザを増やしています。Tracには標準で用意されていない機能として,ガントチャートの表示や複数プロジェクトの管理,チケットの種別ごとのワークフローのカスタマイズ機能に加え,最新の0.9系ではTracに比べて唯一貧弱だったチケットのレポーティング機能がほぼ同等レベルまで強化されました。
これにより今年から本格的にRedmineへの移行が始まっていくと思われます。既に2009年の9月にはオープンソースのSNSエンジンであるOpenPNEの開発チームがTracからRedmineに移行したことや,Googleトレンドの検索数でRedmineがTracを追い抜いたというニュースもあります。
今回は,Redmineのプラグインの開発について解説していきます。Redmineは記事執筆時点での最新安定版であるバージョン0.9.3を使っています。
Redmineのインストール
Redmineのインストール方法は公式サイトの記事を始め,沢山のサイトで解説されています。Passengerというソフトウェアを利用すればApache上でRedmineを稼働させることも可能ですが,ここでは最低限の手順でインストールを進めます。詳しく知りたい方は検索してみてください。
1. Redmineのダウンロード,展開
$ wget http://rubyforge.org/frs/download.php/69449/redmine-0.9.3.tar.gz $ tar zxf redmine-0.9.3.tar.gz; cd redmine-0.9.3
2. データベースの設定
$ mysql -u root -p -e 'create database redmine character set utf8'
$ cp config/database.yml.example config/database.yml
$ vi config/database.yml
※ お使いのDBMSに従ってデータベースのアカウント情報を入力して下さい。
$ RAILS_ENV=production rake db:migrate
3. migrationの実行,初期設定
$ RAILS_ENV=production rake db:migrate
$ RAILS_ENV=production rake redmine:load_default_data
※ 言語選択のプロンプトが表示されるので,「ja」と入力します。
4. アプリケーションサーバの起動
$ sudo script/server -p 80 -e production
作ってみよう
さて,それでは早速プラグインを作っていきましょう。
プラグインの開発は,以下のような流れになります。
- 雛形の作成
- プラグインの初期設定
- モデルの実装
- マイグレーションの実施
- コントローラ・ビューの実装
今回作成するプラグインの仕様
今回はServerStatusというプラグインを作ります。稼動しているサーバのステータスを一覧で確認することで,稼働/停止を切り替えられるようにします。また,ステータスの変更履歴を残すようにもしてみましょう。
雛形の作成
Redmineではプラグインの実装用に3つのジェネレータが用意されています。
- redmine_plugin
- redmine_plugin_controller
- redmine_plugin_model
雛形の作成にはredmine_pluginジェネレータを使用します。
$ ruby script/generate redmine_plugin ServerStatus
REDMINE_ROOT/vendor/plugins/redmine_server_status ディレクトリ以下に沢山のファイルが作成されるはずです。これがプラグインのルートディレクトリになります。以降はPLUGIN_ROOTと表記します。
プラグインの初期設定
PLUGIN_ROOT/init.rbを編集し,初期設定を記述します。初期設定で最も重要なのは表示メニューへの追加です。追加可能な表示箇所は以下の4つに分類されます。
- トップメニュー(top_menu)
- アカウントメニュー(account_menu)
- アプリケーションメニュー(application_menu)
- プロジェクトメニュー(project_menu)
それぞれのメニューの表示箇所を下図に表示します。なお,プロジェクトメニューはプロジェクト選択時に,アプリケーションメニューはプロジェクト非選択時に表示されます。
今回はトップメニューに追加します。メニューにはラベルとURLを指定する必要があります。URLはHashでも文字列でも構いませんが(外部サイトも指定可能です),今回はserversコントローラのindexアクションを呼び出すようにします。
init.rb
require 'redmine'
Redmine::Plugin.register :redmine_server_status do
name 'Redmine Server Status plugin'
author 'Takayuki Kyowa'
description 'Redmine Server Status plugin'
version '0.0.1'
menu :top_menu, :server_list, { :controller => 'servers', :action => 'index' }, :caption => "サーバ一覧", :last => true
end
最後のmenuメソッドでメニューへの追加先を指定しています。引数は以下のとおりです。
menu
:top_menu, # 追加先メニュー名
:server_list, # メニュー項目の識別子。一意でなければならない。
{ :controller => 'contributions', :action => 'index' }, # URLのハッシュ、または文字列。
:caption => "サーバ一覧", # メニューの項目名
:last => true # メニューの追加先。標準メニューの間や先頭に挿入することも可能です。
余談ですが,実はRedmineのメニューはMenuManagerと言うモジュールによって,標準の項目もプラグインと同様に扱われています。標準メニューの定義はREDMINE_ROOT/lib/redmine.rb の119行目の辺りから実装されています。トップメニューを定義している箇所を抜粋してみましょう。
Redmine::MenuManager.map :top_menu do |menu|
menu.push :home, :home_path
menu.push :my_page, { :controller => 'my', :action => 'page' }, :if => Proc.new { User.current.logged? }
menu.push :projects, { :controller => 'projects', :action => 'index' }, :caption => :label_project_plural
menu.push :administration, { :controller => 'admin', :action => 'index' }, :if => Proc.new { User.current.admin? }, :last => true
menu.push :help, Redmine::Info.help_url, :last => true
end
Redmine::Plugin.registerブロックのmenuメソッドはMenuManagerを呼び出すラッパーになっています。Redmineではこのような実装に共通性があり,他にも様々な機能がモジュール化されています。非常に参考になりますので,興味のある方は是非一度lib/redmine.rbを読んでみてください。

