Ruby Freaks Lounge

第34回 Redmineプラグイン開発(1)

この記事を読むのに必要な時間:およそ 6 分

はじめに

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

作ってみよう

さて,それでは早速プラグインを作っていきましょう。

プラグインの開発は,以下のような流れになります。

  1. 雛形の作成
  2. プラグインの初期設定
  3. モデルの実装
  4. マイグレーションの実施
  5. コントローラ・ビューの実装

今回作成するプラグインの仕様

今回はServerStatusというプラグインを作ります。稼動しているサーバのステータスを一覧で確認することで,稼働/停止を切り替えられるようにします。また,ステータスの変更履歴を残すようにもしてみましょう。

雛形の作成

Redmineではプラグインの実装用に3つのジェネレータが用意されています。

  1. redmine_plugin
  2. redmine_plugin_controller
  3. 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つに分類されます。

  1. トップメニュー(top_menu)
  2. アカウントメニュー(account_menu)
  3. アプリケーションメニュー(application_menu)
  4. プロジェクトメニュー(project_menu)

それぞれのメニューの表示箇所を下図に表示します。なお,プロジェクトメニューはプロジェクト選択時に,アプリケーションメニューはプロジェクト非選択時に表示されます。

図1 トップメニュー,アカウントメニュー,プロジェクトメニュー

図1 トップメニュー,アカウントメニュー,プロジェクトメニュー

図2 アプリケーションメニュー

図2 アプリケーションメニュー

今回はトップメニューに追加します。メニューにはラベルと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を読んでみてください。

著者プロフィール

京和崇行(きょうわたかゆき)

株式会社カカクコム所属。食べログをRailsでリニューアルした時のメンバーの一人。 今は主にサーバサイドの開発とチューニングを担当…のはずだが他にも色々やっている。 クライミングとニコニコ動画とtwitterがあれば生きていける。

コメント

  • 修正させていただきました

    対応が遅くなってしまいましたが,servers_controller.rbの記述内容を修正させていただきました。
    それでは,今後ともよろしくお願いいたします。

    Commented : #3  gihyo.jp編集部 (2010/03/31, 12:41)

  • Re:

    うえけんさんもコメントしていますが、
    app/controllers/servers_controller.rbの内容が、
    db/migrate/001_create_servers.rbと同じ内容になってます。

    正しい内容はアップされないのでしょうか?

    Commented : #2  はてな? (2010/03/30, 16:25)

  • Re:

    非常に役立つ内容で感謝しておりますが、app/controllers/servers_controller.rbの記述内容がおかしいのではないかと思います。

    Commented : #1  うえけん (2010/03/11, 12:15)

コメントの記入