前回のおさらいと今回の概要
前回(第34回)では初めてのプラグイン作成ということで,サーバの稼動状態を管理するServerStatusというプラグインを作りました。Redmineのプラグインは非常に柔軟性が高く,ビルトインの機能とは無関係のものを作ることも可能です。
今回はそこから一歩進んで,Redmineのチケットやアクティビティ(日本語環境では「活動」。Tracでいうタイムライン)と連動したプラグインを作ります。作成するのはデプロイをRedmine上から行い,実行結果や履歴を参照することのできるContinuousDeploymentというプラグインです。
なお,今回はプラグインを作成するにあたって,以下のようなシナリオを用意してみました。
シナリオ
あるWebサービスの開発現場では,プロジェクト管理にRedmineを,デプロイにcapistranoというツールを使用しています。
タスク管理にはRedmineのチケットを使い,デプロイはcapistranoにより1コマンドで可能でしたが,メンバーからは以下のような不満が挙がっていました。
- デプロイ前にリリース予定のチケットをディレクターがチェックするルールだったが,未チェックのままリリースされる事が多々あった。
- デプロイの履歴が管理されておらず,過去にどんなリリースがあったかを遡る際に非常に手間がかかっていた。
そこで,Redmineからデプロイ前のチケットのステータスチェック,デプロイの実行,そしてデプロイ後の履歴の作成という一連の処理を実行することのできるプラグインを作成することにしました。デプロイは「デプロイボタン」を用意し,これを押すだけでデプロイが行われるイメージです。
プラグインの仕様
まず1番の問題についてですが,チケットのワークフローは,新規 → 進行中 → 実装完了 → (ディレクターがチェックして)チェック完了 → 解決,といった流れで進んでいるとします。問題になっているのは,実装完了のステータスになっているチケットが残っている状態でデプロイすることです。そのため,実装完了となっているチケットがある場合にはデプロイできないようにします。
また,2番の問題についてはデプロイの履歴を一覧で確認できる画面を用意するほか,デプロイ後にはアクティビティにに表示されるようにしましょう。
画面イメージは以下のようになります。
雛形と初期設定
では早速作っていきましょう。まずは雛形を作成します。
$ ruby script/generate redmine_plugin ContinuousDeployment
続いて初期設定です。
init.rb
Redmine::Plugin.register :redmine_continuous_deployment do
name 'Redmine Continuous Deployment plugin'
author 'Takayuki Kyowa'
description 'Redmine Continuous Deployment plugin'
version '0.0.1'
menu :project_menu, :deploy_history, # ①
{ :controller => 'deployments', :action => 'index' },
:caption => "デプロイ", :last => true,
:param => :project_id # ②
permission :view_deploy_history, { :deployments => [ :index ] }, :public => true # ③
end
今回はメニューの追加先をプロジェクトメニューにしています(①)。プロジェクトメニューはプロジェクトの配下となる為,プロジェクトIDが必須になります。:paramオプションで:project_idを指定するとURLにプロジェクトIDが付与されます(②)。また,プロジェクトメニューはデフォルトで非表示になっているため,permissionメソッドで表示/非表示を制御します(③)。
permissionメソッドの引数解説
permission
:deploy_histories, # パーミッションの名前。パーミッション全体で一意でなければならない。
{ :deployments => [ :index ] }, # 制御対象の画面をあらわすハッシュ。menuメソッドで指定したコントローラ / アクションを指定する。
:public => true # trueにすると常に表示される。
permissionメソッドで注意しなければならないのは,publicオプションをtrueにしている場合,ログインユーザにのみプロジェクトを表示するように設定していたとしても,URLを直打ちすると見ることができてしまう,と言うことです。そのため,一般公開を目的としたプラグインを作成する場合には指定しない方が無難でしょう。指定しない場合は権限の管理画面(/roles/report)からロール毎に表示/非表示を設定します。

